XAML-Namespaces und Namespacezuordnung für WPF-XAMLXAML Namespaces and Namespace Mapping for WPF XAML

Diesem Thema bietet weitere Erläuterungen zu Vorhandensein und Zweck der beiden XAML-Namespacezuordnungen, die häufig im Stammelement einer WPF XAML-Datei zu finden sind.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. Es wird ebenfalls beschrieben, wie Sie ähnliche Zuordnungen für Elemente in Ihrem eigenen Code und/oder separaten Assemblys erstellen können.It also describes how to produce similar mappings for using elements that are defined in your own code, and/or within separate assemblies.

Was ist ein XAML-Namespace?What is a XAML Namespace?

Ein XAML-Namespace ist eine Erweiterung des Konzepts eines XML-Namespaces.A XAML namespace is really an extension of the concept of an XML namespace. Die Techniken zum Angeben eines XAML-Namespaces basieren auf der XML-Namespace-Syntax, der Konvention für die Verwendung von URIs als Namespacebezeichner, der Verwendung von Präfixen als Mittel zur Referenzierung mehrerer Namespaces aus derselben Markupquelle und so weiter.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. Das primäre Konzept, das der XAML-Definition des XML-Namespaces hinzugefügt wird, ist, dass ein XAML-Namespace einen eindeutigen Bereich für Markupverwendungen schafft und außerdem beeinflusst, wie Markupentitäten potenziell von bestimmten CLR-Namespaces und referenzierten Assemblys unterstützt wird.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. Letzteres wird auch durch das Konzept eines XAML-Schemakontexts beeinflusst.This latter consideration is also influenced by the concept of a XAML schema context. Was die Funktionsweise von WPF mit XAML-Namespaces angeht, reicht es jedoch, von XAML-Namespaces als die Kombination aus einem standardmäßigen XAML-Namespace, dem XAML-Sprachnamespace und weiteren, für die direkte Zuordnung von XAML-Markup zu bestimmten unterstützenden CLR-Namespaces und referenzierten Assemblys XAML-Namespaces verwendeten XAML-Namespaces zu reden.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.

Deklarationen der WPF- und XAML-NamespacesThe WPF and XAML Namespace Declarations

Innerhalb der Namespacedeklarationen im Stammelement vieler XAML-Dateien sehen Sie, dass in der Regel zwei XML-Namespacedeklarationen vorhanden sind.Within the namespace declarations in the root tag of many XAML files, you will see that there are typically two XML namespace declarations. Die erste Deklaration ordnet den gesamten WPF-Client/Framework-XAML-Namespace als Standard zu:The first declaration maps the overall WPF client / framework XAML namespace as the default:

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

Die zweite Deklaration ordnet einen separaten XAML-Namespace (normalerweise) dem x:-Präfix zu.The second declaration maps a separate XAML namespace, mapping it (typically) to the x: prefix.

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

Die Beziehung zwischen diesen beiden Deklaration ist, dass die x:-Präfix-Zuordnung die in der XAML-Sprache definierten Basiselemente auszeichnet, während WPFWPF eine Implementierung ist, die XAML als Sprache nutzt und ein Vokabular seiner eigenen Objekte für XAML definiert.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. Da die Verwendung von WPF-Vokabular weitaus häufiger als die Verwendung von XAML-Interna sein wird, wird das WPF-Vokabular als Standard zugeordnet.Because the WPF vocabulary's usages will be far more common than the XAML intrinsics usages, the WPF vocabulary is mapped as the default.

