Syntaxe XAML en détailXAML Syntax In Detail

Cette rubrique définit les termes utilisés pour décrire les éléments de la syntaxe XAML.This topic defines the terms that are used to describe the elements of XAML syntax. Ces termes sont fréquemment utilisés dans la suite de cette documentation, à la fois pour la documentation WPF et pour les autres infrastructures qui utilisent XAML ou les concepts XAML de base activés par la prise en charge du langage XAML au niveau de System. Xaml.These terms are used frequently throughout the remainder of this documentation, both for WPF documentation specifically and for the other frameworks that use XAML or the basic XAML concepts enabled by the XAML language support at the System.Xaml level. Cette rubrique développe la terminologie de base présentée dans la rubrique vue d’ensemble du langage XAML (WPF).This topic expands on the basic terminology introduced in the topic XAML Overview (WPF).

Spécification du langage XAMLThe XAML Language Specification

La terminologie de syntaxe XAML définie ici est également définie ou référencée dans la spécification du langage XAML.The XAML syntax terminology defined here is also defined or referenced within the XAML language specification. XAML est un langage basé sur XML qui suit ou s’étend sur les règles de structure XML.XAML is a language based on XML and follows or expands upon XML structural rules. Une partie de la terminologie est partagée à partir de ou basée sur la terminologie couramment utilisée pour décrire le langage XML ou le modèle d’objet de document XML.Some of the terminology is shared from or is based on the terminology commonly used when describing the XML language or the XML document object model.

Pour plus d’informations sur la spécification du langage XAML, téléchargez []MS-XAML à partir du centre de téléchargement Microsoft.For more information about the XAML language specification, download [MS-XAML] from the Microsoft Download Center.

XAML et CLRXAML and CLR

XAML est un langage de balisage.XAML is a markup language. Le common language runtime (CLR), tel qu’il est impliqué par son nom, permet l’exécution de l’exécution.The common language runtime (CLR), as implied by its name, enables runtime execution. XAML n’est pas par lui-même l’un des langages couramment utilisés directement par le runtime CLR.XAML is not by itself one of the common languages that is directly consumed by the CLR runtime. Au lieu de cela, vous pouvez considérer XAML comme prenant en charge son propre système de type.Instead, you can think of XAML as supporting its own type system. Le système d’analyse XAML particulier utilisé par WPF est basé sur le CLR et le système de type CLR.The particular XAML parsing system that is used by WPF is built on the CLR and the CLR type system. Les types XAML sont mappés aux types CLR pour instancier une représentation au moment de l’exécution lorsque le XAML pour WPF est analysé.XAML types are mapped to CLR types to instantiate a run time representation when the XAML for WPF is parsed. Pour cette raison, le reste de la syntaxe de ce document inclut des références au système de type CLR, même si les discussions de syntaxe équivalentes dans la spécification du langage XAML ne le font pas.For this reason, the remainder of discussion of syntax in this document will include references to the CLR type system, even though the equivalent syntax discussions in the XAML language specification do not. (Selon le niveau de spécification du langage XAML, les types XAML peuvent être mappés à n’importe quel autre système de type, ce qui ne doit pas nécessairement être le CLR, mais cela nécessiterait la création et l’utilisation d’un autre analyseur XAML.)(Per the XAML language specification level, XAML types could be mapped to any other type system, which does not have to be the CLR, but that would require the creation and use of a different XAML parser.)

Membres de types et héritage de classeMembers of Types and Class Inheritance

Les propriétés et les événements tels qu’ils apparaissent en tant que membres XAML d’un type de WPFWPF sont souvent hérités de types de base.Properties and events as they appear as XAML members of a WPFWPF type are often inherited from base types. Prenons l’exemple suivant : <Button Background="Blue" .../>.For example, consider this example: <Button Background="Blue" .../>. La propriété Background n’est pas une propriété immédiatement déclarée sur la classe Button, si vous devez examiner la définition de classe, les résultats de la réflexion ou la documentation.The Background property is not an immediately declared property on the Button class, if you were to look at the class definition, reflection results, or the documentation. Au lieu de cela, Background est héritée de la classe de Control de base.Instead, Background is inherited from the base Control class.

Le comportement d’héritage de la classe des éléments XAML WPFWPF est un comportement significatif par rapport à une interprétation du balisage XML appliquée au schéma.The class inheritance behavior of WPFWPF XAML elements is a significant departure from a schema-enforced interpretation of XML markup. L’héritage de classe peut devenir complexe, en particulier lorsque les classes de base intermédiaires sont abstraites, ou lorsque les interfaces sont impliquées.Class inheritance can become complex, particularly when intermediate base classes are abstract, or when interfaces are involved. C’est l’une des raisons pour lesquelles l’ensemble d’éléments XAML et leurs attributs autorisés sont difficiles à représenter de façon précise et complète à l’aide des types de schémas généralement utilisés pour la programmation XML, tels que les DTD ou le format XSD.This is one reason that the set of XAML elements and their permissible attributes is difficult to represent accurately and completely using the schema types that are typically used for XML programming, such as DTD or XSD format. Une autre raison est que les fonctionnalités d’extensibilité et de mappage de type du langage XAML lui-même empêchent l’exhaustivité de toute représentation fixe des types et des membres autorisés.Another reason is that extensibility and type-mapping features of the XAML language itself preclude completeness of any fixed representation of the permissible types and members.

Syntaxe de l’élément objetObject Element Syntax

La syntaxe d’élément objet est la syntaxe de balisage XAML qui instancie une structure ou une classe CLR en déclarant un élément XML.Object element syntax is the XAML markup syntax that instantiates a CLR class or structure by declaring an XML element. Cette syntaxe ressemble à la syntaxe d’élément d’autres langages de balisage tels que HTML.This syntax resembles the element syntax of other markup languages such as HTML. La syntaxe d’élément objet commence par un chevron gauche (<), suivi immédiatement par le nom de type de la classe ou de la structure en cours d’instanciation.Object element syntax begins with a left angle bracket (<), followed immediately by the type name of the class or structure being instantiated. Zéro, un ou plusieurs espaces peuvent être suivis du nom de type et zéro, un ou plusieurs attributs peuvent également être déclarés sur l’élément objet, avec un ou plusieurs espaces séparant chaque paire nom d’attribut = « valeur ».Zero or more spaces can follow the type name, and zero or more attributes may also be declared on the object element, with one or more spaces separating each attribute name="value" pair. Enfin, l’une des conditions suivantes doit être remplie :Finally, one of the following must be true:

  • L’élément et la balise doivent être fermés par une barre oblique (/) suivie immédiatement d’un chevron droit (>).The element and tag must be closed by a forward slash (/) followed immediately by a right angle bracket (>).

  • La balise d’ouverture doit être terminée par un chevron droit (>).The opening tag must be completed by a right angle bracket (>). D’autres éléments objets, éléments de propriété ou texte interne peuvent suivre la balise d’ouverture.Other object elements, property elements, or inner text, can follow the opening tag. Exactement le contenu qui peut être contenu ici est généralement limité par le modèle objet de l’élément.Exactly what content may be contained here is typically constrained by the object model of the element. La balise de fermeture équivalente pour l’élément Object doit également exister, dans une imbrication et un équilibre appropriés avec d’autres paires de balises d’ouverture et de fermeture.The equivalent closing tag for the object element must also exist, in proper nesting and balance with other opening and closing tag pairs.

