Terminologie de la syntaxe XAML

Mise à jour : novembre 2007

Cette rubrique définit les termes utilisés pour décrire les éléments de syntaxe XAML (Extensible Application Markup Language). Ces termes sont fréquemment utilisés dans le reste de ce Kit de développement logiciel (SDK). Cette rubrique décrit plus en détail la terminologie de base introduite dans Vue d'ensemble du langage XAML.

Cette rubrique comprend les sections suivantes.

  • Origine de la terminologie de la syntaxe XAML
  • Syntaxe des éléments objet
  • Syntaxe d'attribut
  • Syntaxe des éléments de propriété
  • Syntaxe de contenu XAML
  • Propriétés attachées
  • Événements attachés
  • Espaces de noms XML
  • Extensions de balisage
  • Utilisations facultatives et non recommandées de XAML
  • Rubriques connexes

Origine de la terminologie de la syntaxe XAML

La terminologie de la syntaxe XAML présentée ici est également définie ou mentionnée dans la spécification du langage XAML. Le XAML est un langage reposant sur XML et qui suit des règles structurelles XML. Une partie de la terminologie est partagée avec ou repose sur la terminologie communément utilisée pour décrire le langage XML ou le DOM (Document Object Model) XML.

Syntaxe des éléments objet

La syntaxe des éléments objet est la syntaxe de balise XAML qui instancie une structure ou une classe Common Language Runtime (CLR) en déclarant un élément XML. Cette syntaxe ressemble à la syntaxe des éléments d'autres langages de balisage, tels que HTML. La syntaxe des éléments objet commence par le signe « inférieur à » (<), immédiatement suivi par le nom du type de classe ou de structure instanciée. Un zéro ou d'autres espaces peuvent suivre le nom du type, et un zéro ou d'autres attributs peuvent également être déclarés dans l'élément objet, avec un ou plusieurs espaces séparant chaque paire nom d'attribut="valeur". Enfin, l'une des conditions suivantes doit être satisfaite :

  • L'élément et la balise doivent être fermés par une barre oblique (/), suivie immédiatement par le signe « supérieur à » (>).

  • La balise ouvrante doit être complétée par le signe « supérieur à » (>). D'autres éléments objet, éléments de propriété ou texte interne peuvent suivre cette balise. Le contenu pouvant précisément se trouver ici est généralement déterminé par le modèle objet de l'élément ; consultez la section « Syntaxe de contenu » dans cette rubrique. La balise fermante équivalente de l'élément objet doit également exister et elle doit être correctement imbriquée et équilibrée avec les autres paires de balises ouvrantes et fermantes.

L'exemple suivant illustre la syntaxe d'un élément objet qui instancie une nouvelle instance de la classe Button et spécifie également un attribut Name et la valeur de cet attribut :

<Button Name="CheckoutButton"/>

L'exemple suivant illustre la syntaxe d'un élément objet qui comprend également la syntaxe de la propriété du contenu XAML (Extensible Application Markup Language). Le texte interne qui y est contenu sera utilisé pour définir la propriété du contenu TextBox XAML (Extensible Application Markup Language), Text.

<TextBox>This is a Text Box</TextBox>

Syntaxe d'attribut

La syntaxe d'attribut désigne la syntaxe de la balise XAML, qui définit la valeur d'une propriété ou nomme le gestionnaire d'un événement, en déclarant un attribut sur un élément. L'élément est toujours déclaré dans la syntaxe de l'élément objet. Le nom d'attribut doit correspondre au nom membre CLR d'une propriété ou d'un événement. Il est suivi d'un opérateur d'assignation (=). La valeur d'attribut doit être une chaîne comprise entre deux guillemets (").

Pour être définie dans la syntaxe d'attribut, une propriété doit être publique et accessible en lecture-écriture, et son type valeur doit pouvoir être instancié ou référencé par un processeur XAML. L'événement, quant à lui, doit être public et doit avoir un délégué public. La propriété ou l'événement doit être membre de la classe ou de la structure instanciée par l'élément objet contenant.

