WPF и Xamarin.Forms: сходство и различия
Шаблоны элементов управления
WPF поддерживает концепцию шаблонов элементов управления, которые предоставляют инструкции по визуализации элемента управления (Button
, ListBox
и т. д.). Как упоминалось выше, Xamarin.Forms использует конкретные классы отрисовки для этого, которые взаимодействуют с собственной платформой (iOS, Android и т. д.) для визуализации элемента управления.
Однако Xamarin.Forms имеет ControlTemplate
тип — он используется для темных Page
объектов. Он предоставляет определение для Page
обеспечения согласованного содержимого, но позволяет пользователю страницы изменять цвета, шрифты и т. д. и даже добавлять элементы, чтобы сделать его уникальным для приложения.
Распространенные варианты использования таких вещей, как диалоговые окна проверки подлинности, запросы и предоставление стандартизованного вида страницы, но их можно настроить в приложении. В рамках этой поддержки используются многие знакомые элементы управления с именем WPF:
ContentPage
ContentView
ContentPresenter
TemplateBinding
Но важно знать, что они не служат той же цели в Xamarin.Forms. Дополнительные сведения об этой функции см . на странице документации.
XAML
XAML используется в качестве декларативного языка разметки для WPF и Xamarin.Forms. В большинстве случаев синтаксис идентичен. Основное различие — это объекты, определенные или созданные графами XAML.
Xamarin.Forms поддерживает спецификацию XAML 2009. Это упрощает определение таких данных, как
string
s,int
s и т. д., а также определение универсальных типов и передачу аргументов конструкторам.В настоящее время нет способа динамической загрузки XAML, например WPF, с
XamlReader
помощью . Вы можете получить те же основные функциональные возможности с помощью пакета NuGet, хотя.
Расширения разметки
Xamarin.Forms поддерживает расширение XAML с помощью расширений разметки, как и WPF. Из коробки он имеет те же основные стандартные блоки:
{x:Array}
{Binding}
{DynamicResource}
{x:Null}
{x:Static}
{StaticResource}
{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:
- Объект должен быть производным от
BindableObject
. - Для определения резервного ключа хранилища для свойства должно быть открытое статическое поле типа
BindableProperty
. - Должен быть оболочка свойств общедоступного экземпляра, которая использует
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
привязок. В 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, который может использовать DataTemplate
s для любого содержимо-ориентированного элемента управления, Xamarin.Forms в настоящее время использует их только для ListView
них. Определение шаблона можно определить встроенным (назначенным ItemTemplate
свойству) или как ресурс в объекте ResourceDictionary
.
Кроме того, они не так гибки, как их коллега WPF.
- Корневой элемент объекта
DataTemplate
всегда должен бытьViewCell
объектом. - Триггеры данных полностью поддерживаются в шаблоне данных, но должны содержать
DataType
свойство, указывающее тип свойства, с которым связан триггер. 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-адресу для перехода на страницу при запуске.