Freigeben über


XAML Namespaces für .NET-XAML-Dienste

Ein XAML-Namespace ist ein Konzept, das die Definition eines XML-Namespaces erweitert. Ähnlich wie bei einem XML-Namespace können Sie einen XAML-Namespace mithilfe eines xmlns-Attributs im Markup definieren. XAML-Namespaces werden auch im XAML-Knotendatenstrom und anderen XAML-Dienste-APIs dargestellt. In diesem Thema wird das XAML-Namespacekonzept definiert und beschrieben, wie XAML-Namespaces definiert und von XAML-Schemakontexten und anderen Aspekten von .NET XAML-Diensten verwendet werden können.

XML-Namespace und XAML-Namespace

Ein XAML-Namespace ist ein spezialisierter XML-Namespace, genauso wie XAML eine spezielle Form von XML ist und das grundlegende XML-Formular für sein Markup verwendet. In Markup deklarieren Sie einen XAML-Namespace und dessen Zuordnung durch ein Attribut, das auf ein xmlns-Element angewendet wird. Die xmlns-Deklaration kann an dasselbe Element vorgenommen werden, in dem der XAML-Namespace deklariert wird. Eine XAML-Namespacedeklaration, die an ein Element vorgenommen wurde, ist gültig für dieses Element, alle Attribute dieses Elements und alle untergeordneten Elemente dieses Elements. Attribute können einen XAML-Namespace verwenden, der nicht dem Element entspricht, das das Attribut enthält, solange der Attributname selbst auf das Präfix als Teil seines Attributnamens im Markup verweist.

Der Unterschied eines XAML-Namespaces gegenüber einem XML-Namespace besteht darin, dass ein XML-Namespace verwendet werden kann, um auf ein Schema zu verweisen oder einfach Entitäten zu unterscheiden. Für XAML müssen die Typen und Elemente, die in XAML verwendet werden, letztendlich aufgelöst werden, um Typen zu sichern, und XML-Schemakonzepte gelten nicht gut für diese Funktion. Der XAML-Namespace enthält Informationen, über die der XAML-Schemakontext verfügbar sein muss, um diese Typzuordnung auszuführen.

XAML-Namespacekomponenten

Die XAML-Namespacedefinition verfügt über zwei Komponenten: ein Präfix und einen Bezeichner. Jede dieser Komponenten ist vorhanden, wenn ein XAML-Namespace im Markup deklariert oder im XAML-Typsystem definiert ist.

Das Präfix kann eine beliebige Zeichenfolge sein, die von den W3C-Namespaces in der XML 1.0-Spezifikation zulässig ist. Die Präfixe sind in der Regel kurze Zeichenfolgen, da das Präfix in einer typischen Markupdatei mehrmals wiederholt wird. Bestimmte XAML-Namespaces, die in mehreren XAML-Implementierungen verwendet werden sollen, verwenden bestimmte herkömmliche Präfixe. Beispielsweise wird der XAML-Sprach-XAML-Namespace in der Regel mit dem Präfix x zugeordnet. Sie können einen Standard-XAML-Namespace definieren, bei dem das Präfix nicht in der Definition angegeben wird, sondern als leere Zeichenfolge dargestellt wird, wenn definiert oder by.NET XAML Services-API abgefragt wird. In der Regel wird der standardmäßige XAML-Namespace absichtlich ausgewählt, um eine maximierte Menge an Präfix-auslassenden Markups durch eine XAML-Implementierungstechnologie und ihre Szenarien und Vokabular zu fördern.

Der Bezeichner kann eine beliebige Zeichenkette sein, wie sie in der W3C Namespaces in XML 1.0 Spezifikation erlaubt ist. In der Konvention werden Bezeichner für XML-Namespaces oder XAML-Namespaces häufig in URI-Formularen angegeben, normalerweise als protokollqualifizierter absoluter URI. Häufig werden Versionsinformationen, die ein bestimmtes XAML-Vokabular definieren, als Teil der Pfadzeichenfolge impliziert. XAML-Namespaces fügen eine zusätzliche Bezeichnerkonvention über die XML-URI-Konvention hinaus hinzu. Für XAML-Namespaces kommuniziert der Bezeichner Informationen, die von einem XAML-Schemakontext benötigt werden, um die Typen zu beheben, die als Elemente unter diesem XAML-Namespace angegeben sind oder Attribute für Member auflösen.