La valeur d'attribut est renseignée de l'une des manières suivantes, en suivant cet ordre de traitement :

  1. Si le processeur XAML rencontre une accolade, ou un élément objet dérivé de MarkupExtension, l'extension de balisage référencée est alors évaluée en premier, plutôt que d'être traitée comme une chaîne, et l'objet qu'elle renvoie est utilisé. Dans de nombreux cas, l'objet renvoyé par une extension de balisage sera non pas un nouvel objet, mais une référence à un objet existant ou une expression qui reporte l'évaluation jusqu'au moment de l'exécution.

  2. Si la propriété est déclarée avec un TypeConverter désigné ou le type valeur de cette propriété est déclaré avec un TypeConverter attribué, la valeur de chaîne de l'attribut est soumise au convertisseur de type comme une entrée de conversion et ce dernier renverra une nouvelle instance d'objet.

  3. S'il n'existe aucune TypeConverter, une conversion directe dans le type de propriété est tentée. Ce dernier niveau consiste en une conversion directe entre types de primitives ou un contrôle des noms dans une énumération (qui renvoie les valeurs correspondantes).

Par exemple, en utilisant la même balise que précédemment, l'exemple suivant illustre la syntaxe d'attribut utilisée pour assigner une valeur de chaîne de la propriété Name :

<Button Name="CheckoutButton"/>

La propriété Name est membre de la table des membres de la classe Button. Button est une classe dérivée de la classe FrameworkElement, qui définit Name.

Traitement des valeurs d'attribut

La valeur de chaîne contenue entre les guillemets ouvrants et fermants est traitée par un processeur XAML. Pour les propriétés, le comportement de traitement par défaut est déterminé par le type de la propriété CLR sous-jacente. Si la propriété est un type de primitive, la valeur d'attribut est alors assignée selon la conversion implicite de la chaîne dans le type de primitive adéquat. Si la propriété est une énumération, la chaîne est alors traitée comme un nom défini par cette énumération et la valeur correspondante est renvoyée à partir de celle-ci. Si la propriété n'est pas un type de primitive ou une énumération, la valeur d'attribut doit alors être gérée par un convertisseur de type déclaré sur la propriété proprement dite ou sur le type de destination. Le convertisseur de type doit fournir une conversion qui accepte une chaîne et doit donner une instance du type de la propriété CLR sous-jacente. L'étape de conversion peut également être différée par le biais d'une extension de balisage.

Valeurs d'attribut d'énumération

Les valeurs d'énumération en XAML sont traitées intrinsèquement par les méthodes natives de la structure Enum.

Pour les valeurs d'énumération ne comportant pas d'indicateurs, le comportement natif consiste à traiter la chaîne d'une valeur d'attribut et à la résoudre en l'une des valeurs d'énumération. Vous ne spécifiez pas l'énumération au format Enumeration.Value, comme c'est le cas dans le code. Vous spécifiez plutôt la Valeur seulement et l'Énumération est déduite par le type de la propriété définie. Si vous spécifiez un attribut au format Enumeration.Value, il ne sera pas correctement résolu.

Pour les énumérations avec indicateur, le comportement repose sur la méthode Enum.Parse. Vous pouvez spécifier plusieurs valeurs pour une énumération avec indicateur en séparant chacune d'elles avec une virgule. Toutefois, vous ne pouvez pas combiner des valeurs d'énumération qui ne comportent pas d'indicateurs. Par exemple, vous ne pouvez pas utiliser la syntaxe de virgule pour essayer de créer un Trigger qui agisse sur plusieurs conditions d'une énumération ne comportant pas d'indicateurs :

<!--This will not compile, because Visibility is not a flagwise enumeration.-->
...
<Trigger Property="Visibility" Value="Collapsed,Hidden">
  <Setter ... />