XAML implémenté par .NET dispose d’un ensemble de règles qui mappent des éléments objet dans des types, des attributs dans des propriétés ou des événements, et des espaces de noms XAML à des espaces de noms CLR plus assembly.XAML as implemented by .NET has a set of rules that map object elements into types, attributes into properties or events, and XAML namespaces to CLR namespaces plus assembly. Pour WPF et .NET, les éléments objets XAML sont mappés aux types .NET tels qu’ils sont définis dans les assemblys référencés, et les attributs sont mappés aux membres de ces types.For WPF and .NET, XAML object elements map to .NET types as defined in referenced assemblies, and the attributes map to members of those types. Quand vous référencez un type CLR en XAML, vous avez également accès aux membres hérités de ce type.When you reference a CLR type in XAML, you have access to the inherited members of that type as well.

Par exemple, l’exemple suivant est une syntaxe d’élément objet qui instancie une nouvelle instance de la classe Button et spécifie également un attribut Name et une valeur pour cet attribut :For example, the following example is object element syntax that instantiates a new instance of the Button class, and also specifies a Name attribute and a value for that attribute:

<Button Name="CheckoutButton"/>

L’exemple suivant est une syntaxe d’élément objet qui comprend également la syntaxe de propriété de contenu XAML.The following example is object element syntax that also includes XAML content property syntax. Le texte interne contenu dans sera utilisé pour définir la propriété de contenu XAML TextBox, Text.The inner text contained within will be used to set the TextBox XAML content property, Text.

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

Modèles de contenuContent Models

Une classe peut prendre en charge une utilisation en tant qu’élément objet XAML en termes de syntaxe, mais cet élément ne fonctionnera correctement que dans une application ou une page lorsqu’il sera placé dans une position attendue d’un modèle de contenu ou d’une arborescence d’éléments global.A class might support a usage as a XAML object element in terms of the syntax, but that element will only function properly in an application or page when it is placed in an expected position of an overall content model or element tree. Par exemple, une MenuItem doit généralement être placée en tant qu’enfant d’une classe dérivée MenuBase telle que Menu.For example, a MenuItem should typically only be placed as a child of a MenuBase derived class such as Menu. Les modèles de contenu pour des éléments spécifiques sont documentés dans le cadre des remarques sur les pages de classe pour les contrôles et d’autres classes de WPFWPF qui peuvent être utilisées en tant qu’éléments XAML.Content models for specific elements are documented as part of the remarks on the class pages for controls and other WPFWPF classes that can be used as XAML elements.

Propriétés des éléments ObjectProperties of Object Elements

Les propriétés en XAML sont définies par une variété de syntaxes possibles.Properties in XAML are set by a variety of possible syntaxes. La syntaxe qui peut être utilisée pour une propriété particulière varie en fonction des caractéristiques du système de type sous-jacent de la propriété que vous définissez.Which syntax can be used for a particular property will vary, based on the underlying type system characteristics of the property that you are setting.

En définissant des valeurs de propriétés, vous ajoutez des fonctionnalités ou des caractéristiques à des objets tels qu’ils existent dans le graphique d’objets d’exécution.By setting values of properties, you add features or characteristics to objects as they exist in the run time object graph. L’état initial de l’objet créé à partir d’un élément objet est basé sur le comportement de constructeur sans paramètre.The initial state of the created object from a object element is based on the parameterless constructor behavior. En règle générale, votre application utilise un autre nom que l’instance par défaut complète d’un objet donné.Typically, your application will use something other than a completely default instance of any given object.

Syntaxe d’attribut (Propriétés)Attribute Syntax (Properties)

La syntaxe d’attribut est la syntaxe de balisage XAML qui définit une valeur pour une propriété en déclarant un attribut sur un élément objet existant.Attribute syntax is the XAML markup syntax that sets a value for a property by declaring an attribute on an existing object element. Le nom de l’attribut doit correspondre au nom de membre CLR de la propriété de la classe qui stocke l’élément objet approprié.The attribute name must match the CLR member name of the property of the class that backs the relevant object element. Le nom de l’attribut est suivi d’un opérateur d’assignation (=).The attribute name is followed by an assignment operator (=). La valeur de l’attribut doit être une chaîne entre guillemets.The attribute value must be a string enclosed within quotes.

Notes

Vous pouvez utiliser des guillemets de remplacement pour placer un guillemet littéral dans un attribut.You can use alternating quotes to place a literal quotation mark within an attribute. Par exemple, vous pouvez utiliser des guillemets simples comme moyen de déclarer une chaîne qui contient un caractère de guillemet double dans celui-ci.For instance you can use single quotes as a means to declare a string that contains a double quote character within it. Que vous utilisiez des guillemets simples ou doubles, vous devez utiliser une paire correspondante pour ouvrir et fermer la chaîne de valeur d’attribut.Whether you use single or double quotes, you should use a matching pair for opening and closing the attribute value string. Il existe également des séquences d’échappement ou d’autres techniques permettant de contourner les restrictions de caractères imposées par toute syntaxe XAML particulière.There are also escape sequences or other techniques available for working around character restrictions imposed by any particular XAML syntax. Consultez entités de caractères XML et XAML.See XML Character Entities and XAML.

Pour être défini par le biais de la syntaxe d’attribut, une propriété doit être publique et doit être accessible en écriture.In order to be set through attribute syntax, a property must be public and must be writeable. La valeur de la propriété dans le système de type de stockage doit être un type valeur ou doit être un type référence qui peut être instancié ou référencé par un processeur XAML lors de l’accès au type de stockage approprié.The value of the property in the backing type system must be a value type, or must be a reference type that can be instantiated or referenced by a XAML processor when accessing the relevant backing type.

Pour les événements XAML WPF, l’événement référencé en tant que nom d’attribut doit être public et avoir un délégué public.For WPF XAML events, the event that is referenced as the attribute name must be public and have a public delegate.

La propriété ou l’événement doit être un membre de la classe ou de la structure qui est instancié par l’élément objet conteneur.The property or event must be a member of the class or structure that is instantiated by the containing object element.

Traitement des valeurs d’attributProcessing of Attribute Values

La valeur de chaîne contenue dans les guillemets ouvrants et fermants est traitée par un processeur XAML.The string value contained within the opening and closing quotation marks is processed by a XAML processor. 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.For properties, the default processing behavior is determined by the type of the underlying CLR property.

