Partager via


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

Remarque

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 n’importe quel 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 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, d’un élément dans un dictionnaire, ou de 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 xml légal.

Infrastructure de 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 la connexion 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 Member propriété sur 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, juste 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 à la plupart des fins

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

Triple capture d’écran 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 l’arborescence visuelle d’une clé correspondante, puis recherche dans la ResourceDictionary classe de App l’application. Cela permet aux éléments d’un dictionnaire de ressources plus approfondis dans l’arborescence visuelle de remplacer un dictionnaire de ressources plus haut dans l’arborescence visuelle. Ceci 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 consiste DynamicResourceà StaticResource conserver un lien vers la clé de dictionnaire et à mettre à 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 sauvegardée par 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 de x:Null balisage pour définir une propriété sur null.

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

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

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 répond à ces exigences. Elle crée une valeur de type Color basée sur les valeurs des propriétés nommées H, S, L, et 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.