Passer au contenu principal
Version : 11.0.0

Comparaison entre WPF et UWP

Initialement basé sur UWPvsWPF.md avec des modifications spécifiques à Avalonia.

Ce document est sous licence CC BY-SA 4.0. Pour le texte complet de cette licence, voir : https://creativecommons.org/licenses/by-sa/4.0/legalcode

Cette section liste les principales différences (principalement du point de vue de XAML) entre Avalonia, UWP et WPF.

Légende :

  • ✔ Indique que la plateforme (définie par la colonne Avalonia, WPF ou UWP) possède la fonctionnalité
  • ✖ Indique que la fonctionnalité est généralement absente de la plateforme
  • ⚡ Indique que la fonctionnalité est seulement partiellement implémentée par rapport aux autres plateformes

Extensions des balises

SujetAvaloniaWPFUWPNotes
x:Uid pour la localisationx:uid est un système de localisation puissant similaire à ce qui existe dans Windows Forms. WPF manque cruellement de ce type de support de localisation. C'est un avantage clair de UWP.
x:Bindx:Bind est également devenu une fonctionnalité puissante de UWP par rapport à WPF. Les liaisons compilées peuvent être utilisées pour presque tout et peuvent remplacer d'autres fonctionnalités manquantes comme MultiBinding. D'autres avantages incluent le support du débogage ainsi qu'une performance accrue.
x:Arrayx:Array n'est pas supporté en UWP.
x:Staticx:Static pourrait être remplacé par x:Bind
x:Type
x:True
x:False
Extension de balisage completUWP n'implémente qu'un sous-ensemble du support complet des extensions de balisage dans WPF. Ce domaine doit être élargi à l'avenir.
Bindings compilés

Binding