La valeur de l’attribut est remplie par l’un des éléments suivants, à l’aide de cet ordre de traitement :The attribute value is filled by one of the following, using this processing order:

  1. Si le processeur XAML rencontre une accolade, ou un élément objet qui dérive de MarkupExtension, l’extension de balisage référencée est évaluée en premier au lieu de traiter la valeur comme une chaîne, et l’objet retourné par l’extension de balisage est utilisé comme valeur.If the XAML processor encounters a curly brace, or an object element that derives from MarkupExtension, then the referenced markup extension is evaluated first rather than processing the value as a string, and the object returned by the markup extension is used as the value. Dans de nombreux cas, l’objet retourné par une extension de balisage sera une référence à un objet existant, ou une expression qui diffère l’évaluation jusqu’au moment de l’exécution et n’est pas un objet nouvellement instancié.In many cases the object returned by a markup extension will be a reference to an existing object, or an expression that defers evaluation until run time, and is not a newly instantiated object.

  2. Si la propriété est déclarée avec un TypeConverteravec attributs, ou si le type de valeur de cette propriété est déclaré avec un TypeConverteravec attributs, la valeur de chaîne de l’attribut est soumise au convertisseur de type comme une entrée de conversion, et le convertisseur retourne une nouvelle instance d’objet.If the property is declared with an attributed TypeConverter, or the value type of that property is declared with an attributed TypeConverter, the string value of the attribute is submitted to the type converter as a conversion input, and the converter will return a new object instance.

  3. S’il n’existe aucun TypeConverter, une conversion directe vers le type de propriété est tentée.If there is no TypeConverter, a direct conversion to the property type is attempted. Ce dernier niveau est une conversion directe au niveau de l’analyseur-valeur native entre les types primitifs du langage XAML, ou une vérification des noms des constantes nommées dans une énumération (l’analyseur accède ensuite aux valeurs correspondantes).This final level is a direct conversion at the parser-native value between XAML language primitive types, or a check for the names of named constants in an enumeration (the parser then accesses the matching values).

Valeurs d’attribut d’énumérationEnumeration Attribute Values

Les énumérations en XAML sont traitées intrinsèquement par les analyseurs XAML, et les membres d’une énumération doivent être spécifiés en spécifiant le nom de chaîne de l’une des constantes nommées de l’énumération.Enumerations in XAML are processed intrinsically by XAML parsers, and the members of an enumeration should be specified by specifying the string name of one of the enumeration's named constants.

Pour les valeurs d’énumération sans indicateur, 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.For nonflag enumeration values, the native behavior is to process the string of an attribute value and resolve it to one of the enumeration values. Vous ne spécifiez pas l’énumération dans l' énumérationde format. , Commevous le feriez dans le code.You do not specify the enumeration in the format Enumeration.Value, as you do in code. Au lieu de cela, vous spécifiez uniquement la valeuret l' énumération est déduite par le type de la propriété que vous définissez.Instead, you specify only Value, and Enumeration is inferred by the type of the property you are setting. Si vous spécifiez un attribut dans l' énumération. Format de valeur , elle ne sera pas résolue correctement.If you specify an attribute in the Enumeration.Value form, it will not resolve correctly.

Pour les énumérations d’indicateurs, le comportement est basé sur la méthode Enum.Parse.For flagwise enumerations, the behavior is based on the Enum.Parse method. Vous pouvez spécifier plusieurs valeurs pour une énumération d’indicateurs en séparant chaque valeur par une virgule.You can specify multiple values for a flagwise enumeration by separating each value with a comma. Toutefois, vous ne pouvez pas combiner des valeurs d’énumération qui n’ont pas d’indicateurs.However, you cannot combine enumeration values that are not flagwise. Par exemple, vous ne pouvez pas utiliser la syntaxe de virgule pour tenter de créer une Trigger qui agit sur plusieurs conditions d’une énumération sans indicateur :For instance, you cannot use the comma syntax to attempt to create a Trigger that acts on multiple conditions of a nonflag enumeration:

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

Les énumérations d’indicateurs qui prennent en charge les attributs définissables dans XAML sont rares dans WPF.Flagwise enumerations that support attributes that are settable in XAML are rare in WPF. Toutefois, une telle énumération est StyleSimulations.However, one such enumeration is StyleSimulations. Vous pouvez, par exemple, utiliser la syntaxe d’attribut avec indicateurs délimités par des virgules pour modifier l’exemple fourni dans les notes de la classe Glyphs ; StyleSimulations = "BoldSimulation" peut devenir StyleSimulations = "BoldSimulation,ItalicSimulation".You could, for instance, use the comma-delimited flagwise attribute syntax to modify the example provided in the Remarks for the Glyphs class; StyleSimulations = "BoldSimulation" could become StyleSimulations = "BoldSimulation,ItalicSimulation". KeyBinding.Modifiers est une autre propriété dans laquelle plusieurs valeurs d’énumération peuvent être spécifiées.KeyBinding.Modifiers is another property where more than one enumeration value can be specified. Toutefois, cette propriété est un cas particulier, car l’énumération ModifierKeys prend en charge son propre convertisseur de type.However, this property happens to be a special case, because the ModifierKeys enumeration supports its own type converter. Le convertisseur de type pour les modificateurs utilise un signe plus (+) comme délimiteur plutôt qu’une virgule (,).The type converter for modifiers uses a plus sign (+) as a delimiter rather than a comma (,). Cette conversion prend en charge la syntaxe plus traditionnelle pour représenter les combinaisons de touches dans la programmation Microsoft Windows, par exemple « Ctrl + Alt ».This conversion supports the more traditional syntax to represent key combinations in Microsoft Windows programming, such as "Ctrl+Alt".

Propriétés et références de nom de membre d’événementProperties and Event Member Name References

Lorsque vous spécifiez un attribut, vous pouvez référencer toute propriété ou événement qui existe en tant que membre du type CLR que vous avez instancié pour l’élément objet conteneur.When specifying an attribute, you can reference any property or event that exists as a member of the CLR type you instantiated for the containing object element.

Ou bien, vous pouvez référencer une propriété jointe ou un événement attaché, indépendamment de l’élément objet conteneur.Or, you can reference an attached property or attached event, independent of the containing object element. (Les propriétés jointes sont présentées dans une section à venir.)(Attached properties are discussed in an upcoming section.)

Vous pouvez également nommer tout événement à partir de n’importe quel objet accessible par le biais de l’espace de noms par défaut à l’aide d’un TypeName. nom qualifié partiel de l' événement ; Cette syntaxe prend en charge l’attachement de gestionnaires pour les événements routés où le gestionnaire est destiné à gérer le routage d’événements à partir d’éléments enfants, mais l’élément parent n’a pas également cet événement dans sa table de membres.You can also name any event from any object that is accessible through the default namespace by using a typeName.event partially qualified name; this syntax supports attaching handlers for routed events where the handler is intended to handle events routing from child elements, but the parent element does not also have that event in its members table. Cette syntaxe ressemble à une syntaxe d’événement jointe, mais l’événement ici n’est pas un événement attaché réel.This syntax resembles an attached event syntax, but the event here is not a true attached event. Au lieu de cela, vous référencez un événement avec un nom qualifié.Instead, you are referencing an event with a qualified name. Pour plus d’informations, consultez vue d’ensemble des événements routés.For more information, see Routed Events Overview.

Dans certains scénarios, les noms de propriétés sont parfois fournis comme valeur d’un attribut, plutôt que le nom de l’attribut.For some scenarios, property names are sometimes provided as the value of an attribute, rather than the attribute name. Ce nom de propriété peut également inclure des qualificateurs, tels que la propriété spécifiée sous la forme ownerType. dependencyPropertyName.That property name can also include qualifiers, such as the property specified in the form ownerType.dependencyPropertyName. Ce scénario est courant lors de l’écriture de styles ou de modèles en XAML.This scenario is common when writing styles or templates in XAML. Les règles de traitement pour les noms de propriété fournies en tant que valeur d’attribut sont différentes et sont régies par le type de la propriété qui est définie ou par les comportements de sous-systèmes WPF particuliers.The processing rules for property names provided as an attribute value are different, and are governed by the type of the property being set or by the behaviors of particular WPF subsystems. Pour plus d’informations, consultez style et création de modèles.For details, see Styling and Templating.

