Extensions de balisage et XAML

Mise à jour : novembre 2007

Cette rubrique introduit le concept des extensions de balisage pour le XAML (Extensible Application Markup Language), notamment leurs règles de syntaxe, leur finalité et le modèle d'objet de classe sous-jacent.

Cette rubrique comprend les sections suivantes.

  • Processeurs XAML et extensions de balisage
  • Syntaxe des extensions de balisage de base
  • Extensions de balisage spécifiques à WPF
  • Extensions de balisage définies par XAML
  • En savoir plus sur la syntaxe des extensions de balisage
  • Rubriques connexes

Processeurs XAML et extensions de balisage

Un processeur XAML est défini comme tout programme qui peut accepter le XAML comme langage selon ses spécifications (ou par compilation ou interprétation) et peut produire les classes sous-jacentes résultantes en vue de leur utilisation par un modèle d'objet au moment de l'exécution (également selon les spécifications XAML). Par défaut, ce processeur interprétera une valeur d'attribut comme une chaîne littérale ou il la convertira en un objet en fonction du type de l'attribut ou des convertisseurs de type spécifiques à cet attribut. Toutefois, certains scénarios peuvent parfois nécessiter un comportement différent. Par exemple, il peut être indiqué à un processeur XAML qu'une valeur d'un attribut doit plutôt être une référence à un objet déjà construit ou un objet statique. Ou bien il peut être demandé à un processeur XAML d'utiliser une syntaxe qui fournit des arguments non définis par défaut au constructeur d'un objet, ce qui est une aberration par rapport au comportement du processeur XAML spécifié par défaut.

Syntaxe des extensions de balisage de base

Une extension de balisage peut être implémentée pour fournir les valeurs des propriétés dans une utilisation d'attribut ou d'un élément de propriété, ou les deux à la fois.

Lorsqu'elle sert à fournir une valeur d'attribut, la syntaxe qui distingue une extension de balisage sur un processeur XAML correspond à la présence des accolades ouvrantes et fermantes ({ et }). Le type d'extension de balisage est alors identifié par le jeton de chaîne qui suit immédiatement l'accolade ouvrante.

Lorsqu'elle est utilisée dans la syntaxe d'un élément de propriété, une extension de balisage est visuellement identique à tout autre élément utilisé pour fournir une valeur d'élément de propriété : une déclaration d'élément XAML qui fait référence à la classe d'extension de balisage comme un élément, comprise entre les signes « inférieur à » et « supérieur à » (< >).

Extensions de balisage spécifiques à WPF

Les extensions de balisage les plus courantes utilisées pour la programmation WPF sont celles qui prennent en charge les références de ressource (StaticResource et DynamicResource) et la liaison de données (Binding).

StaticResource fournit la valeur d'une propriété XAML en substituant la valeur d'une ressource déjà définie. Pour plus d'informations, consultez StaticResource, extension de balisage.

DynamicResource fournit la valeur d'une propriété XAML en différant cette valeur pour être une référence à une ressource au moment de l'exécution. Une référence à une ressource dynamique force une nouvelle recherche à chaque fois qu'un utilisateur accède à une telle ressource. Pour plus d'informations, consultez Extension de balisage DynamicResource.

Binding fournit une valeur liée aux données pour une propriété, selon le contexte de données qui s'applique à l'élément. Cette extension de balisage est relativement complexe car elle active une syntaxe inline substantielle pour spécifier une liaison de données. Pour plus d'informations, consultez Binding, extension de balisage.

RelativeSource fournit des informations sources pour un Binding qui peut naviguer entre plusieurs relations possibles dans l'arborescence des éléments au moment de l'exécution. Cela fournit une source spécialisée pour les liaisons créées dans les modèles multi-utilisations ou créées dans le code sans connaître l'intégralité de l'arborescence d'éléments environnante. Pour plus d'informations, consultez RelativeSource, extension de balisage.

TemplateBinding permet à un modèle de contrôle d'utiliser les valeurs de propriétés basées sur des modèles provenant de propriétés définies par un modèle objet de la classe qui utilisera le modèle. Pour plus d'informations, consultez TemplateBinding, extension de balisage. Pour plus d'informations sur l'utilisation pratique de TemplateBinding, consultez Style avec ControlTemplates, exemple.