SujetAvaloniaWPFUWPNotes
OneWayToSource BindingMode
Binding to ConverterParameter
MultiBinding / IMultiValueConverterUne fonctionnalité très utile dans WPF pour des scénarios de liaison avancés n'existe plus pour UWP. UWP dispose cependant de la liaison fonctionnelle avec x:Bind (Utilisé pour réimplémenter la logique du convertisseur).
ICommandBien que l'interface existe techniquement, ICommand n'est rien de comparable à ce qu'elle était dans WPF. Le programmeur est désormais responsable de chaque petite partie de la commande. Cela a été amélioré dans la version 1809 de Windows 10, qui a ajouté XamlUICommand et StandardUICommand.
RelativeSource / AncestorTypePas aussi puissant dans UWP, la source relative ne prend en charge que {RelativeSource Self} et {RelativeSource TemplatedParent} par rapport à des expressions plus puissantes dans WPF comme {RelativeSource PreviousData} ou {Binding RelativeSource={RelativeSource Mode=PreviousData, AncestorType={x:Type TextBox}}.
StringFormatLe XAML tel que {Binding DateValue, StringFormat=Date: {0:dddd yyyy-MM-dd}} n'est pas pris en charge dans UWP et nécessite des convertisseurs personnalisés.
Fonctions pour le bindingx:Bind dans UWP prend en charge la liaison de fonction OneWay et TwoWay qui peut remplacer les convertisseurs.

Style

SujetAvaloniaWPFUWPNotes
DataTriggers / PropertyTrigger / EventTrigger dans Style.Triggers
VisualStateManagerUn concept différent de WPF qui remplace les DataTriggers, cela est très verbeux et augmente souvent la complexité par rapport aux déclencheurs de données. @Felix-Dev VisualStateManager existe dans WPF (il a été ajouté dans .NET Framework 4.0). Ce n'est pas aussi élégant que dans UWP, c'est-à-dire qu'il n'a pas de propriété VisuaStateManager.Setters. Cela signifie que vous devez utiliser des Storyboards pour définir vos valeurs.
DataTemplate impliciteDéfinissez la propriété DataType du DataTemplate au type correspondant et le modèle est ensuite appliqué automatiquement à toutes les instances de ce type particulier.
Binding dans un setter de StyleTout autre que TemplateBinding n'est pas pris en charge dans un modèle/style au sein de UWP.
BasedOn Style par défautBasedOn={StaticResource {x:Type TextBlock} n'est pas pris en charge dans UWP mais fonctionne dans WPF. Au lieu de cela, BasedOn nécessite l'utilisation d'une clé, ce qui pose problème car tous les styles par défaut n'en définissent pas. C'est un exemple spécifique de l'extension de balisage x:Type manquante dans UWP.

Autre

SujetAvaloniaWPFUWPNotes
CoercitionLa coercition des propriétés de dépendance n'est pas prise en charge dans UWP.
Validation des données (Input)L'ensemble du système de validation des données WPF, y compris les classes/interfaces : ValidationRule (et toutes les implémentations standard), Binding.ValidationRules, IDataErrorInfo, INotifyDataErrorInfo, Binding.ValidatesOnNotifyDataErrors, etc. n'est pas implémenté dans UWP. Cela sera ajouté dans WinUI 3.0, mais l'histoire de son utilisation dans le modèle d'application UWP avec WinUI 3.0 est moins claire.
x:TypeArgumentsLa directive TypeArguments n'est pas implémentée dans UWP, ce qui pose des problèmes avec les génériques. Le manque de cela nécessite quelques solutions de contournement avec des classes et la création d'une classe non générique à utiliser dans XAML à partir d'une classe générique.
UIElement.IsVisible / IsVisibleChangedUWP n'a aucun moyen de suivre quels contrôles sont réellement visibles sur l'affichage. WPF a la propriété UIElement.IsVisible et l'événement IsVisibleChanged. Cela entrave la capacité d'optimiser les contrôles pour les performances.
UIElement.Visibility / Visibility.HiddenUWP n'inclut pas la valeur d'énumération Visibility.Hidden utilisée pour UIElement.Visibility. Hidden dans WPF permettait à un contrôle d'être encore utilisé dans la mesure/la mise en page mais d'apparaître invisible lorsqu'il était rendu pour l'affichage.
UIElement.ClipWPF et UWP ont tous deux des propriétés UIElement.Clip. Cependant, WPF peut prendre n'importe quelle géométrie permettant un découpage non rectangulaire. UWP ne peut utiliser qu'une RectangleGeometry pour le découpage. WPF: public Geometry UIElement.Clip, UWP: public RectangleGeometry UIElement.Clip
UIElement.ClipToBoundsDans WPF, il est possible de découper le contenu enfant aux limites du parent en définissant ClipToBounds sur True. UWP n'a pas du tout cette propriété. La solution de contournement consiste à utiliser UIElement.Clip, qui ne peut effectuer que des découpes rectangulaires.
LayoutTransformLa transformation de mise en page est nécessaire pour transformer les éléments avant la mise en page. Cela permet de changer facilement la direction du textbox et de l'insérer ensuite dans un tableau. RenderTransform, qui s'applique après la mise en page, ne redimensionne pas les contrôles parents pour les enfants transformés.
VisualBrush / DrawingBrushVisualBrush n'est pas un pinceau XAML dans UWP. Au lieu de cela, il faut recourir aux pinceaux de composition qui ne sont pas équivalents 1:1. DrawingBrush n'est pas du tout pris en charge dans UWP.
Formes supplémentaires : Arrow, Callout, Star, etcPlusieurs formes présentes dans WPF manquent dans UWP.
OrnementsPrésentation des ornements
ThicknessLa structure Thickness expose des champs pour le Haut, le Bas, la Gauche et la Droite au lieu de propriétés de dépendance comme dans WPF. Cela signifie que vous ne pouvez pas lier ou assigner des ressources à un paramètre d'épaisseur individuel.
Size / Rect / PointSize, Rect et Point sont entièrement pris en charge à la fois dans WPF et UWP. Cependant, UWP utilise des types de float à précision simple pour les propriétés au lieu de double dans WPF. Cela crée une incompatibilité lors du portage de code.
ItemsControl.AlternationIndex / ItemsControl.AlternationCountWPF a un moyen facile de changer le style des éléments dans une liste en utilisant ItemsControl.AlternationIndex et ItemsControl.AlternationCount. Cela permet, par exemple, de changer la couleur de fond d'un élément listé pour les entrées paires/impaire. UWP ne prend pas du tout en charge cela dans aucun des contrôles. La solution partielle dans UWP consiste à créer un nouveau contrôle dérivant de l'implémentation du framework et à remplacer la méthode PrepareContainerForItemOverride().
Curseur personnalisé au runtime
Anti-aliasing pour les sous-pixelsL'anti-aliasing dans UWP, ainsi que le rendu en général, est médiocre par rapport à WPF. On suppose que cela est dû à des raisons de performance sur les appareils mobiles et le web (Silverlight).
Types imbriqués dans XAMLL'imbrication de différents types dans XAML n'est généralement pas possible dans UWP. Un code tel que <ListBox.ItemsSource><x:Array><s:string>foo<s/:string><x/:Array></ListBox.ItemsSource> fonctionne dans WPF mais pas dans UWP.
Tunnelisation d'événements / Propagation d'événements / Événements routésBeaucoup plus d'événements sont simplement directs dans UWP. Certains cas de propagation d'événements tels que ButtonBase.Click vers le parent ne sont pas pris en charge dans UWP. La tunnelisation d'événements, un concept entièrement pris en charge dans WPF, n'est pas du tout supportée dans UWP.
WindowPour certaines bonnes raisons, UWP n'a pas de concept de fenêtre. Cela convient aux appareils mobiles mais peut poser problème pour des applications de bureau pures. Sans fenêtre, il n'y a aucun moyen de contrôler la taille ou la position d'une application. Il y a actuellement des propositions pour ajouter cela dans la transition vers WinUI 3.0.

Contrôles

Cette section décrit les différences dans les contrôles dans WPF standard et UWP (avec la bibliothèque WinUI 2.x). Elle exclut certaines primitives et formes (Ellipse, Rect, etc.).

AvaloniaWPFUWPNotes
AppBarButton
AppBarSeparator
AppBarToggleButton
AutoCompleteBoxAutoSuggestBoxAutoCompleteBox ne prend pas en charge les événements de requête
BorderBorderBorder
BulletDecoratorBulletDecorator
ButtonButtonButton
CalendarDatePickerDatePickerCalendarDatePickerLe sélecteur de date UWP est différent du sélecteur de date WPF. Le sélecteur de date WPF est plus proche du CalendarDatePicker UWP en termes de fonctionnalité.
CalendarCalendarCalendarView
CanvasCanvasCanvas
CaptureElement
CheckBoxCheckBoxCheckBox
ColorPickerColorPicker
ComboBoxComboBoxComboBox
ToolBarCommandBar
CommandBarFlyoutIntroduit pour la première fois dans Windows UI Library
ContentControlContentControlContentControl
ContentPresenterContentPresenter
DataGridDataGridDisponible pour UWP dans Windows Community Toolkit (bien qu'avec de nombreux bugs)
DatePickerDatePickerUn sélecteur pour choisir une date sans vue de calendrier n'existe pas dans WPF.
DatePickerFlyoutDatePickerFlyout
DockPanelDockPanelDisponible pour UWP dans Windows Community Toolkit
DocumentViewer
DropDownButtonDropDownButtonIntroduit pour la première fois dans Windows UI Library
ExpanderExpanderDisponible pour UWP dans Windows Community Toolkit
CarouselFlipView
FlowDocumentPageViewer
FlowDocumentReader
FlowDocumentScrollViewer
FlyoutFlyout
FrameFrame
GridGridGrid
GridSplitterGridSplitterDisponible pour UWP dans Windows Community Toolkit
GridViewGridView
GroupBox
Hub
HubSection
HyperlinkButtonHyperlinkButton
ImageImageImage
InkCanvasInkCanvas
InkToolbar
ItemsControlItemsControlItemsControl
ItemsPresenterItemsPresenterItemsPresenter
ItemsRepeaterItemsRepeaterIntroduit pour la première fois dans Windows UI Library
LabelLabelPour la compatibilité avec Windows Forms
ListBoxListBoxListBox
ListViewListView
MapControl
MaskedTextBoxDisponible pour UWP via TextBoxExtensions dans Windows Community Toolkit
MediaElement
MediaTransportControls
MenuMenuMenuBarIntroduit pour la première fois dans Windows Community Toolkit puis dans Windows UI Library
ContextMenuContextMenuMenuFlyout
NavigationView
NumericUpDownPanelNumberBoxNumberBox est disponible dans WinUI 2 / 3
PanelPanel
ParallaxView
TextBox (PasswordChar)PasswordBoxPasswordBox
PersonPicture
TabControlTabControlPivot
TabItemTabItemPivotItem
PopupPopupPopup
PrintDialog
ProgressBarProgressBarProgressBar
ProgressRing
RefreshContainerPullToRefresh
RadioButtonRadioButtonRadioButton
RatingControl
RectangleRectangleRectangle
RefreshContainerIntroduit pour la première fois dans Windows UI Library
RelativePanelRelativePanel
RepeatButtonRepeatButtonRepeatButton
RichTextBoxRichEditBox
RichTextBlock
RichTextBlockOverflow
ScrollBarScrollBarScrollBar
ScrollContentPresenterScrollContentPresenterScrollContentPresenter
ScrollViewerScrollViewerScrollViewer
SelectableTextBlockLe TextBlock UWP a une propriété IsTextSelectionEnabled
SemanticZoom
SeparatorSeparatorMenuFlyoutSeparator
SliderSliderSlider
SplitButtonSplitButtonIntroduit pour la première fois dans Windows UI Library
SplitViewSplitView
StackPanelStackPanelStackPanel
StatusBarCe n'est plus une convention UI
SwipeControlIntroduit pour la première fois dans Windows UI Library
TabViewIntroduit pour la première fois dans Windows UI Library
TeachingTipIntroduit pour la première fois dans Windows UI Library
TextBlockTextBlockTextBlock
TextBoxTextBoxTextBox
TimePickerTimePicker
TimePickerFlyoutTimePickerFlyout
ToggleButtonToggleButtonToggleButton
ToggleSplitButtonToggleSplitButtonIntroduit pour la première fois dans Windows UI Library
ToggleSwitchToggleSwitch
ToolTipToolTipToolTip
TreeViewTreeViewTreeView
TwoPaneViewIntroduit pour la première fois dans Windows UI Library
VariableSizedWrapGrid
UniformGridUniformGridDisponible pour UWP dans Windows Community Toolkit
ViewboxViewboxViewbox
WebView
WrapPanelWrapPanelDisponible pour UWP dans Windows Community Toolkit
WindowWindowIl n'y a pas de concept de fenêtre de niveau supérieur dans UWP

Particularités

  • Plusieurs contrôles UWP ont des problèmes de réentrance. Par exemple, changer l'élément sélectionné pendant un événement SelectionChanged d'un ComboBox n'est généralement pas possible et entraînera un crash. Cela rend la validation directement dans le gestionnaire d'événements presque impossible.
  • Les contrôles UWP ne sont généralement pas aussi puissants que leurs homologues WPF. Par exemple, pendant plusieurs années, le ComboBox dans UWP n'était pas modifiable. Le sélecteur de date UWP ne permet également pas de taper une date spécifique.
  • UWP ne prend pas en charge la validation des données (entrée). C'est un problème majeur pour les applications de ligne de métier migrantes de WPF vers UWP qui utilisent fortement cette fonctionnalité dans les modèles de vue ou les liaisons.
  • Le système de style UWP est suffisamment différent de WPF pour nécessiter des efforts supplémentaires lors du portage. UWP utilise le VisualStateManager au lieu de concepts comme les DataTriggers ou les EventTriggers de WPF. Le style et le modèle sont l'une des principales différences.
  • Le balisage XAML ResourceDictionary dans UWP prend en charge beaucoup moins de fonctionnalités que dans WPF.
  • UWP semble suivre uniquement la spécification XAML/2006 au lieu de XAML/2009 prise en charge par WPF.
  • Plusieurs contrôles UWP sont scellés et de nouveaux contrôles ne peuvent pas en dériver.
  • Pour le rendu avancé, UWP dispose de moins de fonctionnalités intégrées. Cela nécessite de revenir plus souvent à Win2D ou à la composition.
  • Il existe plusieurs différences de namespaces entre UWP et WPF. Par exemple, WPF a System.Windows.Media.Colors tandis qu'UWP le déplace vers Windows.UI.Colors.

Avalonia XPF - Cross-Platform WPF

Take your WPF apps to macOS and Linux in minutes, not months.