Une autre utilisation pour les noms de propriété est lorsqu’une valeur d’attribut décrit une relation de propriété-propriété.Another usage for property names is when an attribute value describes a property-property relationship. Cette fonctionnalité est utilisée pour la liaison de données et pour les cibles de Storyboard, et est activée par la classe PropertyPath et son convertisseur de type.This feature is used for data binding and for storyboard targets, and is enabled by the PropertyPath class and its type converter. Pour une description plus complète de la sémantique de recherche, consultez syntaxe XAML PropertyPath.For a more complete description of the lookup semantics, see PropertyPath XAML Syntax.

Syntaxe des éléments de propriétéProperty Element Syntax

La syntaxe d’élément de propriété est une syntaxe qui diffère quelque peu des règles de syntaxe XML de base pour les éléments.Property element syntax is a syntax that diverges somewhat from the basic XML syntax rules for elements. Dans XML, la valeur d’un attribut est une chaîne de facto, la seule différence possible étant le format d’encodage de chaîne utilisé.In XML, the value of an attribute is a de facto string, with the only possible variation being which string encoding format is being used. En XAML, vous pouvez assigner d’autres éléments objet comme valeur d’une propriété.In XAML, you can assign other object elements to be the value of a property. Cette fonctionnalité est activée par la syntaxe d’élément de propriété.This capability is enabled by the property element syntax. Au lieu de spécifier la propriété en tant qu’attribut dans la balise d’élément, la propriété est spécifiée à l’aide d’une balise d’élément ouvrante dans elementTypeName. PropertyName , la valeur de la propriété est spécifiée dans, puis l’élément de propriété est fermé.Instead of the property being specified as an attribute within the element tag, the property is specified using an opening element tag in elementTypeName.propertyName form, the value of the property is specified within, and then the property element is closed.

Plus précisément, la syntaxe commence par un chevron gauche (<), suivi immédiatement par le nom de type de la classe ou de la structure dans laquelle la syntaxe d’élément de propriété est contenue.Specifically, the syntax begins with a left angle bracket (<), followed immediately by the type name of the class or structure that the property element syntax is contained within. Il est immédiatement suivi d’un point unique (.), puis du nom d’une propriété, puis d’un chevron droit (>).This is followed immediately by a single dot (.), then by the name of a property, then by a right angle bracket (>). Comme pour la syntaxe d’attribut, cette propriété doit exister dans les membres publics déclarés du type spécifié.As with attribute syntax, that property must exist within the declared public members of the specified type. La valeur à assigner à la propriété est contenue dans l’élément de propriété.The value to be assigned to the property is contained within the property element. En règle générale, la valeur est donnée sous la forme d’un ou plusieurs éléments Object, car la spécification d’objets en tant que valeurs est le scénario que la syntaxe des éléments de propriété est destinée à traiter.Typically, the value is given as one or more object elements, because specifying objects as values is the scenario that property element syntax is intended to address. Enfin, une balise de fermeture équivalente spécifiant le même elementTypeName. la combinaison PropertyName doit être fournie, à des niveaux d’imbrication et d’équilibrage appropriés avec d’autres balises d’élément.Finally, an equivalent closing tag specifying the same elementTypeName.propertyName combination must be provided, in proper nesting and balance with other element tags.

Par exemple, la syntaxe d’élément de propriété suivante est utilisée pour la propriété ContextMenu d’un Button.For example, the following is property element syntax for the ContextMenu property of a 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 dans un élément de propriété peut également être fournie en tant que texte interne, dans les cas où le type de propriété spécifié est un type valeur primitif, tel que String, ou une énumération où un nom est spécifié.The value within a property element can also be given as inner text, in cases where the property type being specified is a primitive value type, such as String, or an enumeration where a name is specified. Ces deux utilisations sont un peu rares, car chacun de ces cas peut également utiliser une syntaxe d’attribut plus simple.These two usages are somewhat uncommon, because each of these cases could also use a simpler attribute syntax. Un scénario de remplissage d’un élément de propriété avec une chaîne est pour les propriétés qui ne sont pas la propriété de contenu XAML mais qui sont toujours utilisées pour la représentation du texte de l’interface utilisateur, et des éléments d’espace blanc particuliers tels que les sauts de ligne doivent apparaître dans le texte de l’interface utilisateur.One scenario for filling a property element with a string is for properties that are not the XAML content property but still are used for representation of UI text, and particular white-space elements such as linefeeds are required to appear in that UI text. La syntaxe d’attribut ne peut pas conserver les sauts de ligne, mais la syntaxe des éléments de propriété peut, tant que la conservation de l’espace blanc significatif est active (pour plus d’informations, consultez traitement des espaces blancs en XAML).Attribute syntax cannot preserve linefeeds, but property element syntax can, so long as significant white-space preservation is active (for details, see White space processing in XAML). Un autre scénario est de sorte que la directive x :uid puisse être appliquée à l’élément de propriété et marque donc la valeur dans comme une valeur qui doit être localisée dans la sortie BAML de WPF ou par d’autres techniques.Another scenario is so that x:Uid Directive can be applied to the property element and thus mark the value within as a value that should be localized in the WPF output BAML or by other techniques.

Un élément de propriété n’est pas représenté dans l’arborescence logique WPF.A property element is not represented in the WPF logical tree. Un élément de propriété est simplement une syntaxe particulière pour la définition d’une propriété, et n’est pas un élément qui a une instance ou un objet qui le sauvegarde.A property element is just a particular syntax for setting a property, and is not an element that has an instance or object backing it. (Pour plus d’informations sur le concept d’arborescence logique, consultez arborescences dans WPF.)(For details on the logical tree concept, see Trees in WPF.)

Pour les propriétés où la syntaxe des attributs et des éléments de propriété est prise en charge, les deux syntaxes ont généralement le même résultat, bien que les subtilités, telles que la gestion des espaces blancs, peuvent varier légèrement entre les syntaxes.For properties where both attribute and property element syntax are supported, the two syntaxes generally have the same result, although subtleties such as white-space handling can vary slightly between syntaxes.

Syntaxe des collectionsCollection Syntax

La spécification XAML exige que les implémentations du processeur XAML identifient les propriétés où le type de valeur est une collection.The XAML specification requires XAML processor implementations to identify properties where the value type is a collection. L’implémentation générale du processeur XAML dans .NET est basée sur le code managé et le CLR, et elle identifie les types de collections par le biais de l’un des éléments suivants :The general XAML processor implementation in .NET is based on managed code and the CLR, and it identifies collection types through one of the following:

