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-Knotenstream 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 spezieller XML-Namespace, genau wie XAML eine spezielle Form von XML ist und das grundlegende XML-Formular für sein Markup verwendet. Im Markup deklarieren Sie einen XAML-Namespace und dessen Zuordnung über ein xmlns
Attribut, das auf ein Element angewendet wird. Die xmlns
-Deklaration kann an dasselbe Element vorgenommen werden, in dem der XAML-Namespace deklariert ist. Eine an einem Element vorgenommene XAML-Namespacedeklaration ist für dieses Element, alle Attribute dieses Elements und alle untergeordneten Elemente dieses Elements gültig. Attribute können einen XAML-Namespace verwenden, der nicht mit dem Element identisch ist, das das Attribut enthält, solange der Attributname selbst als Teil des Attributnamens im Markup auf das Präfix verweist.
Der Unterschied zwischen einem XAML-Namespace und 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 Member, die in XAML verwendet werden, letztendlich in die Sicherung von Typen aufgelöst werden, und XML-Schemakonzepte gelten nicht gut für diese Funktion. Der XAML-Namespace enthält Informationen, über die der XAML-Schemakontext verfügen 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-Spezifikationzulässig ist. Standardmäßig sind die Präfixe 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 mithilfe des Präfixes x
zugeordnet. Sie können einen standardmäßigen XAML-Namespace definieren, bei dem das Präfix nicht in der Definition angegeben, sondern als leere Zeichenfolge dargestellt wird, wenn by.NET XAML-Dienste-API definiert oder abgefragt wird. In der Regel wird der standardmäßige XAML-Namespace absichtlich ausgewählt, um eine maximierte Menge an Präfixmarkierungen durch eine XAML-Implementierungstechnologie und deren Szenarien und Vokabular zu fördern.
Der Bezeichner kann eine beliebige Zeichenfolge sein, die von den W3C-Namespaces in der XML 1.0-Spezifikationzulässig ist. In der Konvention werden Bezeichner für XML-Namespaces oder XAML-Namespaces häufig in URI-Form angegeben, in der Regel 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 aufzulösen, die als Elemente unter diesem XAML-Namespace angegeben werden, oder um Attribute für Member aufzulösen.
Für die Kommunikation von Informationen an einen XAML-Schemakontext kann sich der Bezeichner für einen XAML-Namespace möglicherweise noch in URI-Form befinden. In diesem Fall wird der URI jedoch auch als übereinstimmende ID in einer bestimmten Assembly oder Liste von Assemblys deklariert. Dies erfolgt in Assemblys durch Attributieren der Assembly mit XmlnsDefinitionAttribute. Diese Methode zum Identifizieren des XAML-Namespaces und zur Unterstützung eines CLR-basierten Typauflösungsverhaltens in der zugeordneten Assembly wird vom standardmäßigen XAML-Schemakontext in .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 Standard-XAML-Schemakontext 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 Typdefinierungsassembly kommuniziert. Diese Konvention wird in Fällen verwendet, in denen keine XmlnsDefinitionAttribute Attribution in den Assemblys vorhanden ist, die Typen enthalten. Diese Konvention ist potenziell komplexer als die URI-Konvention und hat auch das Potenzial für Mehrdeutigkeit 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, lautet 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 dessen Beziehung zu anderen CLR-Namespaces enthalten.
assemblyShortName ist der Zeichenfolgenname einer Assembly, die Typen definiert, die in XAML nützlich sind. Der Zugriff auf die Typen über den deklarierten XAML-Namespace wird von der Assembly erwartet und innerhalb des clR-Namespace deklariert, der durch clrnsNameangegeben wird. Dieser Zeichenfolgenname paralleliert in der Regel die Von AssemblyName.Namegemeldeten Informationen.
Eine umfassendere Definition des CLR-Namespaces und der Assemblykonvention lautet wie folgt:
clr-namespace:clrnsName; assembly=assemblyName
assemblyName stellt eine beliebige Zeichenfolge dar, die als Assembly.Load(String) Eingabe zulässig ist. Diese Zeichenfolge kann Kultur-, Öffentliche Schlüssel- oder Versionsinformationen enthalten (Definitionen dieser Konzepte werden im Referenzthema für Assemblydefiniert). COFF-Format und Nachweise (wie sie von anderen Überladungen von Loadverwendet werden) 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 Technik für die XAML-Sicherheit oder zum Entfernen möglicher Mehrdeutigkeiten, die vorhanden sein können, wenn Assemblys mit einfachem Namen geladen werden oder in einer Cache- oder Anwendungsdomäne vorhanden sind. Weitere Informationen finden Sie unter ÜBERLEGUNGEN zur XAML-Sicherheit.
XAML-Namespacedeklarationen in der XAML-Dienst-API
In der XAML-Dienste-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 Parameter ns
und prefix
werden als Zeichenfolgen angegeben, und die Eingabe, die für diese Parameter bereitgestellt werden soll, entspricht der Definition des XAML-Namespacebezeichners und des XAML-Namespacepräfixes, wie zuvor in diesem Thema beschrieben.
Wenn Sie XAML-Namespaceinformationen als Teil eines XAML-Knotenstreams oder über einen anderen Zugriff auf das XAML-Typsystem untersuchen, meldet NamespaceDeclaration.Namespace den XAML-Namespacebezeichner und NamespaceDeclaration.Prefix meldet das XAML-Namespacepräfix.
In einem XAML-Knotenstream können die XAML-Namespaceinformationen als XAML-Knoten angezeigt werden, der vor der Entität steht, auf die sie angewendet wird. Dies schließt Fälle ein, in denen die XAML-Namespaceinformationen dem StartObject
des XAML-Stammelements vorausgehen. Weitere Informationen finden Sie unter Grundlegendes zu XAML-Knotenstromstrukturen und -Konzepten.
Für viele Szenarien, die die .NET XAML Services-API verwenden, wird erwartet, dass mindestens eine XAML-Namespacedeklaration vorhanden ist, und die Deklaration muss entweder Informationen enthalten oder verweisen, die von einem XAML-Schemakontext benötigt werden. Die XAML-Namespaces müssen entweder Assemblys angeben, die geladen werden sollen, oder die Auflösung bestimmter Typen innerhalb von Namespaces und Assemblys unterstützen, die bereits vom XAML-Schemakontext geladen oder bekannt sind.
Um einen XAML-Knotendatenstrom zu generieren, müssen XAML-Typinformationen über den XAML-Schemakontext verfügbar sein. Die XAML-Typinformationen können nicht ermittelt werden, ohne zuerst den relevanten XAML-Namespace für jeden zu erstellenden Knoten zu ermitteln. An diesem Punkt werden noch keine Instanzen von Typen erstellt, der XAML-Schemakontext muss jedoch möglicherweise Informationen aus der definierenden Assembly und dem Sicherungstyp nachschlagen. Um z. B. das Markup <Party><PartyFavor/></Party>
zu verarbeiten, muss der XAML-Schemakontext in der Lage sein, den Namen und Typ des ContentProperty
von Party
zu bestimmen und daher auch die XAML-Namespaceinformationen für Party
und PartyFavor
zu kennen. Im Fall des standardmäßigen XAML-Schemakontexts meldet statische Spiegelung einen Großteil der XAML-Typsysteminformationen, die zum Generieren von XAML-Typknoten im Knotenstream erforderlich sind.
Um ein Objektdiagramm aus einem XAML-Knotendatenstrom zu generieren, müssen XAML-Namespacedeklarationen für jedes XAML-Präfix vorhanden sein, das im ursprünglichen Markup verwendet und im XAML-Knotendatenstrom aufgezeichnet wird. Zu diesem Zeitpunkt werden Instanzen erstellt, und das tatsächliche Typzuordnungsverhalten tritt auf.
Wenn Sie XAML-Namespaceinformationen vorab auffüllen müssen, in Fällen, in denen der XAML-Namespace, den Sie verwenden möchten, nicht im Markup definiert ist, besteht eine Technik, die Sie verwenden können, darin, XML-Namespacedeklarationen im XmlParserContext für eine XmlReaderzu deklarieren. Verwenden Sie diese XmlReader dann als Eingabe für einen XAML-Reader-Konstruktor oder XamlServices.Load(XmlReader).
Zwei weitere APIs, die für die XAML-Namespaceverarbeitung 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 jede XAML-Namespacedeklaration zu interpretieren, die einen URI enthält. XmlnsPrefixAttribute wird von Tools verwendet, die XAML ausgeben, sodass ein bestimmter XAML-Namespace mit einem vorhersagbaren Präfix serialisiert werden kann. Weitere Informationen finden Sie unter XAML-Related CLR-Attribute für benutzerdefinierte Typen und Bibliotheken.
Siehe auch
.NET Desktop feedback