Extensions de balisage définies par XAML

Plusieurs extensions de balisage ne sont pas spécifiques à l'application WPF de XAML, mais font en fait partie de la spécification de XAML en tant que langage. Elles sont généralement identifiables par le préfixe x: dans la syntaxe, comme observé dans l'utilisation courante. L'implémentation WPF pour ces éléments de langage utilise la même classe de base MarkupExtension pour fournir l'implémentation.

Remarque :

Le préfixe x: est utilisé pour le mappage d'espace de noms XML standard de l'espace de noms XAML, dans l'élément racine d'un document ou d'une application XAML. Par exemple, les modèles Microsoft Visual Studio 2005 initialisent un fichier XAML à l'aide de ce mappage x:. Vous pouvez choisir un autre jeton de préfixe pour votre propre mappage d'espace de noms XML. Dans cette documentation, le mappage x: par défaut est toutefois considéré comme le moyen d'identification de ces entités qui sont une partie définie de l'espace de noms XAML, par opposition à l'espace de noms WPF ou à d'autres espaces de noms CLR ou XML arbitraires.

x:Type fournit l'objet Type pour le type nommé. Il est le plus fréquemment utilisé dans les styles et les modèles. Pour plus d'informations, consultez x:Type, extension de balisage.

x:Static produit des valeurs statiques à partir des entités de code de type de valeur qui ne désignent pas directement le type de la valeur d'une propriété, mais qui peuvent être évaluées en ce type. Pour plus d'informations, consultez x:Static, extension de balisage.

x:Null spécifie null en tant que valeur pour une propriété XAML. Pour plus d'informations, consultez x:Null, extension de balisage.

x:Array permet la prise en charge pour la création de tableaux généraux dans la syntaxe XAML, dans les cas où la prise en charge des collections assurée par les éléments de base et les modèles de contrôle n'est pas utilisée délibérément. Pour plus d'informations, consultez x:Array, extension de balisage.

En savoir plus sur la syntaxe des extensions de balisage

* Classes d'extension

Le comportement de chaque extension de balisage est identifié à un processeur XAML à travers une classe *Extension dérivée de MarkupExtension, et fournit une implémentation de la méthode ProvideValue. Cette méthode sur chaque extension définit l'objet renvoyé une fois l'extension de balisage évaluée. L'objet renvoyé est généralement instancié ou défini à l'aide de divers jetons de chaîne transmis à l'extension de balisage.

Par exemple, la classe StaticResourceExtension fournit l'implémentation de surface de recherche de ressource réelle afin que son implémentation ProvideValue renvoie l'objet demandé, l'entrée de cette implémentation particulière étant une chaîne utilisée pour rechercher la ressource par son x:Key. Bon nombre des détails de cette implémentation sont insignifiants si vous utilisez une extension de balisage existante.

Interprétation de la classe d'extension des jetons de chaîne suivants

Les jetons de chaîne qui suivent l'identificateur d'extension de balisage et sont toujours compris entre les accolades sont interprétés par un processeur XAML de l'une des manières suivantes :

  • Une virgule représente toujours le séparateur de jetons individuels. Par conséquent, une virgule littérale ne peut pas être transmise à une extension de balisage.

  • Si des jetons séparés individuels ne contiennent pas de signes égal, chaque jeton est traité comme un argument de constructeur. Chaque paramètre de constructeur doit être indiqué comme le type attendu par cette signature, et dans l'ordre approprié attendu par cette dernière.

    Remarque :

    Un processeur XAML doit appeler le constructeur correspondant au nombre d'argument du nombre de paires. C'est pourquoi, si vous implémentez une extension de balisage personnalisée, n'indiquez pas plusieurs paramètres avec le même nombre d'arguments ; le comportement résultant de la définition de plusieurs constructeurs d'extension de balisage avec le même nombre de paramètre est inconnu.

  • Si des jetons séparés individuels ne contiennent pas de signes égal, un processeur XAML commence alors par appeler le constructeur par défaut de l'extension de balisage. Chaque paire name=value est ensuite interprétée comme un nom de propriété existant sur l'extension de balisage, et une valeur à assigner à cette propriété.

  • S'il existe un résultat parallèle entre le comportement du constructeur et le comportement du paramètre de propriété dans une extension de balisage, peu importe le comportement que vous utilisez. L'utilisation des paires property=value est plus courante pour les extensions de balisage qui comportent plusieurs propriétés définissables, ne serait-ce que parce qu'elle rend votre balise plus intentionnelle et il est moins probable que vous transposiez des paramètres de constructeur par erreur (lorsque vous spécifiez des paires property=value, leur ordre n'est pas important). En outre, il n'est aucunement garanti qu'une extension de balisage fournisse un paramètre de constructeur définissant chacune de ses propriétés définissables. Par exemple, Binding est une extension de balisage, avec de nombreuses propriétés définissables par le biais de l'extension au format property=value, mais Binding prend en charge deux constructeurs seulement : un constructeur par défaut et un autre qui définit un chemin d'accès initial.