Si le type d’une propriété est une collection, le type de collection déduit n’a pas besoin d’être spécifié dans le balisage en tant qu’élément objet.If the type of a property is a collection, then the inferred collection type does not need to be specified in the markup as an object element. Au lieu de cela, les éléments destinés à devenir les éléments de la collection sont spécifiés en tant qu’un ou plusieurs éléments enfants de l’élément de propriété.Instead, the elements that are intended to become the items in the collection are specified as one or more child elements of the property element. Chaque élément de ce type est évalué à un objet pendant le chargement et ajouté à la collection en appelant la méthode Add de la collection implicite.Each such item is evaluated to an object during loading and added to the collection by calling the Add method of the implied collection. Par exemple, la propriété Triggers de Style prend le type de collection spécialisé TriggerCollection, qui implémente IList.For example, the Triggers property of Style takes the specialized collection type TriggerCollection, which implements IList. Il n’est pas nécessaire d’instancier un élément objet TriggerCollection dans le balisage.It is not necessary to instantiate a TriggerCollection object element in the markup. Au lieu de cela, vous spécifiez un ou plusieurs éléments Trigger en tant qu’éléments dans l’élément de propriété Style.Triggers, où Trigger (ou une classe dérivée) est le type attendu comme type d’élément pour le TriggerCollectionfortement typé et implicite.Instead, you specify one or more Trigger items as elements within the Style.Triggers property element, where Trigger (or a derived class) is the type expected as the item type for the strongly typed and implicit TriggerCollection.

<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 pour ce type et les types dérivés, qui est décrit dans la section suivante de cette rubrique.A property may be both a collection type and the XAML content property for that type and derived types, which is discussed in the next section of this topic.

Un élément de collection implicite crée un membre dans la représentation de l’arborescence logique, même s’il n’apparaît pas dans le balisage en tant qu’élément.An implicit collection element creates a member in the logical tree representation, even though it does not appear in the markup as an element. En général, le constructeur du type parent exécute l’instanciation de la collection qui est l’une de ses propriétés, et la collection initialement vide devient partie intégrante de l’arborescence d’objets.Usually the constructor of the parent type performs the instantiation for the collection that is one of its properties, and the initially empty collection becomes part of the object tree.

Notes

Les interfaces de liste et de dictionnaire génériques (IList<T> et IDictionary<TKey,TValue>) ne sont pas prises en charge pour la détection de collection.The generic list and dictionary interfaces (IList<T> and IDictionary<TKey,TValue>) are not supported for collection detection. Toutefois, vous pouvez utiliser la classe List<T> comme classe de base, car elle implémente IList directement, ou Dictionary<TKey,TValue> comme classe de base, car elle implémente IDictionary directement.However, you can use the List<T> class as a base class, because it implements IList directly, or Dictionary<TKey,TValue> as a base class, because it implements IDictionary directly.

Dans les pages de référence .NET pour les types de collection, cette syntaxe avec l’omission délibérée de l’élément objet pour une collection est parfois notée dans les sections de syntaxe XAML comme syntaxe de collection implicite.In the .NET Reference pages for collection types, this syntax with the deliberate omission of the object element for a collection is occasionally noted in the XAML syntax sections as Implicit Collection Syntax.

À l’exception de l’élément racine, chaque élément objet d’un fichier XAML qui est imbriqué en tant qu’élément enfant d’un autre élément est en fait un élément qui est l’un des deux cas suivants : un membre d’une propriété de collection implicite de son élément parent , ou un élément qui spécifie la valeur de la propriété de contenu XAML pour l’élément parent (les propriétés de contenu XAML seront abordées dans une section à venir).With the exception of the root element, every object element in a XAML file that is nested as a child element of another element is really an element that is one or both of the following cases: a member of an implicit collection property of its parent element, or an element that specifies the value of the XAML content property for the parent element (XAML content properties will be discussed in an upcoming section). En d’autres termes, la relation entre les éléments parents et les éléments enfants d’une page de balisage est en fait un objet unique à la racine, et chaque élément objet sous la racine est une instance unique qui fournit une valeur de propriété du parent, ou l’un des éléments au sein d’une col lection qui est également une valeur de propriété de type collection du parent.In other words, the relationship of parent elements and child elements in a markup page is really a single object at the root, and every object element beneath the root is either a single instance that provides a property value of the parent, or one of the items within a collection that is also a collection-type property value of the parent. Ce concept à racine unique est courant avec XML et est fréquemment renforcé dans le comportement des API qui chargent le code XAML, par exemple Load.This single-root concept is common with XML, and is frequently reinforced in the behavior of APIs that load XAML such as Load.

L’exemple suivant est une syntaxe avec l’élément objet pour une collection (GradientStopCollection) spécifiée explicitement.The following example is a syntax with the object element for a collection (GradientStopCollection) specified explicitly.

<LinearGradientBrush>  
  <LinearGradientBrush.GradientStops>  
    <GradientStopCollection>  
      <GradientStop Offset="0.0" Color="Red" />  
      <GradientStop Offset="1.0" Color="Blue" />  
    </GradientStopCollection>  
  </LinearGradientBrush.GradientStops>  
</LinearGradientBrush>  

Notez qu’il n’est pas toujours possible de déclarer explicitement la collection.Note that it is not always possible to explicitly declare the collection. Par exemple, toute tentative de déclaration de TriggerCollection explicitement dans le Triggers exemple précédent échoue.For instance, attempting to declare TriggerCollection explicitly in the previously shown Triggers example would fail. La déclaration explicite de la collection requiert que la classe de collection prenne en charge un constructeur sans paramètre et TriggerCollection n’ait pas de constructeur sans paramètre.Explicitly declaring the collection requires that the collection class must support a parameterless constructor, and TriggerCollection does not have a parameterless constructor.

Propriétés de contenu XAMLXAML Content Properties

La syntaxe de contenu XAML est une syntaxe qui est uniquement activée sur les classes qui spécifient les ContentPropertyAttribute dans le cadre de leur déclaration de classe.XAML content syntax is a syntax that is only enabled on classes that specify the ContentPropertyAttribute as part of their class declaration. Le ContentPropertyAttribute référence le nom de la propriété qui est la propriété de contenu pour ce type d’élément (y compris les classes dérivées).The ContentPropertyAttribute references the property name that is the content property for that type of element (including derived classes). En cas de traitement par un processeur XAML, tout élément enfant ou texte interne trouvé entre les balises d’ouverture et de fermeture de l’élément objet sera assigné comme valeur de la propriété de contenu XAML pour cet objet.When processed by a XAML processor, any child elements or inner text that are found between the opening and closing tags of the object element will be assigned to be the value of the XAML content property for that object. Vous êtes autorisé à spécifier des éléments de propriété explicites pour la propriété de contenu, mais cette utilisation n’est généralement pas indiquée dans les sections de syntaxe XAML de la référence .NET.You are permitted to specify explicit property elements for the content property, but this usage is not generally shown in the XAML syntax sections in the .NET reference. La technique explicite/détaillée a une valeur occasionnelle pour la clarté du balisage ou comme une question de style de balisage, mais en général l’intention d’une propriété de contenu est de rationaliser le balisage afin que les éléments qui sont liés intuitivement comme parent-enfant puissent être imbriqués directement.The explicit/verbose technique has occasional value for markup clarity or as a matter of markup style, but usually the intent of a content property is to streamline the markup so that elements that are intuitively related as parent-child can be nested directly. Les balises d’élément de propriété pour d’autres propriétés sur un élément ne sont pas assignées en tant que « contenu » par une définition de langage XAML stricte ; elles sont traitées précédemment dans l’ordre de traitement de l’analyseur XAML et ne sont pas considérées comme « contenu ».Property element tags for other properties on an element are not assigned as "content" per a strict XAML language definition; they are processed previously in the XAML parser's processing order and are not considered to be "content".

Les valeurs de propriété de contenu XAML doivent être contiguësXAML Content Property Values Must Be Contiguous