Zur Kommunikation von Informationen an einen XAML-Schemakontext kann der Bezeichner für einen XAML-Namespace noch in URI-Formularen enthalten sein. In diesem Fall wird der URI jedoch auch als übereinstimmende Bezeichner in einer bestimmten Assembly oder Liste von Assemblys deklariert. Dies erfolgt in Assemblys durch Attributieren der Assembly mit XmlnsDefinitionAttribute. Diese Methode, um den XAML-Namespace zu identifizieren und ein CLR-basiertes Typauflösungsverhalten in der zugeordneten Assembly zu unterstützen, wird vom Standardschemakontext von .NET XAML Services unterstützt. Im Allgemeinen kann diese Konvention für Fälle verwendet werden, in denen der XAML-Schemakontext die CLR enthält oder auf dem Standardschemakontext basiert, der erforderlich ist, um CLR-Attribute aus CLR-Assemblys zu lesen.

XAML-Namespaces können auch durch eine Konvention identifiziert werden, die einen CLR-Namespace und eine Typdefinitionsassembly kommuniziert. Diese Konvention wird in Fällen verwendet, in denen keine XmlnsDefinitionAttribute-Zuordnung in den Assemblys vorhanden ist, die Typen enthalten. Diese Konvention ist potenziell komplexer als die URI-Konvention und hat auch das Potenzial für Ambiguität und Duplizierung, da es mehrere Möglichkeiten gibt, auf eine Assembly zu verweisen.

Die einfachste Form eines Bezeichners, der den CLR-Namespace und die Assemblykonvention verwendet, ist wie folgt:

clr-namespace:clrnsName; assembly=assemblyShortName

clr-namespace: und ; assembly= sind Literalkomponenten der Syntax.

clrnsName ist der Zeichenfolgenname, der einen CLR-Namespace identifiziert. Dieser Zeichenfolgenname enthält alle internen Punktzeichen (.), die Hinweise zum CLR-Namespace und zu seiner Beziehung zu anderen CLR-Namespaces bereitstellen.

assemblyShortName ist der Zeichenfolgenname einer Assembly, die Typen definiert, die in XAML nützlich sind. Die Typen, auf die über den deklarierten XAML-Namespace zugegriffen werden soll, werden von der Assembly definiert und innerhalb des CLR-Namespaces deklariert, der von clrnsName angegeben wird. Dieser Zeichenfolgenname paralleliert in der Regel die Informationen, wie von AssemblyName.Name.

Eine vollständigere Definition des CLR-Namespaces und der Assemblykonvention ist wie folgt:

clr-namespace:clrnsName; assembly=assemblyName

assemblyName stellt eine beliebige Zeichenfolge dar, die als Assembly.Load(String) Eingabe legal ist. Diese Zeichenfolge kann Kultur, öffentliche Schlüssel oder Versionsinformationen enthalten (Definitionen dieser Konzepte werden im Referenzthema für Assembly). COFF-Format und Nachweise (wie von anderen Überladungen von Load verwendet) sind für XAML-Assemblyladezwecke nicht relevant. Alle Ladeinformationen müssen als Zeichenfolge dargestellt werden.

Das Angeben eines öffentlichen Schlüssels für die Assembly ist eine nützliche Methode für die XAML-Sicherheit oder das Entfernen möglicher Unklarheiten, die vorhanden sein können, wenn Assemblys durch einfachen Namen geladen werden oder in einer Cache- oder Anwendungsdomäne vorhanden sind. Weitere Informationen finden Sie unter XAML Security Considerations.)

XAML-Namespacedeklarationen in der XAML-Dienste-API

In der XAML Services-API wird eine XAML-Namespacedeklaration durch ein NamespaceDeclaration-Objekt dargestellt. Wenn Sie einen XAML-Namespace im Code deklarieren, rufen Sie den NamespaceDeclaration(String, String)-Konstruktor auf. Die ns und prefix-Parameter werden als Zeichenfolgen angegeben, und die Eingabe, die für diese Parameter bereitgestellt werden soll, entspricht der Definition von XAML-Namespace-Bezeichner und XAML-Namespacepräfix wie zuvor in diesem Thema angegeben.