Nach der x:-Präfix-Konvention für die Zuordnung der Unterstützung für die systeminternen Funktionen der XAML-Sprache folgen Projektvorlagen, Beispielcode und die Dokumentation der Sprachfeatures in diesem SDKSDK.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 SDKSDK. Der XAML-Namespace definiert viele häufig verwendete Funktionen, die auch für einfache WPF-Anwendung erforderlich sind.The XAML namespace defines many commonly-used features that are necessary even for basic WPF applications. Um beispielsweise CodeBehind mittels einer partiellen Klasse zu einer XAML-Datei hinzuzufügen, müssen Sie diese Klasse als x:Class-Attribut im Stammelement der relevanten XAML-Datei benennen.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. Genauer: Sie müssen für jedes in einer XAML-Seite definierte Element, auf das Sie als mit einem Schlüssel versehene Ressource zugreifen möchten, ein entsprechendes x:Key-Attribut setzen.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. Weitere Informationen zu diesen und anderen Aspekten von XAML finden Sie unter Übersicht über XAML (WPF) oder Ausführliche Erläuterung der XAML-Syntax.For more information on these and other aspects of XAML see XAML Overview (WPF) or XAML Syntax In Detail.

Zuordnen von Benutzerdefinierten Klassen und AssemblysMapping to Custom Classes and Assemblies

Sie können XML-Namespaces bestimmten Assemblys mittels einer Reihe von Token mit xmlns-Präfixdeklaration zuordnen, ähnlich wie die standardmäßigen WPF- und XAML-Interna Präfixen im XAML-Namespace zugeordnet sind.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.

Die Syntax akzeptiert die folgenden möglichen benannten Token und die folgenden Werte:The syntax takes the following possible named tokens and following values:

clr-namespace: Der CLR-Namespace, der innerhalb der Assembly deklariert ist, die die öffentlichen Typen enthält, welche als Elemente verfügbar gemacht werden sollen.clr-namespace: The CLR namespace declared within the assembly that contains the public types to expose as elements.

assembly= Die Assembly, die einige oder alle der CLRCLR-Namespaces enthält, auf die verwiesen wird.assembly= The assembly that contains some or all of the referenced CLRCLR namespace. Dieser Wert ist in der Regel nur der Name der Assembly, nicht der Pfad zu ihr, und er schließt nicht die Erweiterung (z.B. .dll oder .exe) ein.This value is typically just the name of the assembly, not the path, and does not include the extension (such as .dll or .exe). Der Pfad zu dieser Assembly muss als Projektreferenz in der Projektdatei hergestellt werden, die das zuzuordnende XAML enthält.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. Um Versionierung und Signierung mit starkem Namen, integrieren den assembly Wert kann eine Zeichenfolge gemäß AssemblyName, anstatt den einfachen Namen.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.

Beachten Sie, dass als Trennzeichen zwischen clr-namespace-Token und dessen Wert ein Doppelpunkt (:) verwendet wird, während der assembly-Token von seinem Wert mit einem Gleichheitszeichen (=) getrennt ist.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 (=). Das zwischen diesen beiden Token zu verwendende Zeichen ist ein Semikolon.The character to use between these two tokens is a semicolon. Darüber hinaus enthalten Sie keine Leerstellen an einer beliebigen Stelle in der Deklaration.Also, do not include any white space anywhere in the declaration.

Ein Beispiel für einfache benutzerdefinierte ZuordnungA Basic Custom Mapping Example

Der folgende Code definiert eine benutzerdefinierte Beispielklasse: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  

Diese benutzerdefinierte Klasse wird dann in eine Bibliothek kompiliert, die gemäß den (nicht dargestellten) Projekteinstellungen SDKSampleLibrary heißt.This custom class is then compiled into a library, which per the project settings (not shown) is named SDKSampleLibrary.

Um auf diese benutzerdefinierte Klasse zu verweisen, müssen Sie diese auch als Verweis für das aktuelle Projekt hinzufügen. Dazu nutzen Sie in der Regel die Projektmappen-Explorer-Benutzeroberfläche in 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.

Nun, da Sie eine Bibliothek mit einer Klasse und einen Verweis darauf in den Projekteinstellungen haben, können Sie die folgende Präfix-Zuordnung als Teil des XAML-Stammelements hinzufügen: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"

Zusammenfassend sehen Sie im Folgenden den XAML-Code mit der benutzerdefinierten Zuordnung, zusammen mit den herkömmlichen Zuordnungen und den x:-Zuordnungen im Stammelement, der dann einen Verweis mittels Präfix verwendet, um ExampleClass in der Benutzeroberfläche zu instanziieren: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>  