La valeur d’une propriété de contenu XAML doit être fournie entièrement avant ou entièrement après tous les autres éléments de propriété sur cet élément objet.The value of a XAML content property must be given either entirely before or entirely after any other property elements on that object element. Cela est vrai si la valeur d’une propriété de contenu XAML est spécifiée en tant que chaîne ou en tant qu’un ou plusieurs objets.This is true whether the value of a XAML content property is specified as a string, or as one or more objects. Par exemple, le balisage suivant n’analyse pas :For example, the following markup does not parse:

<Button>I am a   
  <Button.Background>Blue</Button.Background>  
  blue button</Button>  

Ce n’est pas non plus conforme, car si cette syntaxe a été rendue explicite à l’aide de la syntaxe d’élément de propriété pour la propriété de contenu, la propriété de contenu est définie deux fois :This is illegal essentially because if this syntax were made explicit by using property element syntax for the content property, then the content property would be set twice:

<Button>  
  <Button.Content>I am a </Button.Content>  
  <Button.Background>Blue</Button.Background>  
  <Button.Content> blue button</Button.Content>  
</Button>  

Un exemple similaire non conforme est si la propriété de contenu est une collection et si les éléments enfants sont intercalés avec les éléments de propriété :A similarly illegal example is if the content property is a collection, and child elements are interspersed with property elements:

<StackPanel>  
  <Button>This example</Button>  
  <StackPanel.Resources>  
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>  
  </StackPanel.Resources>  
  <Button>... is illegal XAML</Button>  
</StackPanel>  

Combinaison des propriétés de contenu et de la syntaxe des collectionsContent Properties and Collection Syntax Combined

Pour accepter plus d’un élément objet en tant que contenu, le type de la propriété de contenu doit être spécifiquement un type de collection.In order to accept more than a single object element as content, the type of the content property must specifically be a collection type. Semblable à la syntaxe des éléments de propriété pour les types de collections, un processeur XAML doit identifier les types qui sont des types de collection.Similar to property element syntax for collection types, a XAML processor must identify types that are collection types. Si un élément a une propriété de contenu XAML et que le type de la propriété de contenu XAML est une collection, le type de collection implicite n’a 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 que propriété El endant.If an element has a XAML content property and the type of the XAML content property is a collection, then the implied collection type does not need to be specified in the markup as an object element and the XAML content property does not need to be specified as a property element. Par conséquent, le modèle de contenu apparent dans le balisage peut désormais avoir plusieurs éléments enfants assignés comme contenu.Therefore the apparent content model in the markup can now have more than one child element assigned as the content. Voici la syntaxe de contenu pour une classe dérivée Panel.The following is content syntax for a Panel derived class. Toutes les Panel classes dérivées établissent la propriété de contenu XAML à Children, ce qui requiert une valeur de type UIElementCollection.All Panel derived classes establish the XAML content property to be Children, which requires a value of type UIElementCollection.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://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 la UIElementCollection n’est requis dans le balisage.Note that neither the property element for Children nor the element for the UIElementCollection is required in the markup. Il s’agit d’une fonctionnalité de conception de XAML afin que les éléments contenus de manière récursive qui définissent un Interface utilisateurUI soient représentés de manière plus intuitive sous la forme d’une arborescence d’éléments imbriqués avec des relations d’élément parent-enfant immédiates, sans balises d’élément de propriété ou objets de collection.This is a design feature of XAML so that recursively contained elements that define a Interface utilisateurUI are more intuitively represented as a tree of nested elements with immediate parent-child element relationships, without intervening property element tags or collection objects. En fait, les UIElementCollection ne peuvent pas être spécifiés explicitement dans le balisage en tant qu’élément objet, par conception.In fact, UIElementCollection cannot be specified explicitly in markup as an object element, by design. Comme sa seule utilisation prévue est la collection implicite, UIElementCollection n’expose pas de constructeur sans paramètre public et, par conséquent, ne peut pas être instancié en tant qu’élément objet.Because its only intended use is as an implicit collection, UIElementCollection does not expose a public parameterless constructor and thus cannot be instantiated as an object element.

Combinaison d’éléments de propriété et d’éléments objet dans un objet avec une propriété de contenuMixing Property Elements and Object Elements in an Object with a Content Property

La spécification XAML déclare qu’un processeur XAML peut appliquer que les éléments objets utilisés pour remplir la propriété de contenu XAML dans un élément objet doivent être contigus et ne doivent pas être mélangés.The XAML specification declares that a XAML processor can enforce that object elements that are used to fill the XAML content property within an object element must be contiguous, and must not be mixed. Cette restriction par rapport à la combinaison d’éléments de propriété et de contenu est appliquée par les processeurs XAML WPFWPF.This restriction against mixing property elements and content is enforced by the WPFWPF XAML processors.

Vous pouvez avoir un élément objet enfant comme premier balisage immédiat dans un élément objet.You can have a child object element as the first immediate markup within an object element. Vous pouvez alors introduire des éléments de propriété.Then you can introduce property elements. Ou bien, vous pouvez spécifier un ou plusieurs éléments de propriété, le contenu, puis d’autres éléments de propriété.Or, you can specify one or more property elements, then content, then more property elements. Toutefois, une fois qu’un élément Property suit le contenu, vous ne pouvez pas introduire de contenu supplémentaire, mais vous pouvez uniquement ajouter des éléments de propriété.But once a property element follows content, you cannot introduce any further content, you can only add property elements.

Cette exigence relative à l’ordre des éléments de contenu/propriété ne s’applique pas au texte interne utilisé comme contenu.This content / property element order requirement does not apply to inner text used as content. Toutefois, il s’agit toujours d’un bon style de balisage pour maintenir le texte interne contigu, car un espace blanc significatif sera difficile à détecter visuellement dans le balisage si des éléments de propriété sont intercalés avec du texte interne.However, it is still a good markup style to keep inner text contiguous, because significant white space will be difficult to detect visually in the markup if property elements are interspersed with inner text.

Espaces de noms XAMLXAML Namespaces

Aucun des exemples de syntaxe précédents n’a spécifié un espace de noms XAML autre que l’espace de noms XAML par défaut.None of the preceding syntax examples specified a XAML namespace other than the default XAML namespace. Dans les applications WPFWPF classiques, l’espace de noms XAML par défaut est spécifié comme étant l’espace de noms WPFWPF.In typical WPFWPF applications, the default XAML namespace is specified to be the WPFWPF namespace. Vous pouvez spécifier des espaces de noms XAML autres que l’espace de noms XAML par défaut et toujours utiliser une syntaxe similaire.You can specify XAML namespaces other than the default XAML namespace and still use similar syntax. Toutefois, à tout endroit où une classe est nommée et qui n’est pas accessible dans l’espace de noms XAML par défaut, ce nom de classe doit être précédé du préfixe de l’espace de noms XAML mappé à l’espace de noms CLR correspondant.But then, anywhere where a class is named that is not accessible within the default XAML namespace, that class name must be preceded with the prefix of the XAML namespace as mapped to the corresponding CLR namespace. Par exemple, <custom:Example/> est une syntaxe d’élément objet pour instancier une instance de la classe Example, où l’espace de noms CLR contenant cette classe (et éventuellement les informations d’assembly externe qui contiennent des types de stockage) a été précédemment mappé au préfixe de custom.For example, <custom:Example/> is object element syntax to instantiate an instance of the Example class, where the CLR namespace containing that class (and possibly the external assembly information that contains backing types) was previously mapped to the custom prefix.