Wenn Sie XAML-Namespaceinformationen als Teil eines XAML-Knotendatenstroms oder über einen anderen Zugriff auf das XAML-Typsystem untersuchen, NamespaceDeclaration.Namespace meldet Sie den XAML-Namespace-Bezeichner und NamespaceDeclaration.Prefix meldet das XAML-Namespacepräfix.

In einem XAML-Knotendatenstrom können die XAML-Namespaceinformationen als XAML-Knoten angezeigt werden, der der Entität vorausgeht, auf die sie angewendet wird. Dies umfasst Fälle, in denen die XAML-Namespaceinformationen vor dem StartObject des XAML-Stammelements liegen. Weitere Informationen finden Sie unter Understanding XAML Node Stream Structures and Concepts.

Für viele Szenarien, die die .NET XAML Services-API verwenden, wird mindestens eine XAML-Namespacedeklaration vorhanden sein, und die Deklaration muss entweder Informationen enthalten oder verweisen, die von einem XAML-Schemakontext erforderlich sind. Die XAML-Namespaces müssen entweder Assemblys angeben, die geladen werden sollen, oder unterstützen Sie bei der Auflösung bestimmter Typen innerhalb von Namespaces und Assemblys, die bereits vom XAML-Schemakontext geladen oder bekannt sind.

Um einen XAML-Knotendatenstrom zu generieren, muss XAML-Typinformationen über den XAML-Schemakontext verfügbar sein. Die XAML-Typinformationen können nicht bestimmt werden, ohne zunächst den relevanten XAML-Namespace für jeden zu erstellenden Knoten zu bestimmen. An diesem Punkt werden noch keine Instanzen von Typen erstellt, aber der XAML-Schemakontext muss möglicherweise Informationen aus der definierenden Assembly und dem Sicherungstyp nachschlagen. Um das Markup <Party><PartyFavor/></Party> zu verarbeiten, muss der XAML-Schemakontext beispielsweise den Namen und den Typ des ContentProperty vonParty bestimmen und somit auch die XAML-Namespaceinformationen für Party und PartyFavor. Im Fall des Standardmäßigen XAML-Schemakontexts meldet statische Spiegelung viele der XAML-Typsysteminformationen, die zum Generieren von XAML-Typknoten im Knotendatenstrom benötigt werden.

Um ein Objektdiagramm aus einem XAML-Knotendatenstrom zu generieren, muss XAML-Namespacedeklarationen für jedes XAML-Präfix vorhanden sein, das im ursprünglichen Markup verwendet wird und im XAML-Knotendatenstrom aufgezeichnet wird. An diesem Punkt werden Instanzen erstellt, und das tatsächliche Typzuordnungsverhalten tritt auf.

Wenn Sie XAML-Namespaceinformationen vorab auffüllen müssen, ist in Fällen, in denen der XAML-Schemakontext, den Sie verwenden möchten, nicht im Markup definiert, eine Methode, die Sie verwenden können, die XML-Namespacedeklarationen in der XmlParserContext für eine XmlReader. Verwenden Sie XmlReader dann als Eingabe für einen XAML-Reader-Konstruktor oder XamlServices.Load(XmlReader).

Zwei weitere APIs, die für die XAML-Namespacebehandlung in .NET XAML Services relevant sind, sind die Attribute XmlnsDefinitionAttribute und XmlnsPrefixAttribute. Diese Attribute gelten für Assemblys. XmlnsDefinitionAttribute wird von einem XAML-Schemakontext verwendet, um eine XAML-Namespacedeklaration zu interpretieren, die einen URI enthält. XmlnsPrefixAttribute wird von Tools verwendet, die XAML senden, sodass ein bestimmtes XAML-Namespace mit einem vorhersagbaren Präfix serialisiert werden kann. Weitere Informationen finden Sie unter XAML-bezogene CLR-Attribute für benutzerdefinierte Typen und Bibliotheken.

Weitere Informationen