Espaces de noms XAML et mappage d'espace de noms pour XAML WPFXAML Namespaces and Namespace Mapping for WPF XAML

Cette rubrique explique plus en détail la présence et la finalité des deux mappages d’espace de noms XAML qui figurent souvent dans la balise racine de chaque fichier XAML WPF.This topic further explains the presence and purpose of the two XAML namespace mappings as often found in the root tag of a WPF XAML file. Elle décrit également comment produire des mappages similaires pour utiliser des éléments définis dans votre propre code et/ou dans des assemblys distincts.It also describes how to produce similar mappings for using elements that are defined in your own code, and/or within separate assemblies.

Qu’est-ce qu’un espace de noms XAML ?What is a XAML Namespace?

Un espace de noms XAML est en réalité une extension du concept d’espace de noms XML.A XAML namespace is really an extension of the concept of an XML namespace. Les techniques de spécification d’un espace de noms XAML reposent sur la syntaxe d’espace de noms XML, la convention de l’utilisation d’URI comme identificateurs d’espaces de noms, à l’aide de préfixes permettant de fournir un moyen de référencer plusieurs espaces de noms à partir de la même source de balise, et ainsi de suite.The techniques of specifying a XAML namespace rely on the XML namespace syntax, the convention of using URIs as namespace identifiers, using prefixes to provide a means to reference multiple namespaces from the same markup source, and so on. Le concept principal de la définition XAML de l’espace de noms XML est qu’un espace de noms XAML implique une portée d’unicité pour les utilisations de balisage et qu’il influence également la façon dont les entités de balisage sont potentiellement associées aux espaces de noms CLR spécifiques et aux assemblys référencés.The primary concept that is added to the XAML definition of the XML namespace is that a XAML namespace implies both a scope of uniqueness for the markup usages, and also influences how markup entities are potentially backed by specific CLR namespaces and referenced assemblies. Cette dernière considération est également influencée par le concept d’un contexte de schéma XAML.This latter consideration is also influenced by the concept of a XAML schema context. Pour comprendre comment WPF fonctionne avec les espaces de noms XAML, imaginez les espaces de noms XAML en termes d’espaces de noms XAML par défaut, d’espace de noms de langage XAML et tout espace de noms XAML supplémentaire mappé directement par votre balisage XAML aux espaces de noms CLR de stockage spécifiques et assemblys référencés.But for purposes of how WPF works with XAML namespaces, you can generally think of XAML namespaces in terms of a default XAML namespace, the XAML language namespace, and any further XAML namespaces as mapped by your XAML markup directly to specific backing CLR namespaces and referenced assemblies.

Déclarations des espaces de noms XAML et WPFThe WPF and XAML Namespace Declarations

Il y a généralement deux déclarations d’espaces de noms XML dans les déclarations d’espace de noms figurant dans la balise racine de nombreux fichiers XAML.Within the namespace declarations in the root tag of many XAML files, you will see that there are typically two XML namespace declarations. La première déclaration mappe l’espace de noms XAML général du client ou du framework WPF comme valeur par défaut :The first declaration maps the overall WPF client / framework XAML namespace as the default:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

La deuxième déclaration mappe (généralement) un espace de noms XAML distinct au préfixe x:.The second declaration maps a separate XAML namespace, mapping it (typically) to the x: prefix.

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

La relation entre ces déclarations est la suivante : le mappage du préfixe x: prend en charge les intrinsèques qui font partie de la définition de langage XAML ; WPFWPF est une implémentation qui utilise XAML comme langage et définit un vocabulaire de ses objets pour XAML.The relationship between these declarations is that the x: prefix mapping supports the intrinsics that are part of the XAML language definition, and WPFWPF is one implementation that uses XAML as a language and defines a vocabulary of its objects for XAML. Étant donné que les utilisations du vocabulaire WPF sont beaucoup plus courantes que les utilisations des intrinsèques XAML, le vocabulaire WPF est mappé comme valeur par défaut.Because the WPF vocabulary's usages will be far more common than the XAML intrinsics usages, the WPF vocabulary is mapped as the default.