Pour plus d’informations sur les espaces de noms XAML, consultez espaces de noms XAML et mappage d’espace de noms pour XAML WPF.For more information about XAML namespaces, see XAML Namespaces and Namespace Mapping for WPF XAML.

Extensions de balisageMarkup Extensions

XAML définit une entité de programmation d’extension de balisage qui permet une séquence d’échappement de la gestion normale du processeur XAML des valeurs d’attribut de chaîne ou des éléments objet, et diffère le traitement à une classe de stockage.XAML defines a markup extension programming entity that enables an escape from the normal XAML processor handling of string attribute values or object elements, and defers the processing to a backing class. 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 d’un caractère autre qu’une accolade fermante (}).The character that identifies a markup extension to a XAML processor when using attribute syntax is the opening curly brace ({), followed by any character other than a closing curly brace (}). La première chaîne qui suit l’accolade ouvrante doit référencer la classe qui fournit le comportement d’extension particulier, où la référence peut omettre la sous-chaîne « extension » si cette sous-chaîne fait partie du nom de la classe true.The first string following the opening curly brace must reference the class that provides the particular extension behavior, where the reference may omit the substring "Extension" if that substring is part of the true class name. Par la suite, un seul espace peut apparaître, puis chaque caractère suivant est utilisé comme entrée par l’implémentation de l’extension, jusqu’à ce que l’accolade fermante soit rencontrée.Thereafter, a single space may appear, and then each succeeding character is used as input by the extension implementation, up until the closing curly brace is encountered.

L’implémentation XAML .NET utilise la classe abstraite MarkupExtension comme base pour toutes les extensions de balisage prises en charge par WPFWPF, ainsi que d’autres infrastructures ou technologies.The .NET XAML implementation uses the MarkupExtension abstract class as the basis for all of the markup extensions supported by WPFWPF as well as other frameworks or technologies. Les extensions de balisage qui WPFWPF spécifiquement implémentent sont souvent destinées à fournir un moyen de référencer d’autres objets existants, ou d’effectuer des références différées aux objets qui seront évalués au moment de l’exécution.The markup extensions that WPFWPF specifically implements are often intended to provide a means to reference other existing objects, or to make deferred references to objects that will be evaluated at run time. Par exemple, une liaison de données WPF simple est effectuée en spécifiant l’extension de balisage {Binding} à la place de la valeur qu’une propriété particulière devrait normalement prendre.For example, a simple WPF data binding is accomplished by specifying the {Binding} markup extension in place of the value that a particular property would ordinarily take. La plupart des extensions de balisage WPF activent une syntaxe d’attribut pour les propriétés où une syntaxe d’attribut n’est pas possible autrement.Many of the WPF markup extensions enable an attribute syntax for properties where an attribute syntax would not otherwise be possible. Par exemple, un objet Style est un type relativement complexe qui contient une série imbriquée d’objets et de propriétés.For example, a Style object is a relatively complex type that contains a nested series of objects and properties. Les styles dans WPF sont généralement définis en tant que ressource dans un ResourceDictionary, puis référencés par l’intermédiaire de l’une des deux extensions de balisage WPF qui demandent une ressource.Styles in WPF are typically defined as a resource in a ResourceDictionary, and then referenced through one of the two WPF markup extensions that request a resource. L’extension de balisage diffère l’évaluation de la valeur de propriété par 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 dans l’exemple suivant :The markup extension defers the evaluation of the property value to a resource lookup and enables providing the value of the Style property, taking type Style, in attribute syntax as in the following example:

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

Ici, StaticResource identifie la classe StaticResourceExtension qui fournit l’implémentation de l’extension de balisage.Here, StaticResource identifies the StaticResourceExtension class providing the markup extension implementation. Le MyStyle de chaîne suivant est utilisé comme entrée pour le constructeur de StaticResourceExtension non défini par défaut, où le paramètre pris dans la chaîne d’extension déclare le ResourceKeydemandé.The next string MyStyle is used as the input for the non-default StaticResourceExtension constructor, where the parameter as taken from the extension string declares the requested ResourceKey. MyStyle est supposé être la valeur x :Key d’un Style défini en tant que ressource.MyStyle is expected to be the x:Key value of a Style defined as a resource. L’utilisation de l' extension de balisage StaticResource demande que la ressource soit utilisée pour fournir la valeur de propriété Style par le biais d’une logique de recherche de ressources statiques au moment du chargement.The StaticResource Markup Extension usage requests that the resource be used to provide the Style property value through static resource lookup logic at load time.

Pour plus d’informations sur les extensions de balisage, consultez Extensions de balisage et XAML WPF.For more information about markup extensions, see Markup Extensions and WPF XAML. Pour obtenir une référence des extensions de balisage et d’autres fonctionnalités de programmation XAML activées dans l’implémentation .NET XAML générale, consultez espace de noms XAML (x :) Fonctionnalités de langage.For a reference of markup extensions and other XAML programming features enabled in the general .NET XAML implementation, see XAML Namespace (x:) Language Features. Pour les extensions de balisage spécifiques à WPF, consultez Extensions XAML WPF.For WPF-specific markup extensions, see WPF XAML Extensions.

Propriétés jointesAttached Properties

Les propriétés jointes sont un concept de programmation introduit dans XAML, selon lequel les propriétés peuvent être détenues et définies par un type particulier, mais définies comme des attributs ou des éléments de propriété sur tout élément.Attached properties are a programming concept introduced in XAML whereby properties can be owned and defined by a particular type, but set as attributes or property elements on any element. Le scénario principal auquel les propriétés jointes sont destinées consiste à permettre aux éléments enfants dans une structure de balisage de rapporter des informations à un élément parent sans avoir besoin d’un modèle d’objet largement partagé sur tous les éléments.The primary scenario that attached properties are intended for is to enable child elements in a markup structure to report information to a parent element without requiring an extensively shared object model across all elements. À l’inverse, les propriétés jointes peuvent être utilisées par les éléments parents pour signaler des informations à des éléments enfants.Conversely, attached properties can be used by parent elements to report information to child elements. Pour plus d’informations sur l’objectif des propriétés jointes et sur la création de vos propres propriétés jointes, consultez vue d’ensemble des propriétésjointes.For more information on the purpose of attached properties and how to create your own attached properties, see Attached Properties Overview.

Les propriétés jointes utilisent une syntaxe qui ressemble superficiellement à la syntaxe des éléments de propriété, en ce que vous spécifiez également un TypeName. combinaison de NomPropriété .Attached properties use a syntax that superficially resembles property element syntax, in that you also specify a typeName.propertyName combination. Il existe deux différences majeures :There are two important differences:

  • Vous pouvez utiliser le TypeName. combinaison de NomPropriété même lors de la définition d’une propriété jointe par le biais de la syntaxe d’attribut.You can use the typeName.propertyName combination even when setting an attached property through attribute syntax. Les propriétés jointes sont le seul cas où le fait de qualifier le nom de la propriété est une exigence dans une syntaxe d’attribut.Attached properties are the only case where qualifying the property name is a requirement in an attribute syntax.

  • Vous pouvez également utiliser la syntaxe d’élément de propriété pour les propriétés jointes.You can also use property element syntax for attached properties. Toutefois, pour la syntaxe d’élément de propriété typique, le TypeName que vous spécifiez est l’élément objet qui contient l’élément de propriété.However, for typical property element syntax, the typeName you specify is the object element that contains the property element. Si vous faites référence à une propriété jointe, TypeName est la classe qui définit la propriété jointe, et non l’élément objet conteneur.If you are referring to an attached property, then the typeName is the class that defines the attached property, not the containing object element.

