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 :
x:Static
pris en charge parStaticExtension
x:Reference
pris en charge parReferenceExtension
x:Type
pris en charge parTypeExtension
x:Null
pris en charge parNullExtension
x:Array
pris en charge parArrayExtension
Ces quatre extensions de balisage XAML sont prises en charge par de nombreuses implémentations de XAML, notamment Xamarin.Forms:
StaticResource
pris en charge parStaticResourceExtension
DynamicResource
pris en charge parDynamicResourceExtension
Binding
pris en charge parBindingExtension
— abordé dans le chapitre 16. Liaison de donnéesTemplateBinding
pris en charge parTemplateBindingExtension
—non couvert dans le livre
Une extension de balisage XAML supplémentaire est incluse dans Xamarin.Forms la connexion avec RelativeLayout
:
ConstraintExpression
— non couvert dans le livre
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 :
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.