WPF et Xamarin.Forms : similarités et différences
Modèles de contrôle
WPF prend en charge le concept de modèles de contrôle qui fournissent les instructions de visualisation d’un contrôle (Button
, ListBox
etc.). Comme mentionné ci-dessus, Xamarin.Forms utilise des classes de rendu concrètes pour cela qui interagissent avec la plateforme native (iOS, Android, etc.) pour visualiser le contrôle.
Toutefois, Xamarin.Forms a un ControlTemplate
type : il est utilisé pour les objets de thème Page
. Il fournit une définition pour un Page
contenu cohérent, mais permet à l’utilisateur de la page de modifier les couleurs, les polices, etc. et même d’ajouter des éléments pour le rendre unique à l’application.
Les utilisations courantes de ce type sont des éléments tels que les dialogues d’authentification, les invites et la fourniture d’une page standardisée, mais l’apparence et l’impression qu’elles peuvent être personnalisées dans l’application. Dans le cadre de cette prise en charge, de nombreux contrôles wpF connus sont utilisés :
ContentPage
ContentView
ContentPresenter
TemplateBinding
Mais il est important de savoir qu’ils ne servent pas le même objectif dans Xamarin.Forms. Pour plus d’informations sur cette fonctionnalité, consultez la page de documentation.
XAML
XAML est utilisé comme langage de balisage déclaratif pour WPF et Xamarin.Forms. Pour la plupart, la syntaxe est identique : la différence principale est les objets définis/créés par les graphiques XAML.
Xamarin.Forms prend en charge la spécification XAML 2009 ; cela facilite la définition de données telles que
string
s,int
s, etc. ainsi que la définition de types génériques et le passage d’arguments aux constructeurs.Il n’existe actuellement aucun moyen de charger dynamiquement du code XAML comme WPF avec
XamlReader
. Vous pouvez toutefois obtenir les mêmes fonctionnalités de base avec un package NuGet.
Extensions de balisage
Xamarin.Forms prend en charge l’extension xaml via des extensions de balisage, comme WPF. Hors de la boîte, il a les mêmes blocs de construction de base :
{x:Array}
{Binding}
{DynamicResource}
{x:Null}
{x:Static}
{StaticResource}
{x:Type}
En outre, il inclut {x:Reference}
à partir de la spécification XAML 2009 et une {TemplateBinding}
extension de balisage utilisée pour la version spécialisée prise ControlTemplate
en charge par Xamarin.Forms.
Avertissement
La ControlTemplate
prise en charge n’est pas la même, même si elle porte le même nom.
Xamarin.Forms prend également en charge les extensions de balisage personnalisées, mais l’implémentation est légèrement différente. Dans WPF, vous devez dériver d’une classe de MarkupExtension
base abstraite. Dans Xamarin.Forms, qui est remplacé par une interface IMarkupExtension
ou IMarkupExtension<T>
qui est plus flexible.
Tout comme WPF, la méthode obligatoire unique est une ProvideValue
méthode pour renvoyer la valeur de l’extension de balisage.
Infrastructure de liaison
L’un des principaux concepts transférés est une infrastructure de liaison de données pour connecter des propriétés visuelles aux propriétés de données .NET. Cela permet des modèles architecturaux tels que MVVM. La conception de base est identique : vous disposez d’une classe de base bindableObject, dans WPF, il s’agit de la classe DependencyObject . Cette classe de base est utilisée comme ancêtre racine pour tous les objets qui participeront en tant que cibles dans la liaison de données. Les classes dérivées exposent ensuite des objets BindableProperty qui agissent comme stockage de stockage pour les valeurs de propriété (celles-ci sont définies en tant qu’objets DependencyProperty dans WPF).
Définition des propriétés pouvant être liées
La définition d’une propriété pouvant être liée dans Xamarin.Forms est identique à WPF :
- L’objet doit dériver de
BindableObject
. - Il doit y avoir un champ statique public de type
BindableProperty
déclaré pour définir la clé de stockage de stockage pour la propriété. - Il doit y avoir un wrapper de propriétés d’instance publique qui utilise
GetValue
etSetValue
pour récupérer et modifier la valeur des propriétés.
Pour obtenir un exemple complet, consultez Propriétés pouvant être liées dans Xamarin.Forms.
Propriétés jointes
Les propriétés jointes sont un sous-ensemble de la propriété pouvant être liée et fonctionnent de la même façon que dans WPF. La principale différence est que le wrapper de propriétés est omis dans ce cas et remplacé par un ensemble de méthodes get/set statiques sur la classe propriétaire. Pour plus d’informations, consultez Propriétés jointes dans Xamarin.Forms .
Utilisation du moteur de liaison
Le processus d’utilisation du moteur de liaison est le même que dans WPF. Elle peut être utilisée dans le code-behind en créant un Binding
objet lié à un objet source (n’importe quel type .NET) et une valeur de propriété facultative (si elle est omise, elle traite l’objet source comme la propriété elle-même, comme WPF). Vous pouvez ensuite utiliser SetBinding
sur n’importe quel BindableObject
élément pour associer la liaison à un BindableProperty
.
Vous pouvez également définir la relation de liaison en XAML à l’aide du BindingExtension
fichier . Il a les mêmes valeurs de base que l’extension dans WPF.
La prise en charge et le moteur de liaison sont plus similaires à l’implémentation Silverlight que WPF. Il existe plusieurs fonctionnalités manquantes qui n’ont pas été implémentées dans Xamarin.Forms :
- Il n’existe aucune prise en charge des fonctionnalités suivantes dans les liaisons :
- BindingGroupName
- BindsDirectlyToSource
- IsAsync
- MultiBinding
- NotifyOnSourceUpdated
- NotifyOnTargetUpdated
- NotifyOnValidationError
- UpdateSourceTrigger
- UpdateSourceExceptionFilter
- ValidatesOnDataErrors
- ValidatesOnExceptions
- Collection ValidationRules
- XPath
- XmlNamespaceManager
RelativeSource
Il n’existe aucune prise en charge des RelativeSource
liaisons. Dans WPF, vous pouvez les lier à d’autres éléments visuels définis en XAML. Dans Xamarin.Forms, cette même fonctionnalité peut être obtenue à l’aide de l’extension de {x:Reference}
balisage. Par exemple, en supposant que nous avons un contrôle portant le nom « otherControl » qui a une propriété Text, nous pouvons le lier comme suit :
WPF
Text={Binding RelativeSource={RelativeSource otherControl}, Path=Text}
Xamarin.Forms
Text={Binding Source={x:Reference otherControl}, Path=Text}
La même fonctionnalité peut être utilisée pour la {RelativeSource Self}
fonctionnalité. Toutefois, il n’existe aucune prise en charge de la localisation des ancêtres par type ({RelativeSource FindAncestor}
).
Contexte de liaison
Dans WPF, vous pouvez définir une DataContext
valeur de propriété qui reprene la source de liaison par défaut. Si la source d’une liaison n’est pas définie, cette valeur de propriété est utilisée. La valeur est héritée de l’arborescence visuelle, ce qui lui permet d’être définie à un niveau supérieur, puis utilisée par les enfants.
Dans Xamarin.Forms, cette même fonctionnalité est avaialable, mais le nom de la propriété est BindingContext
.
convertisseurs de valeurs ;
Les convertisseurs de valeurs sont entièrement pris en charge dans Xamarin.Forms, tout comme WPF. La même forme d’interface est utilisée, mais Xamarin.Forms a l’interface définie dans l’espace Xamarin.Forms
de noms.
Model-View-ViewModel
MVVM est entièrement pris en charge par WPF et Xamarin.Forms.
WPF inclut une construction qui RoutedCommand
est parfois utilisée ; Xamarin.Forms ne prend pas en charge les commandes intégrées au-delà de la définition de l’interface ICommand
. Vous pouvez inclure un large éventail d’infrastructures MVVM pour ajouter les classes de base nécessaires pour implémenter MVVM.
INotifyPropertyChanged et INotifyCollectionChanged
Les deux interfaces sont entièrement prises en charge dans les liaisons Xamarin.Forms. Contrairement à de nombreuses infrastructures XAML, les notifications de modification de propriété peuvent être déclenchées sur des threads d’arrière-plan dans Xamarin.Forms (tout comme WPF) et le moteur de liaison passe correctement au thread d’interface utilisateur.
En outre, les deux environnements prennent en charge SynchronizationContext
et async
/await
effectuent un marshaling de thread approprié. WPF inclut la Dispatcher
classe sur tous les éléments visuels, Xamarin.Forms a une méthode Device.BeginInvokeOnMainThread
statique qui peut également être utilisée (bien qu’elle SynchronizationContext
soit préférée pour le codage multiplateforme).
- Xamarin.Forms inclut un
ObservableCollection<T>
qui prend en charge les notifications de modification de regroupement. - Vous pouvez utiliser
BindingBase.EnableCollectionSynchronization
pour activer les mises à jour entre threads pour une collection. L’API est légèrement différente de la variante WPF, consultez les documents pour plus d’informations sur l’utilisation.
Modèles de données
Les modèles de données sont pris en charge dans Xamarin.Forms pour personnaliser le rendu d’une ListView
ligne (cellule). Contrairement à WPF qui peut utiliser DataTemplate
s pour n’importe quel contrôle orienté contenu, Xamarin.Forms les utilise actuellement uniquement pour ListView
. La définition du modèle peut être définie inline (affectée à la ItemTemplate
propriété) ou en tant que ressource dans un ResourceDictionary
.
En outre, ils ne sont pas aussi flexibles que leur équivalent WPF.
- L’élément racine du fichier
DataTemplate
doit toujours être unViewCell
objet. - Les déclencheurs de données sont entièrement pris en charge dans un modèle de données, mais doivent inclure une
DataType
propriété indiquant le type de la propriété à laquelle le déclencheur est associé. DataTemplateSelector
est également pris en charge, mais dérive etDataTemplate
est donc simplement affecté directement à laItemTemplate
propriété (vs.ItemTemplateSelector
dans WPF).
ItemsControl
Il n’y a pas d’équivalent intégré à une ItemsControl
version Xamarin.Forms, mais il existe une version personnalisée pour Xamarin.Forms disponible ici.
Contrôles utilisateur
Dans WPF, UserControl
s sont utilisés pour fournir une section de l’interface utilisateur qui a un comportement associé. Dans Xamarin.Forms, nous utilisons le ContentView
même objectif. Prise en charge de la liaison et de l’inclusion dans XAML.
Navigation
WPF inclut une fonctionnalité de navigation rarement utilisée NavigationService
pour fournir une fonctionnalité de navigation « de type navigateur ». Toutefois, la plupart des applications ne s’en sont pas embêtées et utilisaient plutôt des éléments différents Window
, ou des sections différentes de la fenêtre pour afficher des données.
Sur les appareils téléphoniques, différents écrans sont souvent la solution et donc Xamarin.Forms inclut la prise en charge de plusieurs formes de navigation :
Navigation Style | Type de page |
---|---|
Basé sur la pile (push/pop) | NavigationPage |
Maître/détail | MasterDetailPage |
Onglets | TabbedPage |
Balayez vers la gauche/la droite | CarouselView |
Il NavigationPage
s’agit de l’approche la plus courante, et chaque page a une Navigation
propriété qui peut être utilisée pour envoyer (push) ou afficher des pages contextuelles et hors de la pile de navigation. Il s’agit de l’équivalent le plus proche de celui NavigationService
trouvé dans WPF.
Navigation d’URL
WPF est une technologie orientée bureau et peut accepter des paramètres de ligne de commande pour diriger le comportement de démarrage. Xamarin.Forms peut utiliser la liaison d’URL approfondie pour accéder à une page au démarrage.