</Trigger>
...

Les énumérations comportant des indicateurs qui prennent en charge des attributs définissables en XAML sont rares dans WPF. Toutefois, une telle énumération est StyleSimulations. Vous pouvez, par exemple, utiliser la syntaxe d'attribut comportant des indicateurs et délimitée par des virgules pour modifier l'exemple indiqué dans les Notes pour la classe Glyphs ; StyleSimulations = "BoldSimulation" pourrait devenir StyleSimulations = "BoldSimulation,ItalicSimulation". KeyBinding.Modifiers est une autre propriété dans laquelle plusieurs valeurs d'énumération peuvent être spécifiées. Toutefois, cette propriété est un cas spécial, parce que l'énumération ModifierKeys prend en charge son propre convertisseur de type. Le convertisseur de type de modificateurs utilise le signe plus (+) comme séparateur plutôt qu'une virgule (,) afin que la syntaxe plus traditionnelle représentant des combinaisons de touches, telles que "Ctrl+Alt", soit prise en charge dans la balise.

Références des noms de membres d'événement et de propriété

Lorsque vous spécifiez un attribut, vous pouvez faire référence à toute propriété ou à tout événement existant en tant que membre du type CLR instancié pour l'élément objet contenant.

Vous pouvez aussi faire référence à une propriété ou un événement attaché, indépendamment de l'élément objet contenant.

Vous pouvez également nommer un événement à partir d'un objet accessible via l'espace de noms par défaut à l'aide d'un nom partiellement qualifié typeName.event ; cette syntaxe prend en charge l'association de gestionnaires pour les événements routés où il est prévu que le gestionnaire gère le routage des événements à partir des éléments enfants, mais où la table des membres de l'élément parent ne contient pas non plus cet événement. Cette syntaxe ressemble à une syntaxe d'événement attaché, mais l'événement ici n'est pas un véritable événement attaché. Vous faites en fait référence à un événement avec un nom qualifié. Pour plus d'informations, consultez Vue d'ensemble des événements routés.

Les noms de propriété sont parfois fournis comme la valeur d'un attribut, et non le nom d'attribut, et ce nom de propriété peut également inclure des qualificateurs, tels que la propriété spécifiée au format ownerType.dependencyPropertyName. Ce scénario est courant lors de l'écriture de styles ou de modèles en XAML. Les règles de traitement des noms de propriété fournis comme une valeur d'attribut sont différentes et sont régies par le type de la propriété qui est définie, et par quelques facteurs de contexte tels que l'association ou non d'un type de cible à un style ou un modèle. Pour plus d'informations, consultez Application d'un style et création de modèles.

Les noms de propriété sont également utilisés lorsqu'une valeur d'attribut décrit une relation entre deux propriétés. Cette fonction est utilisée pour la liaison de données et pour les cibles de storyboard et elle est activée par la classe PropertyPath et son convertisseur de type. Pour une description plus complète de la sémantique de recherche, consultez PropertyPath, syntaxe XAML.

Syntaxe des éléments de propriété

La syntaxe des éléments de propriété est une syntaxe qui diverge quelque peu de la syntaxe XML de base. En XML, la valeur d'un attribut est de fait une chaîne, la seule variante possible étant le format de codage de chaîne utilisé. En XAML, vous pouvez assigner d'autres éléments objet comme valeur d'une propriété. Cette fonctionnalité est activée par la syntaxe de l'élément de propriété. Au lieu d'être spécifiée comme un attribut dans la balise d'élément, la propriété est définie à l'aide d'une balise d'élément ouvrante au format elementTypeName.propertyName, puis sa valeur est spécifiée et enfin l'élément de propriété est fermé.

