WPF и Xamarin.Forms: сходство и различия

Шаблоны элементов управления

WPF поддерживает концепцию шаблонов элементов управления, которые предоставляют инструкции по визуализации элемента управления (Button, ListBoxи т. д.). Как упоминание выше, Xamarin.Forms использует конкретные классы отрисовки для этого, которые взаимодействуют с собственной платформой (iOS, Android и т. д.) для визуализации элемента управления.

Однако Xamarin.Forms имеетControlTemplate тип — он используется для темных Page объектов. Он предоставляет определение для Page обеспечения согласованного содержимого, но позволяет пользователю страницы изменять цвета, шрифты и т. д. и даже добавлять элементы, чтобы сделать его уникальным для приложения.

Распространенные варианты использования таких вещей, как диалоговые окна проверки подлинности, запросы и предоставление стандартизованного вида страницы, но их можно настроить в приложении. В рамках этой поддержки используются многие знакомые элементы управления с именем WPF:

  1. ContentPage
  2. ContentView
  3. ContentPresenter
  4. TemplateBinding

Но важно знать, что они не служат той же цели в Xamarin.Forms. Дополнительные сведения об этой функции проверка на странице документации.

XAML

XAML используется в качестве декларативного языка разметки для WPF и Xamarin.Forms. В большинстве случаев синтаксис идентичен. Основное различие — это объекты, определенные или созданные графами XAML.

  • Xamarin.Forms поддерживает спецификацию XAML 2009. Это упрощает определение таких данных, как strings, ints и т. д., а также определение универсальных типов и передачу аргументов конструкторам.

  • В настоящее время нет способа динамической загрузки XAML, например WPF, с XamlReaderпомощью . Вы можете получить те же основные функциональные возможности с помощью пакета NuGet, хотя.

Расширения разметки

Xamarin.Forms поддерживает расширение XAML с помощью расширений разметки, как и WPF. Из коробки он имеет те же основные стандартные блоки:

  1. {x:Array}
  2. {Binding}
  3. {DynamicResource}
  4. {x:Null}
  5. {x:Static}
  6. {StaticResource}
  7. {x:Type}

Кроме того, он включает в себя {x:Reference} спецификацию XAML 2009 и {TemplateBinding} расширение разметки, которое используется для специализированной версии, поддерживаемой ControlTemplate Xamarin.Forms.

Предупреждение

Поддержка ControlTemplate не одинакова, даже если она имеет то же имя.

Xamarin.Forms также поддерживает пользовательские расширения разметки, но реализация немного отличается. В WPF необходимо получить производный от MarkupExtension абстрактного базового класса. В Xamarin.Forms, который заменен интерфейсом IMarkupExtension или IMarkupExtension<T> более гибким.

Как и WPF, единственный обязательный метод — это ProvideValue метод для возврата значения из расширения разметки.

Инфраструктура привязки

Одной из основных концепций является инфраструктура привязки данных для подключения визуальных свойств к свойствам данных .NET. Это позволяет использовать такие архитектурные шаблоны, как MVVM. Базовая конструкция идентична — у вас есть привязываемый базовый класс BindableObject, в WPF это класс DependencyObject. Этот базовый класс используется в качестве корневого предка для всех объектов, которые будут участвовать в качестве целевых объектов в привязке данных. Затем производные классы предоставляют объекты BindableProperty, которые служат резервным хранилищем для значений свойств (они определяются как объекты DependencyProperty в WPF).

Определение привязываемых свойств

Определение для привязываемого свойства в Xamarin.Forms совпадает с WPF:

  1. Объект должен быть производным от BindableObject.
  2. Для определения резервного ключа хранилища для свойства должно быть открытое статическое поле типа BindableProperty .
  3. Должен быть оболочка свойств общедоступного экземпляра, которая использует GetValue и SetValue извлекает и изменяет значение свойств.

Полный пример см. в разделе "Привязываемые свойства" в Xamarin.Forms.

Вложенные свойства

Присоединенные свойства представляют собой подмножество привязываемого свойства, и они работают так же, как они выполняются в WPF. Основное различие заключается в том, что оболочка свойств опущена в этом случае и заменена набором статических методов get/set в классе владения. Дополнительные сведения см . в разделе "Присоединенные свойства" в Xamarin.Forms .

Использование подсистемы привязки

Процесс использования подсистемы привязки совпадает с процессом работы в WPF. Его можно использовать в коде программной части путем создания Binding объекта, привязанного к исходному объекту (любому типу .NET) и необязательному значению свойства (если опущено, он обрабатывает исходный объект как само свойство , как и WPF). Затем можно использовать SetBinding для BindableObject связывания привязки с ней BindableProperty.

Кроме того, можно определить связь привязки в XAML с помощью .BindingExtension Он имеет те же базовые значения, что и расширение в WPF.

Поддержка привязки и подсистема более похожи на реализацию Silverlight, чем WPF. Существует несколько отсутствующих функций, которые не были реализованы в Xamarin.Forms:

  • В привязках нет поддержки следующих функций:
    • BindingGroupName
    • BindsDirectlyToSource
    • Isasync
    • MultiBinding
    • NotifyOnSourceUpdated
    • NotifyOnTargetUpdated
    • NotifyOnValidationError
    • UpdateSourceTrigger
    • UpdateSourceExceptionFilter
    • ValidatesOnDataErrors
    • ValidatesOnExceptions
    • Коллекция ValidationRules
    • XPath
    • XmlNamespaceManager

