Перейти к основному содержимому
Версия: 11.0.0

Сравнение WPF и UWP

Данная страница основана на UWP и WPF.md, с добавлением Avalonia.

Документ под лицензией CC BY-SA 4.0. Полный текст лицензии см. здесь.

В данном разделе перечислены основные различия (в первую очередь для XAML) между Avalonia, UWP и WPF.

Обозначения:

  • ✔ Платформа поддерживает фунционал.
  • ✖ Платформа не поддерживает фунционал.
  • ⚡ Платформа частично поддерживает** функционал.

Markup Extensions (рус: Расширение Разметки)

ЭлементAvaloniaWPFUWPЗаметки
x:Uid for localizationx:uid является мощным инструментом локализации, аналогичный в Windows Forms. WPF катастрафически не хватает поддержки локализации такого типа.
x:Bindx:Bind является мощной фишкой UWP. Скомпилированные привязки можно использовать для многих вещей, а также для замены отсутствующих возможностей, такаих как MultiBinding. Другие плюсы - поддержка отладки и повышенная производительность.
x:Arrayx:Array не поддерживается UWP.
x:Staticx:Static можно заменить на x:Bind
x:Type
x:True
x:False
Full Markup ExtensionUWP поддерживает только часть markup extension из WPF. Данный пункт нуждается в дополнии, в будущем.
Compiled Bindings

Binding (рус: Привязки)

ЭлементAvaloniaWPFUWPЗаметки
OneWayToSource BindingMode
Binding to ConverterParameter
MultiBinding / IMultiValueConverterОчень полезная функция в WPF для сложных вариантов привязки, в UWP отсутствует. Однако в нем есть x:Bind, который используется для re-implement converter logic.
ICommandТехнически, интерфейс ICommand существует, но совсем отличается от того, что в WPF. Теперь программист отвечает за каждую часть выполнения команды. Начиная с Windows 10 версии 1809, были добавлены XamlUICommand и StandardUICommand.
RelativeSource / AncestorTypeВ UWP RelativeSource поддерживает только {RelativeSource Self} и {RelativeSource TemplatedParent}.
StringFormatXAML вида {Binding DateValue, StringFormat=Date: {0:dddd yyyy-MM-dd}} не поддерживается в UWP и требует создания пользовательских преобразователей.
Functions in bindingв UWP, x:Bind поддерживает OneWay и TwoWay, которые могут заменить преобразователи.

Styling (рус: Стилизация)