La Convention de préfixe x: pour le mappage de la prise en charge des intrinsèques du langage XAML est suivie de modèles de projet, d’exemples de code et de la documentation des fonctionnalités de langage dans ce kit de développement logiciel (SDK).The x: prefix convention for mapping the XAML language intrinsics support is followed by project templates, sample code, and the documentation of language features within this SDK. L’espace de noms XAML définit de nombreuses fonctions courantes qui sont nécessaires, notamment pour les applications WPF de base.The XAML namespace defines many commonly-used features that are necessary even for basic WPF applications. Par exemple, pour joindre tout code-behind à un fichier XAML par le biais d’une classe partielle, vous devez nommer cette classe comme attribut x:Class dans l’élément racine du fichier XAML approprié.For instance, in order to join any code-behind to a XAML file through a partial class, you must name that class as the x:Class attribute in the root element of the relevant XAML file. Ou bien, tout élément tel qu’il est défini dans une page XAML à laquelle vous souhaitez accéder comme une ressource à clé doit avoir l’attribut x:Key défini par l’élément en question.Or, any element as defined in a XAML page that you wish to access as a keyed resource should have the x:Key attribute set on the element in question. Pour plus d’informations sur ces questions et d’autres aspects du langage XAML, consultez Vue d’ensemble du langage XAML (WPF) ou Syntaxe XAML en détail.For more information on these and other aspects of XAML see XAML Overview (WPF) or XAML Syntax In Detail.

Mappage aux classes et assemblys personnalisésMapping to Custom Classes and Assemblies

Vous pouvez mapper des espaces de noms XML à des assemblys à l’aide d’une série de jetons dans une déclaration de préfixe xmlns, de la même manière que les espaces de noms XAML WPF et XAML intrinsèques standard sont mappés aux préfixes.You can map XML namespaces to assemblies using a series of tokens within an xmlns prefix declaration, similar to how the standard WPF and XAML-intrinsics XAML namespaces are mapped to prefixes.

La syntaxe prend les valeurs et les jetons nommés possibles suivants :The syntax takes the following possible named tokens and following values:

clr-namespace: Espace de noms CLR déclaré dans l’assembly contenant les types publics à exposer comme éléments.clr-namespace: The CLR namespace declared within the assembly that contains the public types to expose as elements.

assembly= l’assembly qui contient tout ou partie de l’espace de noms CLR référencé.assembly= The assembly that contains some or all of the referenced CLR namespace. En général, cette valeur est simplement le nom de l’assembly, pas le chemin, et n’inclut pas l’extension (comme .dll ou .exe).This value is typically just the name of the assembly, not the path, and does not include the extension (such as .dll or .exe). Le chemin à cet assembly doit être établi comme référence de projet dans le fichier projet qui contient le XAML que vous essayez de mapper.The path to that assembly must be established as a project reference in the project file that contains the XAML you are trying to map. Pour incorporer le contrôle de version et la signature avec nom fort, la valeur assembly peut être une chaîne telle que définie par AssemblyName, plutôt que le nom de la chaîne simple.In order to incorporate versioning and strong-name signing, the assembly value can be a string as defined by AssemblyName, rather than the simple string name.

Notez que le jeton clr-namespace est séparé de sa valeur par deux-points (:), alors que le caractère qui sépare le jeton assembly de sa valeur est le signe égal (=).Note that the character separating the clr-namespace token from its value is a colon (:) whereas the character separating the assembly token from its value is an equals sign (=). Le caractère à utiliser entre ces deux jetons est un point-virgule.The character to use between these two tokens is a semicolon. En outre, n’incluez pas d’espace blanc n’importe où dans la déclaration.Also, do not include any white space anywhere in the declaration.

Exemple de mappage personnalisé de baseA Basic Custom Mapping Example

Le code suivant définit un exemple de classe personnalisée :The following code defines an example custom class:

namespace SDKSample {  
    public class ExampleClass : ContentControl {  
        public ExampleClass() {  
        ...  
        }  
    }  
}  
Namespace SDKSample  
    Public Class ExampleClass  
        Inherits ContentControl  
         ...  
        Public Sub New()  
        End Sub  
    End Class  
End Namespace  

Cette classe personnalisée est ensuite compilée dans une bibliothèque qui, conformément aux paramètres du projet (non affichés), est nommée SDKSampleLibrary.This custom class is then compiled into a library, which per the project settings (not shown) is named SDKSampleLibrary.

Pour référencer cette classe personnalisée, vous devez également l’inclure comme référence pour votre projet actuel, comme vous le feriez à l’aide de l’interface utilisateur de l’Explorateur de solutions dans Visual Studio.In order to reference this custom class, you also need to include it as a reference for your current project, which you would typically do using the Solution Explorer UI in Visual Studio.

Maintenant que vous avez une bibliothèque qui contient une classe, ainsi qu’une référence à cette bibliothèque dans les paramètres du projet, vous pouvez ajouter le mappage de préfixe suivant comme élément de votre élément racine dans le code XAML :Now that you have a library containing a class, and a reference to it in project settings, you can add the following prefix mapping as part of your root element in XAML:

xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary"

Pour résumer, le code suivant est du code XAML qui inclut le mappage personnalisé avec la valeur par défaut typique et les mappages x: dans la balise racine, puis utilise une référence préfixée pour instancier ExampleClass dans cette interface utilisateur :To put it all together, the following is XAML that includes the custom mapping along with the typical default and x: mappings in the root tag, then uses a prefixed reference to instantiate ExampleClass in that UI:

<Page x:Class="WPFApplication1.MainPage"  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary">  
  ...  
  <custom:ExampleClass/>  
...  
</Page>  

Mappage aux assemblys actuelsMapping to Current Assemblies

assembly peut être omis si le clr-namespace référencé est défini dans le même assembly que le code d’application qui fait référence aux classes personnalisées.assembly can be omitted if the clr-namespace referenced is being defined within the same assembly as the application code that is referencing the custom classes. Une syntaxe équivalente dans ce cas consiste à spécifier assembly=, sans jeton de chaîne après le signe égal.Or, an equivalent syntax for this case is to specify assembly=, with no string token following the equals sign.

Les classes personnalisées ne peuvent pas être utilisées comme élément racine d’une page si elles sont définies dans le même assembly.Custom classes cannot be used as the root element of a page if defined in the same assembly. Les classes partielles ne doivent pas être mappées ; seules les classes qui ne sont pas la classe partielle d’une page dans votre application doivent être mappées si vous prévoyez de les référencer comme éléments dans le code XAML.Partial classes do not need to be mapped; only classes that are not the partial class of a page in your application need to be mapped if you intend to reference them as elements in XAML.

Mappage d’espaces de noms CLR à des espaces de noms XML dans un assemblyMapping CLR Namespaces to XML Namespaces in an Assembly

WPF définit un attribut CLR qui est consommé par les processeurs XAML pour mapper plusieurs espaces de noms CLR à un espace de noms XAML unique.WPF defines a CLR attribute that is consumed by XAML processors in order to map multiple CLR namespaces to a single XAML namespace. Cet attribut, XmlnsDefinitionAttribute, est placé au niveau de l’assembly dans le code source qui produit l’assembly.This attribute, XmlnsDefinitionAttribute, is placed at the assembly level in the source code that produces the assembly. Le code source de l’assembly WPF utilise cet attribut pour mapper les différents espaces de noms communs, tels que System.Windows et System.Windows.Controls, à l’espace de noms http://schemas.microsoft.com/winfx/2006/xaml/presentation.The WPF assembly source code uses this attribute to map the various common namespaces, such as System.Windows and System.Windows.Controls, to the http://schemas.microsoft.com/winfx/2006/xaml/presentation namespace.

L' XmlnsDefinitionAttribute accepte deux paramètres : le nom de l’espace de noms XML/XAML et le nom de l’espace de noms CLR.The XmlnsDefinitionAttribute takes two parameters: the XML/XAML namespace name, and the CLR namespace name. Plusieurs XmlnsDefinitionAttribute peuvent exister pour mapper plusieurs espaces de noms CLR à un même espace de noms XML.More than one XmlnsDefinitionAttribute can exist to map multiple CLR namespaces to the same XML namespace. Une fois mappés, les membres de ces espaces de noms peuvent également être référencés sans qualification complète, si vous le souhaitez, en fournissant l’instruction using appropriée dans la page code-behind de la classe partielle.Once mapped, members of those namespaces can also be referenced without full qualification if desired by providing the appropriate using statement in the partial-class code-behind page. Pour plus d'informations, consultez XmlnsDefinitionAttribute.For more details, see XmlnsDefinitionAttribute.

Espaces de noms concepteurs et autres préfixes de modèles XAMLDesigner Namespaces and Other Prefixes From XAML Templates

Si vous travaillez avec les environnements de développement et/ou les outils de conception pour XAML WPF, vous remarquerez peut-être qu’il existe d’autres espaces de noms/préfixes XAML définis dans le balisage XAML.If you are working with development environments and/or design tools for WPF XAML, you may notice that there are other defined XAML namespaces / prefixes within the XAML markup.