Relativesource

Нет поддержки RelativeSource привязок. В WPF они позволяют привязаться к другим визуальным элементам, определенным в XAML. В Xamarin.Forms эта же возможность может быть достигнута {x:Reference} с помощью расширения разметки. Например, если у нас есть элемент управления с именем "otherControl", имеющим свойство Text, можно привязать к нему следующее:

WPF

Text={Binding RelativeSource={RelativeSource otherControl}, Path=Text}

Xamarin.Forms

Text={Binding Source={x:Reference otherControl}, Path=Text}

Для этой функции можно использовать {RelativeSource Self} ту же возможность. Однако не поддерживается поиск предков по типу ({RelativeSource FindAncestor}).

Контекст привязки

В WPF можно определить DataContext значение свойства, которое повторяет источник привязки по умолчанию. Если источник привязки не определен, используется это значение свойства. Значение наследуется вниз визуального дерева, что позволяет определить его на более высоком уровне, а затем использовать дочерними элементами.

В Xamarin.Forms эта же функция доступна, но имя свойства — это BindingContext.

преобразователи значений;

Преобразователи значений полностью поддерживаются в Xamarin.Forms, как и WPF. Используется та же фигура интерфейса, но Xamarin.Forms имеет интерфейс, определенный Xamarin.Forms в пространстве имен.

Модель — представление — модель представления

MVVM полностью поддерживается WPF и Xamarin.Forms.

WPF включает встроенный RoutedCommand объект, в котором иногда используется; Xamarin.Forms не поддерживает встроенные команды за пределами ICommand определения интерфейса. Вы можете включить различные платформы MVVM, чтобы добавить необходимые базовые классы для реализации MVVM.

INotifyPropertyChanged и INotifyCollectionChanged

Оба интерфейса полностью поддерживаются в привязках Xamarin.Forms. В отличие от многих платформ на основе XAML, уведомления об изменении свойств можно создавать на фоновых потоках в Xamarin.Forms (как и WPF), а подсистема привязки будет правильно переходить к потоку пользовательского интерфейса.

Кроме того, обе среды поддерживают SynchronizationContext и async/await выполняют правильную маршалинг потоков. WPF включает Dispatcher класс во всех визуальных элементах, Xamarin.Forms имеет статический метод Device.BeginInvokeOnMainThread , который также можно использовать (хотя SynchronizationContext предпочтителен для кроссплатформенного программирования).

  • Xamarin.Forms включает в себя поддерживаемые ObservableCollection<T> уведомления об изменении коллекции.
  • Можно использовать BindingBase.EnableCollectionSynchronization для включения обновлений между потоками для коллекции. API немного отличается от варианта WPF, проверка документация для получения сведений об использовании.

Шаблоны данных

Шаблоны данных поддерживаются в Xamarin.Forms для настройки отрисовки ListView строки (ячейки). В отличие от WPF, который может использовать DataTemplates для любого содержимо-ориентированного элемента управления, Xamarin.Forms в настоящее время использует их только для ListViewних. Определение шаблона можно определить встроенным (назначенным ItemTemplate свойству) или как ресурс в объекте ResourceDictionary.

Кроме того, они не так гибки, как их коллега WPF.

  1. Корневой элемент объекта DataTemplate всегда должен быть ViewCell объектом.
  2. Триггеры данных полностью поддерживаются в шаблоне данных, но должны содержать DataType свойство, указывающее тип свойства, с которым связан триггер.
  3. DataTemplateSelector также поддерживается, но является производным от DataTemplate и поэтому назначается непосредственно свойству ItemTemplate (vs. ItemTemplateSelector в WPF).

ItemsControl

ItemsControl Встроенный эквивалент в Xamarin.Forms отсутствует, но здесь есть пользовательский вариант для Xamarin.Forms.

Пользовательские элементы управления

В WPF UserControlиспользуются для предоставления раздела пользовательского интерфейса, который имеет связанное поведение. В Xamarin.Forms мы используем ContentView для той же цели. Поддержка привязки и включения в XAML.

WPF включает редко используемые NavigationService функции навигации, которые можно использовать для предоставления функции навигации в браузере. Большинство приложений не беспокоятся с этим, а вместо этого использовали разные Window элементы или различные разделы окна для отображения данных.

На телефонных устройствах различные экраны часто являются решением, поэтому Xamarin.Forms включает поддержку нескольких форм навигации:

Стиль навигации Тип страницы
На основе стека (push/pop) NavigationPage
Основной/подробности MasterDetailPage
Вкладки TabbedPage
Проводите пальцем влево или вправо CarouselView

Это NavigationPage наиболее распространенный подход, и каждая страница имеет Navigation свойство, которое можно использовать для отправки или всплывающих страниц в стек навигации и от него. Это самый близкий эквивалент найденных NavigationService в WPF.

Навигация по URL-адресу

WPF — это технология, ориентированная на настольный компьютер, и может принимать параметры командной строки для прямого запуска. Xamarin.Forms может использовать глубокую ссылку ПО URL-адресу для перехода на страницу при запуске.