Résumé du chapitre 10. Extensions de balisage XAML
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 :
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
— décrit 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 en relation avec RelativeLayout
:
ConstraintExpression
— non couverts 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 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 :
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
, 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.