Le Concepteur WPF pour Visual Studio utilise un espace de noms de concepteur qui est généralement mappé au préfixe d:.WPF Designer for Visual Studio uses a designer namespace that is typically mapped to the prefix d:. Les modèles de projet plus récents pour WPF peuvent prémapper cet espace de noms XAML pour prendre en charge l’échange du XAML entre le Concepteur WPF pour Visual Studio et d’autres environnements de conception.More recent project templates for WPF might pre-map this XAML namespace to support interchange of the XAML between WPF Designer for Visual Studio and other design environments. Cet espace de noms de conception XAML permet de perpétuer l’état de conception pendant les allers-retours de l’interface utilisateur basée sur XAML dans le concepteur.This design XAML namespace is used to perpetuate design state while roundtripping XAML-based UI in the designer. Il est également utilisé pour les fonctionnalités telles que d:IsDataSource, qui activent des sources de données du runtime dans un concepteur.It is also used for features such as d:IsDataSource, which enable runtime data sources in a designer.

Un autre préfixe que vous pouvez voir mappé est mc:.Another prefix you might see mapped is mc:. mc: est destiné à la compatibilité du balisage et exploite un modèle de compatibilité du balisage qui n’est pas nécessairement spécifique au XAML.mc: is for markup compatibility, and is leveraging a markup compatibility pattern that is not necessarily XAML-specific. Dans une certaine mesure, les fonctionnalités de compatibilité du balisage peuvent être utilisées pour échanger XAML entre les frameworks ou sur d’autres limites d’implémentation de stockage pour travailler entre des contextes de schémas XAML, fournir la compatibilité pour des modes limités dans les concepteurs, etc.To some extent, the markup compatibility features can be used to exchange XAML between frameworks or across other boundaries of backing implementation, work between XAML schema contexts, provide compatibility for limited modes in designers, and so on. Pour plus d’informations sur les concepts de compatibilité du balisage et leurs rapports à WPF, consultez Fonctionnalités de langage pour la compatibilité du balisage (mc:).For more information on markup compatibility concepts and how they relate to WPF, see Markup Compatibility (mc:) Language Features.

WPF et chargement des assemblysWPF and Assembly Loading

Le contexte de schéma XAML pour WPF s’intègre au modèle d’application WPF, qui à son tour utilise le concept défini par le CLR de AppDomain.The XAML schema context for WPF integrates with the WPF application model, which in turn uses the CLR-defined concept of AppDomain. La séquence suivante décrit comment le contexte de schéma XAML interprète comment charger les assemblys ou rechercher les types au moment de l’exécution ou de la conception, en fonction de l’utilisation de WPF de AppDomain et d’autres facteurs.The following sequence describes how XAML schema context interprets how to either load assemblies or find types at run time or design time, based on the WPF use of AppDomain and other factors.

  1. Itérez au sein de la AppDomain, en recherchant un assembly déjà chargé qui correspond à tous les aspects du nom, à partir de l’assembly le plus récemment chargé.Iterate through the AppDomain, looking for an already-loaded assembly that matches all aspects of the name, starting from the most recently loaded assembly.

  2. Si le nom est qualifié, appelez Assembly.Load(String) sur le nom qualifié.If the name is qualified, call Assembly.Load(String) on the qualified name.

  3. Si combinaison nom court + jeton de clé publique d’un nom qualifié correspond à l’assembly à partir duquel le balisage a été chargé, retournez cet assembly.If the short name + public key token of a qualified name matches the assembly that the markup was loaded from, return that assembly.

  4. Utilisez le nom abrégé + jeton de clé publique pour appeler Assembly.Load(String).Use the short name + public key token to call Assembly.Load(String).

  5. Si le nom n’est pas qualifié, appelez Assembly.LoadWithPartialName.If the name is unqualified, call Assembly.LoadWithPartialName.

Le XAML libre n’utilise pas l’étape 3 ; il n’y a pas de chargement à partir de l’assembly.Loose XAML does not use Step 3; there is no loaded-from assembly.

Le XAML compilé pour WPF (généré via XamlBuildTask) n’utilise pas les assemblys déjà chargés à partir de AppDomain (étape 1).Compiled XAML for WPF (generated via XamlBuildTask) does not use the already-loaded assemblies from AppDomain (Step 1). En outre, le nom ne doit jamais être non qualifié à partir de la sortie de XamlBuildTask ; donc l’étape 5 ne s’applique pas.Also, the name should never be unqualified from XamlBuildTask output, so Step 5 does not apply.

Le BAML compilé (généré par l’intermédiaire de PresentationBuildTask) utilise toutes les étapes, bien que le BAML ne doit pas contenir de noms d’assembly non qualifiés.Compiled BAML (generated via PresentationBuildTask) uses all steps, although BAML also should not contain unqualified assembly names.

Voir aussiSee also