ЭлементAvaloniaWPFUWPЗаметки
DataTriggers / PropertyTrigger / EventTrigger within Style.Triggers
VisualStateManagerКонцепция, заменившая в UWP DataTriggers из WPF. Довольно избыточный инструмент и чаще всего лишь увеличивает сложность разработки. @Felix-Dev VisualStateManager был добавлен для WPF в .NET Framework 4.0. Но в отличии от UWP, в нем отсутствует свойство VisuaStateManager.Setters. Это значит, что вы должны использовать Storyboards для изменения значений.
Implicit DataTemplateУстановите свойство DataType из DataTemplate соответствующего типа, чтобы шаблон автоматически применился ко всем его экземплярам.
Binding in Style setterДля UWP не поддерживается шаблон и стиль для всего, кроме TemplateBinding.
BasedOn default StyleBasedOn={StaticResource {x:Type TextBlock} не поддерживается в UWP, но работает в WPF. Но BasedOn требует использование ключа, что является проблемой, поскольку не все стили по-умолчанию определяют его. Это конкретный пример отсутствия разметки x:Type в UWP.

Остальное

ЭлементAvaloniaWPFUWPЗаметки
CoercionНе поддерживает в UWP.
Data (Input) ValidationUWP не имеет системы проверки данных. Возможно она будет добавлена в WinUI 3.0.
x:TypeArguments directiveTypeArguments не реализована в UWP, что вызывает проблемы при работе с дженериками. Для решения этой проблемы, необходимо создавать не-дженерик классы для использования в XAML.
UIElement.IsVisible / IsVisibleChangedUWP не умеет отслеживать, какие Controls отображаются на экране, это затрудняют оптимизацию Controls для повышения производительности. WPF имеет свойство UIElement.IsVisible и событие IsVisibleChanged.
UIElement.Visibility / Visibility.HiddenUWP не имеет перечисления Visibility.Hidden для UIElement.Visibility. В WPF, свойство Hidden позволяет взаимодействовать с Coontrol, но не отрисовывает его на экране.
UIElement.ClipИ WPF, и UWP имеют свойства UIElement.Clip. Однако, WPF поддерживает любую обрезку,а не только прямоугольную. Для обрезки, UWP может использовать только RectangleGeometry WPF: public Geometry UIElement.Clip, UWP: public RectangleGeometry UIElement.Clip
UIElement.ClipToBoundsВ WPF можно привязать содержимое в родительским границам, установив свойство ClipToBounds в True. UWP не имеет такие свойства. Как вариант, можно использовать UIElement.Clip, но он умеет делать только прямоугольную обрезку.
LayoutTransformLayout transform необходимо для преобразования элементов перед компоновко. Он позволяет легко поменять ориентацию TextBox, а затем поместить его в таблицу. Поскольку RenderTransform применяется после компоновки, то он не меняет размеры родительских Controls для преобразования дочерних.
VisualBrush / DrawingBrushVisualBrush - это не XAML кисть в UWP. Вместо нее, надо использовать composition brushes, которые не эквиваленты. DrawingBrush не поддерживается в UWP.
Supplemental Shapes: Arrow, Callout, Star, etcНекоторые фигуры из WPF, отсутствуют в UWP.
AdornerОбщие сведения о декоративных элементах
ThicknessСтруктура Thickness предоставляет поля Top, Bottom, Left и Right, вместо зависимых свойств в WPF. Это значит, что вы не можете привязать их к ресурсам.
Size / Rect / PointSize, Rect и Point полностью поддерживаются в WPF и UWP. Однако UWP использует типы с плавающей точкой одинарной точности, вместо double у WPF. Это создает некоторые проблемы при переносе кода.
ItemsControl.AlternationIndex / ItemsControl.AlternationCountВ WPF можно изменить стили элементов в списке с помощью ItemsControl.AlternationIndex и ItemsControl.AlternationCount. К примеру, можно изменить цвет фона для четных и нечетных записей. UWP не имеет такой поддержки. В UWP можно создать новый Control, с переопределением метода PrepareContainerForItemOverride().
Custom Cursor at runtime
Sub-pixel anti-aliasingВ отличии от WPF, UWP имеет слабую поддержку сглаживания и рендеринга в целом.
Nested Types in XAMLКак правило, UWP не поддерживает вложение различных типов в XAML. К примеру, <ListBox.ItemsSource><x:Array><s:string>foo<s/:string><x/:Array></ListBox.ItemsSource> работает в WPF, но не в UWP.
Event Tunneling / Event Bubbling / Routed EventsБольшинство событий встроены непостредственно в UWP. Некоторые событие, такие как s ButtonBase.Click у родителя, не поддерживаются в UWP. Tunneling события не поддерживаются в UWP.
WindowПо некоторым причинам, UWP не имеет концепции окна. Это замечательно для мобильных устройств, но является проблемой для настольных приложений. Без окна невозможно контролировать ни размер, ни положение приложения. На данный момент есть предложение добавить эту концепцию в WinUI 3.0

Controls

Данный раздер содержит различия между ванильной WPF и UWP (с библиотекой WinUI 2.x), из него испобчены некоторые примитивы и фигуры (Ellipse, Rect и т.д.)

AvaloniaWPFUWPЗаметки
AppBarButton
AppBarSeparator
AppBarToggleButton
AutoCompleteBoxAutoSuggestBoxAutoCompleteBox не поддерживает очередь событий.
BorderBorderBorder
BulletDecorator
ButtonButtonButton
CalendarDatePickerDatePickerCalendarDatePickerDatePicker отличается в UWP и WPF. По функциональности, WPF DatePicker ближе к UWP CalendarDatePicker.
CalendarCalendarCalendarView
CanvasCanvasCanvas
CaptureElement
CheckBoxCheckBoxCheckBox
ColorPicker
ComboBoxComboBoxComboBox
ToolBarCommandBar
CommandBarFlyoutВпервые добавлен в Windows UI Library
ContentControlContentControl
ContentPresenterContentPresenter
DataGridDataGridДоступен для UWP в Windows Community Toolkit (albeit with many bugs)
DatePickerDatePickerВ WPF не существует DatePicker без отображения Calendar
DatePickerFlyoutDatePickerFlyout
DockPanelDockPanelДоступен для UWP в Windows Community Toolkit
DocumentViewer
DropDownButtonВпервые добавлен в Windows UI Library
ExpanderExpanderДоступен для UWP в Windows Community Toolkit
CarouselFlipView
FlowDocumentPageViewer
FlowDocumentReader
FlowDocumentScrollViewer
Flyout
FrameFrame
GridGridGrid
GridSplitterGridSplitterДоступен для UWP в Windows Community Toolkit
GridView
GroupBox
Hub
HubSection
HyperlinkButton
ImageImageImage
InkCanvas
InkToolbar
ItemsControlItemsControl
ItemsPresenterItemsPresenter
ItemsRepeaterItemsRepeaterВпервые добавлен в Windows UI Library
LabelLabelДля обеспечения совместимости с Windows Forms
ListBoxListBoxListBox
ListViewListView
MapControl
MediaElement
MediaTransportControls
MenuMenuMenuBarВпервые добавлен в Windows Community Toolkit, а после в Windows UI Library
ContextMenuContextMenuMenuFlyout
NavigationView
PanelPanel
ParallaxView
TextBox (PasswordChar)PasswordBoxPasswordBox
PersonPicture
TabControlTabControlPivot
TabItemTabItemPivotItem
PopupPopupPopup
PrintDialog
ProgressBarProgressBarProgressBar
ProgressRing
PullToRefresh
RadioButtonRadioButtonRadioButton
RatingControl
RectangleRectangleRectangle
RefreshContainerВпервые добавлен в Windows UI Library
RelativePanelRelativePanel
RepeatButtonRepeatButtonRepeatButton
RichTextBoxRichEditBox
RichTextBlock
RichTextBlockOverflow
ScrollBarScrollBarScrollBar
ScrollContentPresenterScrollContentPresenter
ScrollViewerScrollViewerScrollViewer
SemanticZoom
SeparatorSeparator
SliderSliderSlider
SplitButtonВпервые добавлен в Windows UI Library
SplitViewSplitView
StackPanelStackPanelStackPanel
StatusBarNo longer a UI convention
SwipeControlВпервые добавлен в Windows UI Library
TabViewВпервые добавлен в Windows UI Library
TeachingTipВпервые добавлен в Windows UI Library
TextBlockTextBlockTextBlock
TextBoxTextBoxTextBox
TimePickerTimePicker
TimePickerFlyoutTimePickerFlyout
ToggleButtonToggleButtonToggleButton
ToggleSplitButtonВпервые добавлен в Windows UI Library
ToggleSwitchToggleSwitch
ToolTipToolTipToolTip
TreeViewTreeViewTreeView
TwoPaneViewВпервые добавлен в Windows UI Library
VariableSizedWrapGrid
ViewboxViewboxViewbox
WebView
WrapPanelWrapPanelДоступен для UWP в Windows Community Toolkit
WindowWindowВ UWP нет концепции окна верхнего уровняю

Печальные особенности

  • Некоторые UWP Controls, имеют проблему с переобределением событий. К примеру, изменение выбранного в ComboBox элемента через событие SelectionChanged, невозможно и приведет к сбою. Из-за этого невозможно проводить проверку значений непосредственно в обработчике.
  • UWP Controls, как правило, не такие гибкие, как их аналоги в WPF. К примеру, многие годы, ComboBox из UWP, был недоступен для редактирования. DatePicker из UWP, также не позволяет вводить конкретную дату.
  • UWP не поддерживает проверку вводимых данных. Это огромная проблема для бизнес-решений, которые пытаются перевести с WPF на UWP.
  • Системы стилей UWP и WPF сильно отличаются, что потребует определенных усилий при переносе. UWP использует VistualStateManger, вместо DataTriggers или EventTriggers из WPF. Стили и шаблоны - это основные отличия.
  • В UWP, XAML ResourceDictionary поддержимает меньше функций, чем в WPF.
  • Похоже UWP следует только спецификации XAML/2006, вместо XAML/2009 поддерживаемой WPF.
  • Several UWP controls are sealed and new controls cannot derive from them
  • Для расширенной отрисовки, UWP имеет меньше встроенных функций. Из-за чего требуется чаще обращаться к Win2D или же чаще перерисовывать.
  • UWP и WPF имеют различия по пространствам имен. К примеру, WPF имеет System.Windows.Media.Colors, в то время как у UWP это Windows.UI.Colors.