Partager via


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, ListBoxetc.). 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 :

  1. ContentPage
  2. ContentView
  3. ContentPresenter
  4. 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 strings, ints, 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 :

  1. {x:Array}
  2. {Binding}
  3. {DynamicResource}
  4. {x:Null}
  5. {x:Static}
  6. {StaticResource}
  7. {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 :

  1. L’objet doit dériver de BindableObject.
  2. 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é.
  3. Il doit y avoir un wrapper de propriétés d’instance publique qui utilise GetValue et SetValue 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 BindingExtensionfichier . 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 DataTemplates 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.

  1. L’élément racine du fichier DataTemplate doit toujours être un ViewCell objet.
  2. 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é.
  3. DataTemplateSelector est également pris en charge, mais dérive et DataTemplate est donc simplement affecté directement à la ItemTemplate 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, UserControls 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.

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.