Spécifiquement, la syntaxe commence par le signe « inférieur à » (<), suivi immédiatement par le nom du type de classe ou de structure dans laquelle est contenue la syntaxe de l'élément de propriété. S'ensuivent immédiatement un point unique (.), puis le nom d'une propriété qui doit exister dans la table des membres du type spécifié et enfin le signe « supérieur à » (>). La valeur à assigner à la propriété est contenue dans l'élément de propriété. Cette valeur est généralement donnée comme un ou plusieurs éléments objet, puisque la spécification d'objets comme des valeurs est le scénario que la syntaxe des éléments de propriété essaie de résoudre. Enfin, une balise fermante équivalente spécifiant la même combinaison elementTypeName.propertyName doit être fournie ; celle-ci doit être correctement imbriquée et équilibrée avec les autres balises d'élément. L'exemple suivant illustre la syntaxe d'un élément de la propriété ContextMenu d'un Button.

<Button>
  <Button.ContextMenu>
    <ContextMenu>
      <MenuItem Header="1">First item</MenuItem>
      <MenuItem Header="2">Second item</MenuItem>
    </ContextMenu>
  </Button.ContextMenu>
  Right-click me!</Button>

La valeur figurant dans un élément de propriété peut également être indiquée sous forme de texte interne, dans les cas où le type de propriété qui est spécifié serait un type valeur primitif (String, par exemple) ou une énumération dans laquelle un nom est spécifié. Ces deux utilisations sont rares car chacun de ces cas prend également en charge la syntaxe d'attribut. Un scénario permettant de renseigner un élément de propriété par une chaîne s'applique aux propriétés non associées au contenu XAML mais qui sont tout de même utilisées pour la représentation de texte d'interface utilisateur, et des éléments d'espace particuliers, tels que des sauts de ligne, doivent apparaître dans ce texte d'interface utilisateur. La syntaxe d'attribut ne peut pas conserver les sauts de ligne, contrairement à la syntaxe des éléments de propriété, à condition que la fonction de conservation des espaces significatifs soit active (pour plus d'informations à ce sujet, consultez Traitement des espaces blancs en XAML).

Un élément de propriété n'est pas représenté dans l'arborescence logique. Un élément de propriété n'est qu'une syntaxe particulière permettant de définir une propriété, et non un élément qui possède une instance ou un objet.

Syntaxe des éléments de propriété pour les types de collections

La spécification XAML requiert que les implémentations de processeur XAML soient en mesure d'identifier les propriétés où le type valeur est une collection. L'implémentation WPF est basée sur le code managé et son processeur XAML identifie les types de collections par le biais de l'un des éléments suivants :

Si le type d'une propriété est une collection, il n'est alors pas nécessaire de spécifier le type de collection déduit dans la balise. Au lieu de cela, les éléments qui doivent faire partie de la collection sont spécifiés comme un ou plusieurs éléments enfants de l'élément de propriété du type de collection. Chacun de ces éléments est évalué sur un objet pendant son chargement et est ajouté dans la collection en appelant la méthode Add de la collection implicite. Par exemple, la propriété Triggers de Style prend le type de collection TriggerCollection spécialisé. Toutefois, il n'est pas nécessaire d'instancier un TriggerCollection dans la balise. Au lieu de cela, vous spécifiez un ou plusieurs éléments Trigger comme éléments dans l'élément de propriété Style.Triggers, où Trigger (ou une classe dérivée) est le type d'élément attendu pour le TriggerCollection fortement typé et implicite.

<Style x:Key="SpecialButton" TargetType="{x:Type Button}">
  <Style.Triggers>
    <Trigger Property="Button.IsMouseOver" Value="true">
      <Setter Property = "Background" Value="Red"/>
    </Trigger>
    <Trigger Property="Button.IsPressed" Value="true">
      <Setter Property = "Foreground" Value="Green"/>
    </Trigger>
  </Style.Triggers>
</Style>

Une propriété peut être à la fois un type de collection et la propriété de contenu XAML de ce type et des types dérivés.

Un élément de collection implicite crée un membre dans l'arborescence logique, bien qu'il n'apparaisse pas dans la balise comme un élément. Habituellement, le constructeur du type propriétaire effectue l'instanciation pour la collection comptant parmi ses propriétés, ce qui a pour effet d'ajouter la collection dans l'arborescence.

Remarque :

Les interfaces List et Dictionary génériques (IList<T> et IDictionary<TKey, TValue>) ne sont pas prises en charge pour la détection de collection par le processeur WPFXAML. Toutefois, vous pouvez utiliser la classe List<T> comme classe de base, parce qu'elle implémente IList directement, ou Dictionary<TKey, TValue> comme classe de base, parce qu'elle implémente IDictionary directement.

Syntaxe de contenu XAML

La syntaxe de contenu XAML est une syntaxe activée uniquement sur les classes qui spécifient le ContentPropertyAttribute dans le cadre de leur déclaration de classe. Le ContentPropertyAttribute requiert un paramètre qui spécifie la propriété par nom, qui est défini pour être la propriété de contenu de ce type d'élément (y compris les classes dérivées). La propriété ainsi désignée est la propriété de contenu XAML d'un élément. Lorsqu'ils sont traités par un processeur XAML, tous les éléments enfants ou le texte interne recherché compris entre les balises ouvrante et fermante de l'élément sont assignés comme la valeur de cette propriété de contenu XAML. Vous êtes autorisés à spécifier des éléments de propriété pour la propriété de contenu si vous souhaitez rendre son balisage explicite. Cette technique permet parfois de clarifier le balisage ou d'indiquer un style de balisage, mais une propriété de contenu a généralement pour finalité de rationaliser le balisage de sorte que les éléments qui possèdent intuitivement un lien parents-enfants puissent être directement imbriqués. Les balises d'élément de propriété d'autres propriétés sur un élément ne sont pas assignées en tant que « contenu » ; elles ont été préalablement traitées dans le workflow de l'analyseur et ne sont pas considérées comme étant du « contenu ».

Comme avec toute autre propriété, la propriété de contenu XAML d'un objet sera d'un type spécifique. Il peut s'agir du type Object. Le type de cette propriété contenu aide à définir le modèle de contenu d'un objet. Par exemple, un type de Object est faible dans le sens où tout objet peut devenir le contenu, mais même ce typage faible induit que le contenu doit être un objet unique. L'objet unique peut être un objet de collection, mais il n'en demeure pas moins qu'un seul objet de collection de ce type peut être assigné comme contenu.

Dans la documentation WPF, les modèles de contenu de types particuliers sont décrits dans les pages des classes correspondantes ou sont écrits comme des thèmes conceptuels distincts pour des familles de types et sont associés à chaque référence de type appropriée.

Syntaxe de contenu des types de collection

Pour accepter plusieurs éléments objet (ou texte interne) comme contenu, le type de la propriété de contenu doit être spécifiquement un type de collection. De même que dans la syntaxe d'un élément de propriété pour les types de collections, un processeur XAML doit identifier des types qui sont des types de collection. Si un élément possède une propriété de contenu XAML et que le type de cette propriété de contenu XAML est une collection, le type de collection implicite n'a alors pas besoin d'être spécifié dans le balisage en tant qu'élément objet et la propriété de contenu XAML n'a pas besoin d'être spécifiée en tant qu'élément de propriété. Par conséquent, le modèle de contenu apparent dans la balise peut désormais avoir plusieurs éléments enfants assignés comme contenu. L'exemple suivant illustre la syntaxe de contenu d'une classe dérivée Panel. Toutes les classes dérivées Panel attribuent à la propriété de contenu XAML la valeur Children, qui requiert une valeur de type UIElementCollection.

<Page
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  >
  <StackPanel>
    <Button>Button 1</Button>
    <Button>Button 2</Button>
    <Button>Button 3</Button>
  </StackPanel>
</Page>

Notez que ni l'élément de propriété pour Children ni l'élément pour UIElementCollection n'est requis dans la balise. Il s'agit d'une caractéristique conceptuelle du XAML grâce à laquelle les éléments contenus de manière récursive définissant une interface utilisateur sont représentés de manière plus intuitive comme une arborescence d'éléments imbriqués avec les relations parent/enfant immédiates, sans l'intervention étrangère de balises d'élément de propriété ou d'objets de collection. En fait, UIElementCollection ne peut pas être spécifié dans la balise comme un élément objet, par conception. Du fait qu'il n'est prévu qu'il soit utilisé que comme une collection implicite, UIElementCollection n'expose pas de constructeur public par défaut et, par conséquent, ne peut pas être instancié comme un élément objet.

Combinaison d'éléments de propriété et d'éléments objet dans un objet avec une propriété de contenu

La spécification XAML déclare qu'un processeur XAML peut appliquer une règle exigeant que les éléments objet utilisés pour renseigner la propriété de contenu XAML dans un élément objet soient contigus et ne doivent pas être combinés. Cette règle interdisant la combinaison d'éléments de propriété et le contenu est appliquée par le processeur WPFXAML.

Vous pouvez avoir un élément objet enfant comme première balise immédiate dans un élément objet. Vous pouvez ensuite introduire des éléments de propriété. Vous pouvez aussi spécifier un ou plusieurs éléments de propriété, puis un contenu, puis d'autres éléments de propriété. Mais une fois qu'un élément de propriété suit le contenu, vous ne pouvez plus introduire d'autre contenu, mais uniquement ajouter des éléments de propriété.

Cet ordre exigé contenu/élément de propriété ne s'applique pas au texte interne utilisé comme contenu. Toutefois, il reste recommandé de garder le texte interne contigu car il sera difficile de détecter visuellement l'espace significatif dans les balises si des éléments de propriété sont intercalés avec le texte interne.

Propriétés attachées

Les propriétés attachées sont un concept de programmation introduit en XAML, qui veut que les propriétés puissent être possédées et définies par un type, mais définies sur tout élément. Le principal scénario auquel sont destinées les propriétés attachées consiste à permettre aux éléments enfants dans une arborescence d'éléments de signaler des informations à un élément parent sans requérir un modèle objet largement partagé entre tous les éléments. À l'inverse, les propriétés attachées peuvent être utilisées par les éléments parents pour signaler des informations aux éléments enfants. Pour plus d'informations sur la finalité des propriétés attachées et pour savoir comment créer vos propres propriétés attachées, consultez Vue d'ensemble des propriétés attachées.

Les propriétés attachées utilisent une syntaxe qui, en apparence, ressemble à la syntaxe des éléments de propriété dans la mesure où vous spécifiez également une combinaison typeName.propertyName. Il existe deux différences majeures :

  • Vous pouvez même utiliser la combinaison typeName.propertyName lors de la définition d'une propriété attachée par le biais de la syntaxe d'attribut. Les propriétés attachées sont le seul cas où la qualification du nom de propriété est exigée dans une syntaxe d'attribut.

  • Vous pouvez également utiliser la syntaxe des éléments de propriété pour les propriétés attachées. Toutefois, dans la syntaxe typique d'un élément de propriété, le typeName que vous spécifiez est l'élément objet contenant l'élément de propriété. Si vous faites référence à une propriété attachée, le typeName est la classe qui définit la propriété attachée, pas l'élément objet contenant.

Événements attachés

Les événements attachés sont un autre concept de programmation introduit en XAML où les événements peuvent être définis par un type, mais les gestionnaires peuvent être joints sur tout objet. Le type qui définit un événement attaché est souvent un type statique définissant un service, et ces événements attachés sont parfois exposés par un alias d'événement routé dans les types qui exposent le service. Les gestionnaires des événements attachés sont spécifiés dans la syntaxe d'attribut. La syntaxe d'attribut est développée pour les événements attachés afin de permettre l'utilisation d'un typeName.eventName, où typeName est la classe qui fournit les accesseurs de gestionnaire d'événements Add et Remove de l'infrastructure des événements attachés et où eventName est le nom de l'évènement.

Espaces de noms XML

Aucun des exemples de syntaxe précédents n'a spécifié un espace de noms autre que l'espace de noms par défaut. Dans les applications WPF typiques, l'espace de noms par défaut est spécifié comme l'espace de noms WPF. Vous pouvez spécifier d'autres espaces de noms que les espaces de noms par défaut et toujours utiliser essentiellement les mêmes types de syntaxe, mais chaque fois qu'une classe nommée n'est pas accessible dans l'espace de noms par défaut, ce nom de classe doit être précédé du préfixe de l'espace de noms XML utilisé pour mapper l'espace de noms CLR correspondant. Par exemple, <custom:MyElement/> est la syntaxe de l'élément objet servant à instancier une instance de la classe MyElement, où l'espace de noms CLR contenant cette classe (et peut-être l'assembly externe contenant cet espace de noms) a été précédemment mappé au préfixe custom.

Pour plus d'informations sur les espaces de noms XML et le XAML, consultez Espaces de noms XAML et mappage d'espace de noms.

Extensions de balisage

Le XAML définit une entité de programmation d'extensions de balisage qui permet d'échapper au traitement normal du processeur XAML gérant les attributs ou les éléments objet, et qui reporte le traitement vers une classe de stockage. L'implémentation WPF d'un processeur XAML utilise la classe abstraite MarkupExtension comme base pour toutes les extensions de balisage prises en charge par WPF. Le caractère qui identifie une extension de balisage sur un processeur XAML lors de l'utilisation de la syntaxe d'attribut est l'accolade ouvrante ({), suivie par tout caractère autre qu'une accolade fermante (}). La première chaîne qui suit l'accolade ouvrante doit faire référence à la classe qui fournit le comportement d'extension particulier, où la référence peut omettre la sous-chaîne "Extension" si celle-ci fait partie du nom de classe véritable. Un espace unique peut apparaître ensuite, puis chaque caractère successif est utilisé comme entrée par l'implémentation d'extension, jusqu'à rencontrer l'accolade fermante. Les extensions de balisage dans WPF sont principalement destinées à fournir un moyen de faire référence à d'autres objets existants, ou de différer la référence aux objets qui seront évalués au moment de l'exécution, tout en utilisant la syntaxe d'attribut. Par exemple, une liaison de données simple est accomplie en spécifiant l'extension de balisage {Binding} au lieu du type valeur qu'une propriété donnée aurait normalement. De nombreuses extensions de balisage permettent d'utiliser une syntaxe d'attribut pour des propriétés qui n'accepteraient pas autrement cette syntaxe. Par exemple, un objet Style est un type référence relativement complexe contenant plusieurs autres propriétés, qui prennent également chacune des objets byref et non des primitives. Toutefois, les styles sont généralement créés comme une ressource, puis ils sont référencés par le biais de l'une des deux extensions de balisage demandant une ressource. L'extension diffère l'évaluation de la valeur de la propriété à une recherche de ressource et permet de fournir la valeur de la propriété Style, en prenant le type Style, dans la syntaxe d'attribut comme suit :

<Button Style="{StaticResource MyStyle}">My button</Button>

Dans cet exemple, StaticResource identifie la classe StaticResourceExtension qui fournit l'implémentation de l'extension de balisage. La chaîne MyStyle suivante est utilisée comme entrée pour le constructeur StaticResourceExtension (qui n'est pas un constructeur par défaut), où le paramètre issu de la chaîne d'extension déclare le ResourceKey demandé. MyStyle doit avoir la valeur x:Key, attribut d'un Style défini en tant que ressource. L'utilisation de StaticResource, extension de balisage demande que la ressource soit utilisée pour fournir la valeur de propriété Style par le biais de la logique de recherche de ressource statique logique au moment du chargement.

Pour plus d'informations sur les extensions de balisage, consultez Extensions de balisage et XAML. Pour une référence des extensions de balisage et d'autres fonctions de programmation XAML, consultez Fonctionnalités de langage pour les espaces de noms XAML (x:) et Extensions XAML des espaces de noms WPF.

Utilisations facultatives et non recommandées de XAML

Utilisations facultatives des éléments de propriété

Les utilisations facultatives des éléments de propriété impliquent de bien « épeler » les propriétés de contenu des éléments que le processeur XAML considère comme implicites. Par exemple, lorsque vous déclarez le contenu d'un Menu, vous pouvez choisir de déclarer explicitement la collection Items du Menu comme une balise d'élément de propriété <Menu.Items> et de placer chaque MenuItem dans <Menu.Items>, plutôt que d'utiliser le comportement du processeur XAML implicite qui induit que tous les éléments enfants d'un Menu doivent être un MenuItem et soient placés dans la collection Items. Les utilisations facultatives peuvent parfois aider à clarifier visuellement la structure des objets telle qu'elle est représentée dans la balise. Ou bien une utilisation explicite d'une propriété d'élément peut parfois éviter un balisage techniquement fonctionnel mais visuellement confus, par exemple les extensions de balisage imbriquées dans une valeur d'attribut.

Attributs TypeName.memberName complètement qualifiés

Le format typeName.memberName d'un attribut est en fait plus universel qu'un simple événement routé ; toutefois, dans d'autres applications, ce format est superflu et doit être évité, ne serait-ce que pour le style et la lisibilité du balisage. Dans l'exemple suivant, chacune des trois références à l'attribut Background est complètement équivalente :

<Button Background="Blue">Background</Button>
<Button Button.Background="Blue">Button.Background</Button>
<Button Control.Background="Blue">Control.Background</Button>

Button.Background fonctionne car la recherche qualifiée pour cette propriété sur Button est réussie (Background a été hérité du Contrôle) et Button est la classe de l'élément objet ou une classe de base. Control.Background fonctionne car la classe Control définit en fait Background et Control est une classe de base Button.

Toutefois, l'exemple de format typeName.memberName suivant ne fonctionne pas et, par conséquent, est accompagné de commentaires :

<!--<Button Label.Background="Blue">Does not work</Button> -->

Label est une autre classe dérivée de Control, et, si vous aviez spécifié Label.Background dans un élément objet Label, cette utilisation aurait fonctionné. Toutefois, du fait que Label n'est pas la classe ou la classe de base de Button, le comportement du processeur XAML spécifié consiste à traiter Label.Background comme une propriété attachée. Label.Background n'est pas une propriété attachée et cette utilisation échoue.

Propriété d'éléments baseTypeName.memberName

De la même manière que le format typeName.memberName fonctionne pour la syntaxe d'attribut, la syntaxe baseTypeName.memberName fonctionne pour la syntaxe des éléments de propriété. Par exemple, la syntaxe suivante fonctionne comme suit :

<Button>Control.Background PE
  <Control.Background>
    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
      <GradientStop Color="Yellow" Offset="0.0" />
      <GradientStop Color="LimeGreen" Offset="1.0" />
    </LinearGradientBrush>
    </Control.Background>
</Button>

Ici, l'élément de propriété a été donné comme Control.Background bien que l'élément de propriété soit contenu dans Button.

Mais tout comme le format typeName.memberName pour les attributs, le style baseTypeName.memberName ne convient pas pour le balisage et il convient de l'éviter pour des raisons de style.

Voir aussi

Concepts

Vue d'ensemble du langage XAML

Vue d'ensemble des propriétés de dépendance

TypeConverters et XAML

XAML et classes personnalisées

Autres ressources

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

Extensions XAML des espaces de noms WPF