Événements jointsAttached Events

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 spécifique, mais les gestionnaires peuvent être attachés à n’importe quel élément objet.Attached events are another programming concept introduced in XAML where events can be defined by a specific type, but handlers may be attached on any object element. Dans l’implémentation WOF, souvent le type qui définit un événement attaché est un type statique qui définit un service, et parfois ces événements attachés sont exposés par un alias d’événement routé dans des types qui exposent le service.In the WOF implementation, often the type that defines an attached event is a static type that defines a service, and sometimes those attached events are exposed by a routed event alias in types that expose the service. Les gestionnaires pour les événements attachés sont spécifiés par le biais de la syntaxe d’attribut.Handlers for attached events are specified through attribute syntax. Comme pour les événements attachés, la syntaxe d’attribut est développée pour les événements attachés afin d’autoriser un TypeName. EventName usage, où TypeName est la classe qui fournit Add et Remove accesseurs de gestionnaire d’événements pour l’infrastructure d’événements attachée, et EventName est le nom de l’événement.As with attached events, the attribute syntax is expanded for attached events to allow a typeName.eventName usage, where typeName is the class that provides Add and Remove event handler accessors for the attached event infrastructure, and eventName is the event name.

Anatomie d’un élément racine XAMLAnatomy of a XAML Root Element

Le tableau suivant montre un élément racine XAML classique, qui affiche les attributs spécifiques d’un élément racine :The following table shows a typical XAML root element broken down, showing the specific attributes of a root element:

<Page Ouverture de l’élément objet de l’élément racineOpening object element of the root element
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Espace de noms XAML (WPFWPF) par défautThe default (WPFWPF) XAML namespace
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Espace de noms XAML du langage XAMLThe XAML language XAML namespace
x:Class="ExampleNamespace.ExampleCode" Déclaration de classe partielle qui connecte le balisage à tout code-behind défini pour la classe partielleThe partial class declaration that connects markup to any code-behind defined for the partial class
> Fin de l’élément objet pour la racine.End of object element for the root. L’objet n’est pas encore fermé, car l’élément contient des éléments enfantsObject is not closed yet because the element contains child elements

Utilisations de XAML facultatives et déconseilléesOptional and Nonrecommended XAML Usages

Les sections suivantes décrivent les utilisations XAML techniquement prises en charge par les processeurs XAML, mais qui produisent des commentaires ou d’autres problèmes esthétiques qui interfèrent avec les fichiers XAML qui restent explicites quand vous développez des applications qui contiennent des sources XAML.The following sections describe XAML usages that are technically supported by XAML processors, but that produce verbosity or other aesthetic issues that interfere with XAML files remaining human-readable when you develop applications that contain XAML sources.

Utilisations facultatives des éléments de propriétéOptional Property Element Usages

Les utilisations facultatives des éléments de propriété incluent l’écriture explicite de propriétés de contenu d’élément que le processeur XAML considère comme étant implicites.Optional property element usages include explicitly writing out element content properties that the XAML processor considers implicit. 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 de processeur XAML implicite que tous les éléments enfants d’un Menu doivent être des MenuItem et sont placés dans la collection Items.For example, when you declare the contents of a Menu, you could choose to explicitly declare the Items collection of the Menu as a <Menu.Items> property element tag, and place each MenuItem within <Menu.Items>, rather than using the implicit XAML processor behavior that all child elements of a Menu must be a MenuItem and are placed in the Items collection. Parfois, les utilisations facultatives peuvent aider à clarifier visuellement la structure de l’objet, comme représenté dans le balisage.Sometimes the optional usages can help to visually clarify the object structure as represented in the markup. Ou parfois, une utilisation d’élément de propriété explicite peut éviter le balisage techniquement fonctionnel mais visuellement confus, comme les extensions de balisage imbriquées dans une valeur d’attribut.Or sometimes an explicit property element usage can avoid markup that is technically functional but visually confusing, such as nested markup extensions within an attribute value.

Attributs qualifiés typeName. memberName completsFull typeName.memberName Qualified Attributes

TypeName. le formulaire MemberName d’un attribut fonctionne en fait plus universellement que le seul cas d’événement routé.The typeName.memberName form for an attribute actually works more universally than just the routed event case. Mais dans d’autres situations, la forme est superflue et vous devez l’éviter, si uniquement pour des raisons de style et de lisibilité du balisage.But in other situations that form is superfluous and you should avoid it, if only for reasons of markup style and readability. Dans l’exemple suivant, chacune des trois références à l’attribut Background est complètement équivalente :In the following example, each of the three references to the Background attribute are completely equivalent:

<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 de cette propriété sur Button réussit (Background a été héritée de Control) et Button est la classe de l’élément objet ou d’une classe de base.Button.Background works because the qualified lookup for that property on Button is successful (Background was inherited from Control) and Button is the class of the object element or a base class. Control.Background fonctionne, car la classe Control définit en fait Background et Control est une classe de base Button.Control.Background works because the Control class actually defines Background and Control is a Button base class.

Toutefois, le TypeNamesuivant. l’exemple de formulaire MemberName ne fonctionne pas et est donc représenté par commenté :However, the following typeName.memberName form example does not work and is thus shown commented:

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

Label est une autre classe dérivée de Control, et si vous avez spécifié Label.Background dans un élément objet Label, cette utilisation aurait fonctionné.Label is another derived class of Control, and if you had specified Label.Background within a Label object element, this usage would have worked. Toutefois, étant donné que Label n’est pas la classe ou la classe de base de Button, le comportement de processeur XAML spécifié consiste à traiter Label.Background comme une propriété jointe.However, because Label is not the class or base class of Button, the specified XAML processor behavior is to then process Label.Background as an attached property. Label.Background n’est pas une propriété jointe disponible, et cette utilisation échoue.Label.Background is not an available attached property, and this usage fails.

baseTypeName. memberName, éléments de propriétébaseTypeName.memberName Property Elements

D’une manière analogue à la façon dont le TypeName. le formulaire MemberName fonctionne pour la syntaxe d’attribut, un BaseTypeName. la syntaxe MemberName fonctionne pour la syntaxe des éléments de propriété.In an analogous way to how the typeName.memberName form works for attribute syntax, a baseTypeName.memberName syntax works for property element syntax. Par exemple, la syntaxe suivante fonctionne :For instance, the following syntax works:

<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 Property a été fourni comme Control.Background même si l’élément Property était contenu dans Button.Here, the property element was given as Control.Background even though the property element was contained in Button.

Mais tout comme TypeName. formulaire MemberName pour les attributs, BaseTypeName. MemberName est un style médiocre dans le balisage et vous devez l’éviter.But just like typeName.memberName form for attributes, baseTypeName.memberName is poor style in markup, and you should avoid it.

Voir aussiSee also