Zuordnen von aktuellen AssemblysMapping to Current Assemblies

assembly kann ausgelassen werden, wenn die referenzierte clr-namespace innerhalb der gleichen Assembly wie der Anwendungscode definiert ist, der auf die benutzerdefinierten Klassen verweist.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. Eine alternative Syntax für diesen Fall ist die Angabe assembly=, ohne Zeichenfolgetoken nach dem Gleichheitszeichen.Or, an equivalent syntax for this case is to specify assembly=, with no string token following the equals sign.

Benutzerdefinierte Klassen können nicht als Stammelement einer Seite verwendet werden, wenn sie in der gleichen Assembly definiert sind.Custom classes cannot be used as the root element of a page if defined in the same assembly. Partielle Klassen müssen nicht zugeordnet werden. Es müssen nur Klassen zugeordnet werden, die keine partielle Klasse einer Seite in Ihrer Anwendung sind, wenn Sie auf diese als Elemente in XAML verweisen möchten.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.

Zuordnen von CLR-Namespaces zu XML-Namespaces in einer AssemblyMapping CLR Namespaces to XML Namespaces in an Assembly

WPF definiert ein CLR-Attribut, das von XAML-Prozessoren verwendet wird, um mehrere CLR-Namespaces einem einzigen XAML-Namespace zuzuordnen.WPF defines a CLR attribute that is consumed by XAML processors in order to map multiple CLR namespaces to a single XAML namespace. Dieses Attribut XmlnsDefinitionAttribute, befindet sich auf der Assemblyebene im Quellcode, der die Assembly erzeugt.This attribute, XmlnsDefinitionAttribute, is placed at the assembly level in the source code that produces the assembly. Der Quellcode der WPF-Assembly verwendet dieses Attribut, um die verschiedenen allgemeinen Namespaces wie z. B. zuzuordnen System.Windows und System.Windows.Controls, zu der http://schemas.microsoft.com/winfx/2006/xaml/presentation Namespace.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.

Die XmlnsDefinitionAttribute akzeptiert zwei Parameter: den Namen der XML/XAML-Namespace und Name des CLR-Namespaces.The XmlnsDefinitionAttribute takes two parameters: the XML/XAML namespace name, and the CLR namespace name. Mehr als eine XmlnsDefinitionAttribute kann vorhanden sein, um mehrere CLR-Namespaces demselben XML-Namespace zuzuordnen.More than one XmlnsDefinitionAttribute can exist to map multiple CLR namespaces to the same XML namespace. Sind diese einmal zugeordnet, kann in der CodeBehind-Seite der partiellen Klasse auf Mitglieder dieser Namespaces auf Wunsch auch ohne vollqualifizierten Bezeichner durch Angabe des entsprechenden using-Statements verwiesen werden.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. Weitere Informationen finden Sie unter XmlnsDefinitionAttribute.For more details, see XmlnsDefinitionAttribute.

Designer-Namespaces und andere Präfixe aus XAML-VorlagenDesigner Namespaces and Other Prefixes From XAML Templates

Wenn Sie mit Entwicklungsumgebungen und/oder Entwurfstools für WPF-XAML arbeiten, werden Sie bemerken, dass es im XAML-Markup weitere definierte XAML-Namespaces/Präfixe gibt.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.

WPF-Designer für Visual StudioWPF Designer for Visual Studio verwendet einen Designer-Namespace, der üblicherweise dem Präfix d: zugeordnet ist.uses a designer namespace that is typically mapped to the prefix d:. Neuere Projektvorlagen für WPF ordnen dieses Präfix möglicherweise bereits im Vorfeld zu, um den Austausch von XAML zwischen WPF-Designer für Visual StudioWPF Designer for Visual Studio und andere Entwurfsumgebungen zu unterstützen.More recent project templates for WPF might pre-map this XAML namespace to support interchange of the XAML between WPF-Designer für Visual StudioWPF Designer for Visual Studio and other design environments. Dieser XAML-Designer-Namespace wird verwendet, um bei Roundtrips von XAML-basierten Benutzeroberflächen den jeweiligen Stand des Designs festzuhalten.This design XAML namespace is used to perpetuate design state while roundtripping XAML-based UI in the designer. Er wird ebenfalls für Funktionen wie z.B. d:IsDataSource verwendet, die die Laufzeit-Datenquellen in einem Designer aktivieren.It is also used for features such as d:IsDataSource, which enable runtime data sources in a designer.

