Résumé du chapitre 10. Extensions de balisage XAML

Télécharger l’exemple Télécharger l’exemple

Notes

Ce livre a été publié au printemps 2016 et n’a pas été mis à jour depuis. Il y a beaucoup dans le livre qui reste précieux, mais certains documents sont obsolètes, et certains sujets ne sont plus entièrement corrects ou complets.

Normalement, l’analyseur XAML convertit tout jeu de chaînes en tant que valeur d’attribut en type de la propriété en fonction des conversions standard pour les types de données .NET de base, ou d’un TypeConverter dérivé attaché à la propriété ou à son type avec un TypeConverterAttribute.

Mais il est parfois pratique de définir un attribut à partir d’une autre source, par exemple un élément dans un dictionnaire, ou la valeur d’une propriété ou d’un champ statique, ou à partir d’un calcul d’une sorte.

Il s’agit du travail d’une extension de balisage XAML. Malgré le nom, les extensions de balisage XAML ne sont pas une extension au format XML. XAML est toujours un code XML légal.

Infrastructure du code

Une extension de balisage XAML est une classe qui implémente l’interface IMarkupExtension . Une telle classe a souvent le mot Extension à la fin de son nom, mais apparaît généralement en XAML sans ce suffixe.

Les extensions de balisage XAML suivantes sont prises en charge par toutes les implémentations de XAML :

Ces quatre extensions de balisage XAML sont prises en charge par de nombreuses implémentations de XAML, notamment Xamarin.Forms:

Une extension de balisage XAML supplémentaire est incluse dans Xamarin.Forms en relation avec RelativeLayout:

Accès aux membres statiques

Utilisez l’élément x:Static pour définir un attribut sur la valeur d’une propriété statique publique, d’un champ ou d’un membre d’énumération. Définissez la propriété sur Member le membre statique. Il est généralement plus facile de spécifier x:Static et le nom du membre dans les accolades. Le nom de la Member propriété n’a pas besoin d’être inclus, mais uniquement le membre lui-même. Cette syntaxe courante est illustrée dans l’exemple SharedStatics . Les champs statiques eux-mêmes sont définis dans la AppConstants classe . Cette technique vous permet d’établir des constantes utilisées par le biais d’un programme.

Avec une déclaration d’espace de noms XML supplémentaire, vous pouvez référencer des propriétés statiques publiques, des champs ou des membres d’énumération définis dans le .NET Framework, comme illustré dans l’exemple SystemStatics .

Dictionnaires de ressources

La VisualElement classe définit une propriété nommée Resources que vous pouvez définir sur un objet de type ResourceDictionary. Dans XAML, vous pouvez stocker des éléments dans ce dictionnaire et les identifier avec l’attribut x:Key . Les éléments stockés dans le dictionnaire de ressources sont partagés entre toutes les références à l’élément.

StaticResource pour la plupart des besoins

Dans la plupart des cas, vous utiliserez l’extension StaticResource de balisage pour référencer un élément du dictionnaire de ressources, comme le montre l’exemple ResourceSharing . Vous pouvez utiliser un StaticResourceExtension élément ou StaticResource dans des accolades :

d’écran du partage de ressources triple du partage de ressources

Ne confondez pas l’extension de x:Static balisage et l’extension de StaticResource balisage.

Arborescence de dictionnaires

Lorsque l’analyseur XAML rencontre un StaticResource, il commence à rechercher une clé correspondante dans l’arborescence visuelle, puis recherche le dans la ResourceDictionary classe de App l’application. Cela permet aux éléments d’un dictionnaire de ressources plus profond dans l’arborescence visuelle de remplacer un dictionnaire de ressources plus haut dans l’arborescence visuelle. Cela est illustré dans l’exemple ResourceTrees .

DynamicResource à des fins spéciales

L’extension StaticResource de balisage entraîne la récupération d’un élément à partir du dictionnaire lorsqu’une arborescence visuelle est générée pendant l’appel InitializeComponent . Une alternative à StaticResource est DynamicResource, qui conserve un lien vers la clé de dictionnaire et met à jour la cible lorsque l’élément référencé par la clé change.

La différence entre StaticResource et DynamicResource est illustrée dans l’exemple DynamicVsStatic .

Une propriété définie par DynamicResource doit être adossée à une propriété pouvant être liée, comme indiqué dans le chapitre 11, L’infrastructure pouvant être liée.

Extensions de balisage moins utilisées

Utilisez l’extension x:Null de balisage pour définir une propriété sur null.

Utilisez l’extension x:Type de balisage pour définir une propriété sur un objet .NET Type .

Utilisez x:Array pour définir un tableau. Spécifiez le type des membres du tableau en définissant la propriété [Type] sur une extension de x:Type balisage.

Une extension de balisage personnalisée

Vous pouvez créer vos propres extensions de balisage XAML en écrivant une classe qui implémente l’interface IMarkupExtension avec une ProvideValue méthode .

La HslColorExtension classe satisfait à ces exigences. Il crée une valeur de type Color basée sur les valeurs des propriétés nommées H, S, Let A. Cette classe est le premier élément d’une Xamarin.Forms bibliothèque nommée Xamarin.FormsBook.Toolkit qui est créée et utilisée au cours de ce livre.

L’exemple CustomExtensionDemo montre comment référencer cette bibliothèque et utiliser l’extension de balisage personnalisée.