Éviter les accolades littérales

La gestion des attributs dans un processeur XAML utilise les accolades comme indicateurs d'une extension de balisage. Il est également possible, si nécessaire, de produire une valeur de caractère pour un attribut d'accolade littérale en entrant une séquence d'échappement à l'aide d'une paire d'accolades vide, suivie par l'accolade littérale. Consultez {}, séquence d'échappement/extension de balisage.

Imbrication de la syntaxe d'extensions

L'imbrication de plusieurs extensions de balisage est prise en charge et chaque extension de balisage sera d'abord évaluée le plus profondément, par exemple :

<Setter Property="Background"

Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />

En savoir plus sur les extensions de balisage et la syntaxe des éléments de propriété

Lorsqu'elle est utilisée comme un élément objet qui renseigne une valeur d'élément de propriété, une classe d'extension de balisage est visuellement indiscernable d'un élément ordinaire qui peut être utilisé en XAML. La différence pratique entre un élément ordinaire et une extension de balisage dans cette circonstance réside dans le fait que l'extension de balisage est évaluée en une valeur typée ou différée comme une expression, et par conséquent, les mécanismes de toutes erreurs de type possibles de valeurs de propriété seront différents et s'apparenteront au traitement d'une propriété à liaison tardive dans d'autres modèles de programmation. Un élément ordinaire sera évalué en un type par rapport à la propriété qu'il définit immédiatement à la compilation.

La plupart des extensions de balisage, si elles sont utilisées dans la syntaxe d'un élément objet pour renseigner un élément de propriété, ne comporteront pas de contenu ni aucune autre syntaxe d'élément de propriété. Par conséquent, vous devriez fermer la balise de l'élément objet et n'indiquer aucun élément enfant. Chaque fois qu'un processeur XAML rencontre un élément objet, le constructeur de cette classe est appelé pour instancier l'objet créé à partir de l'élément analysé. Une classe d'extension de balisage n'est aucunement différente ; par conséquent, si vous souhaitez que votre extension de balisage soit utilisable dans la syntaxe de l'élément objet, vous devez indiquer un constructeur par défaut. Certaines extensions de balisage existantes ont au moins une valeur de propriété requise qui doit être spécifiée pour une initialisation effective et, dans ce cas, cette valeur de propriété est généralement indiquée comme un attribut de propriété sur l'élément objet. Les extensions de balisage comportant des propriétés requises (et les noms de ces propriétés) seront notées dans les pages de référence Fonctionnalités de langage pour les espaces de noms XAML (x:) et Extensions XAML des espaces de noms WPF. Ces pages indiqueront également si la syntaxe des éléments objet ou des attributs est rejetée pour des extensions de balisage particulières. Il convient d'attirer l'attention sur le cas x:Array, extension de balisage, qui ne peut pas prendre en charge la syntaxe d'attribut car le contenu de ce tableau doit être spécifié. Le contenu des tableaux étant géré comme des objets généraux, aucun convertisseur de type par défaut de l'attribut ne peut alors être exécuté. Par ailleurs, x:Array, extension de balisage requiert un paramètre Type.

Voir aussi

Concepts

Vue d'ensemble du langage XAML

Référence

StaticResource, extension de balisage

Binding, extension de balisage

Extension de balisage DynamicResource

x:Type, extension de balisage

Autres ressources

Fonctionnalités de langage pour les espaces de noms XAML (x:)

Extensions XAML des espaces de noms WPF