Ein anderes Präfix, dessen Zuordnung Sie möglicherweise sehen können, ist mc:.Another prefix you might see mapped is mc:. mc: dient der Markupkompatibilität. Dabei wird ein Markup-Kompatibilitätsmuster wiederverwendet, das nicht unbedingt XAML-spezifisch ist.mc: is for markup compatibility, and is leveraging a markup compatibility pattern that is not necessarily XAML-specific. In gewissem Umfang können die Markupkompatibilitäts-Funktionen verwendet werden, um XAML zwischen Frameworks oder grenzübergreifend mit unterstützenden Implementierungen auszutauschen, zwischen verschiedenen XAML-Schema-Kontexten zu arbeiten, Kompatibilität für eingeschränkte Modi in Designern bereitzustellen, und so weiter.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. Weitere Informationen zu Markupkompatibilitätskonzepten und deren Beziehung zu WPF, finden Sie unter Markupkompatibilität (Mc:) Sprachfunktionen.For more information on markup compatibility concepts and how they relate to WPF, see Markup Compatibility (mc:) Language Features.

WPF und Laden von AssemblysWPF and Assembly Loading

Der XAML-Schemakontext für WPF-Integration mit dem WPF-Anwendungsmodell, die wiederum die CLR definierte Konzept von AppDomain.The XAML schema context for WPF integrates with the WPF application model, which in turn uses the CLR-defined concept of AppDomain. Die folgende Sequenz beschreibt, wie XAML-Schemakontext interpretiert, wie Assemblys geladen werden oder finden von Typen zur Laufzeit oder Entwurfszeit basierend auf der WPF-Verwendung von AppDomain und anderen Faktoren.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. Durchlaufen der AppDomain, Suchen nach einer bereits geladenen Assembly mit allen Aspekten des Namens, des zuletzt geladenen Assembly wird gestartet.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. Wenn der Name qualifiziert ist, rufen Sie Assembly.Load(String) für den qualifizierten Namen.If the name is qualified, call Assembly.Load(String) on the qualified name.

  3. Wenn der Kurzname und das öffentliche Schlüsseltoken eines qualifizierten Namens mit der Assembly übereinstimmen, aus der das Markup geladen wurde, gib diese Assembly zurück.If the short name + public key token of a qualified name matches the assembly that the markup was loaded from, return that assembly.

  4. Verwenden Sie zum Aufrufen der Kurzname und das Token des öffentlichen Schlüssels Assembly.Load(String).Use the short name + public key token to call Assembly.Load(String).

  5. Wenn der Name nicht qualifiziert ist, rufen Sie Assembly.LoadWithPartialName.If the name is unqualified, call Assembly.LoadWithPartialName.

Loose XAML verwendet Schritt 3 nicht, da es nicht aus Assemblys geladen wird.Loose XAML does not use Step 3; there is no loaded-from assembly.

Kompilierte XAML für WPF (mithilfe XamlBuildTask generiert) verwendet nicht die bereits geladenen Assemblys aus AppDomain (Schritt 1).Compiled XAML for WPF (generated via XamlBuildTask) does not use the already-loaded assemblies from AppDomain (Step 1). Darüber hinaus sollte der aus XamlBuildTask resultierende Name nie unqualifiziert sein, weshalb Schritt 5 hier nicht anwendbar ist.Also, the name should never be unqualified from XamlBuildTask output, so Step 5 does not apply.

Kompiliertes BAML (mit PresentationBuildTask generiert) verwendet alle Schritte, obwohl auch BAML keine unqualifizierten Assemblynamen enthalten sollte.Compiled BAML (generated via PresentationBuildTask) uses all steps, although BAML also should not contain unqualified assembly names.

Siehe auchSee also