Spazi dei nomi XAML per i servizi XAML .NET
Uno spazio dei nomi XAML è un concetto che si espande sulla definizione di uno spazio dei nomi XML. Analogamente a uno spazio dei nomi XML, è possibile definire uno spazio dei nomi XAML usando un attributo xmlns
nel markup. Gli spazi dei nomi XAML sono rappresentati anche nel flusso del nodo XAML e in altre API dei servizi XAML. Questo argomento definisce il concetto di spazio dei nomi XAML e descrive il modo in cui gli spazi dei nomi XAML possono essere definiti e usati dai contesti dello schema XAML e da altri aspetti dei servizi XAML .NET.
Spazio dei nomi XML e spazio dei nomi XAML
Uno spazio dei nomi XAML è uno spazio dei nomi XML specializzato, proprio come XAML è una forma specializzata di XML e usa il formato XML di base per il markup. Nel markup dichiari uno spazio dei nomi XAML e il relativo mapping tramite un attributo xmlns
applicato a un elemento. La dichiarazione xmlns
può essere effettuata allo stesso elemento in cui è dichiarato lo spazio dei nomi XAML. Una dichiarazione dello spazio dei nomi XAML eseguita a un elemento è valida per tale elemento, tutti gli attributi di tale elemento e tutti gli elementi figlio di tale elemento. Gli attributi possono usare uno spazio dei nomi XAML che non corrisponde all'elemento che contiene l'attributo, purché il nome dell'attributo stesso faccia riferimento al prefisso come parte del nome dell'attributo nel markup.
La distinzione di uno spazio dei nomi XAML rispetto a uno spazio dei nomi XML consiste nel fatto che uno spazio dei nomi XML può essere usato per fare riferimento a uno schema o semplicemente per distinguere le entità. Per XAML, i tipi e i membri usati in XAML devono essere risolti in tipi di supporto e i concetti di XML Schema non si applicano bene a questa funzionalità. Lo spazio dei nomi XAML contiene informazioni che il contesto dello schema XAML deve disporre per eseguire questo mapping dei tipi.
Componenti dello spazio dei nomi XAML
La definizione dello spazio dei nomi XAML include due componenti: un prefisso e un identificatore. Ognuno di questi componenti è presente quando uno spazio dei nomi XAML viene dichiarato nel markup o definito nel sistema dei tipi XAML.
Il prefisso può essere qualsiasi stringa consentita dagli spazi dei nomi W3C nella specifica XML 1.0. Per convenzione, i prefissi sono in genere stringhe brevi, perché il prefisso viene ripetuto molte volte in un file di markup tipico. Alcuni spazi dei nomi XAML destinati a essere usati in più implementazioni XAML usano prefissi convenzionali specifici. Ad esempio, lo spazio dei nomi XAML del linguaggio XAML viene in genere mappato usando il prefisso x
. Puoi definire uno spazio dei nomi XAML predefinito, in cui il prefisso non viene specificato nella definizione, ma è rappresentato come una stringa vuota se definita o sottoposti a query by.NET API dei servizi XAML. In genere, lo spazio dei nomi XAML predefinito viene scelto deliberatamente per promuovere una quantità ingrandita di markup di prefissi omettendo da una tecnologia di implementazione XAML e dai relativi scenari e vocabolari.
L'identificatore può essere qualsiasi stringa consentita dagli spazi dei nomi W3C nella specifica XML 1.0. Per convenzione, gli identificatori per gli spazi dei nomi XML o gli spazi dei nomi XAML vengono spesso forniti in formato URI, in genere come URI assoluto completo del protocollo. Spesso, le informazioni sulla versione che definiscono un vocabolario XAML specifico sono implicite come parte della stringa di percorso. Gli spazi dei nomi XAML aggiungono una convenzione di identificatore aggiuntiva oltre la convenzione URI XML. Per gli spazi dei nomi XAML, l'identificatore comunica le informazioni necessarie per un contesto dello schema XAML per risolvere i tipi specificati come elementi nello spazio dei nomi XAML o per risolvere gli attributi ai membri.
Ai fini della comunicazione delle informazioni a un contesto dello schema XAML, l'identificatore per uno spazio dei nomi XAML potrebbe essere ancora in formato URI. In questo caso, tuttavia, l'URI viene dichiarato anche come identificatore corrispondente in un determinato assembly o elenco di assembly. Questa operazione viene eseguita negli assembly assegnando all'assembly XmlnsDefinitionAttribute. Questo metodo di identificazione dello spazio dei nomi XAML e il supporto di un comportamento di risoluzione dei tipi basato su CLR nell'assembly con attributi è supportato dal contesto dello schema XAML predefinito nei servizi XAML .NET. Più in generale, questa convenzione può essere usata per i casi in cui il contesto dello schema XAML incorpora CLR o si basa sul contesto dello schema XAML predefinito, necessario per leggere gli attributi CLR dagli assembly CLR.
Gli spazi dei nomi XAML possono anche essere identificati da una convenzione che comunica uno spazio dei nomi CLR e un assembly di definizione dei tipi. Questa convenzione viene usata nei casi in cui non esiste alcuna attribuzione XmlnsDefinitionAttribute negli assembly che contengono tipi. Questa convenzione è potenzialmente più complessa della convenzione URI e ha anche la possibilità di ambiguità e duplicazione, perché esistono diversi modi per fare riferimento a un assembly.
La forma più semplice di un identificatore che usa lo spazio dei nomi CLR e la convenzione di assembly è la seguente:
clr-namespace:clrnsName; assembly=assemblyShortName
clr-namespace:
e ; assembly=
sono componenti letterali della sintassi.
clrnsName è il nome della stringa che identifica uno spazio dei nomi CLR. Questo nome stringa include qualsiasi carattere punto interno (.) che fornisce suggerimenti sullo spazio dei nomi CLR e sulla relativa relazione con altri spazi dei nomi CLR.
assemblyShortName è il nome stringa di un assembly che definisce i tipi utili in XAML. I tipi a cui accedere tramite lo spazio dei nomi XAML dichiarato devono essere definiti dall'assembly e devono essere dichiarati all'interno dello spazio dei nomi CLR specificato da clrnsName. Questo nome stringa in genere parallela alle informazioni segnalate da AssemblyName.Name.
Una definizione più completa dello spazio dei nomi e della convenzione di assembly CLR è la seguente:
clr-namespace:clrnsName; assembly=assemblyName
assemblyName rappresenta qualsiasi stringa valida come input Assembly.Load(String). Questa stringa può includere impostazioni cultura, chiave pubblica o informazioni sulla versione (le definizioni di questi concetti sono definite nell'argomento di riferimento per Assembly). Il formato e l'evidenza COFF (usati da altri overload di Load) non sono rilevanti per il caricamento di assembly XAML; tutte le informazioni di caricamento devono essere presentate come stringa.
Specificare una chiave pubblica per l'assembly è una tecnica utile per la sicurezza XAML o per rimuovere possibili ambiguità che possono esistere se gli assembly vengono caricati da un nome semplice o esistono già in una cache o in un dominio dell'applicazione. Per altre informazioni, vedere considerazioni sulla sicurezza XAML.
Dichiarazioni dello spazio dei nomi XAML nell'API dei servizi XAML
Nell'API dei servizi XAML una dichiarazione dello spazio dei nomi XAML è rappresentata da un oggetto NamespaceDeclaration. Se dichiari uno spazio dei nomi XAML nel codice, chiami il costruttore NamespaceDeclaration(String, String). I parametri ns
e prefix
vengono specificati come stringhe e l'input da fornire per questi parametri corrisponde alla definizione dell'identificatore dello spazio dei nomi XAML e del prefisso dello spazio dei nomi XAML, come indicato in precedenza in questo argomento.
Se si esaminano le informazioni sullo spazio dei nomi XAML come parte di un flusso di nodi XAML o tramite altri accessi al sistema dei tipi XAML, NamespaceDeclaration.Namespace segnala l'identificatore dello spazio dei nomi XAML e NamespaceDeclaration.Prefix segnala il prefisso dello spazio dei nomi XAML.
In un flusso di nodi XAML le informazioni sullo spazio dei nomi XAML possono essere visualizzate come nodo XAML che precede l'entità a cui si applica. Sono inclusi i casi in cui le informazioni sullo spazio dei nomi XAML precedono il StartObject
dell'elemento radice XAML. Per altre informazioni, vedere Understanding XAML Node Stream Structures and Concepts.For more information, see Understanding XAML Node Stream Structures and Concepts.
Per molti scenari che usano l'API servizi XAML .NET, è prevista l'esistenza di almeno una dichiarazione dello spazio dei nomi XAML e la dichiarazione deve contenere o fare riferimento a informazioni richieste da un contesto dello schema XAML. Gli spazi dei nomi XAML devono specificare gli assembly da caricare oppure facilitare la risoluzione di tipi specifici all'interno di spazi dei nomi e assembly già caricati o noti dal contesto dello schema XAML.
Per generare un flusso di nodi XAML, le informazioni sul tipo XAML devono essere disponibili tramite il contesto dello schema XAML. Non è possibile determinare le informazioni sul tipo XAML senza prima determinare lo spazio dei nomi XAML pertinente per ogni nodo da creare. A questo punto, non vengono ancora create istanze di tipi, ma il contesto dello schema XAML potrebbe dover cercare informazioni dall'assembly di definizione e dal tipo di backup. Ad esempio, per elaborare il markup <Party><PartyFavor/></Party>
, il contesto dello schema XAML deve essere in grado di determinare il nome e il tipo del ContentProperty
di Party
e pertanto deve conoscere anche le informazioni sullo spazio dei nomi XAML per Party
e PartyFavor
. Nel caso del contesto dello schema XAML predefinito, la reflection statica segnala gran parte delle informazioni sul sistema dei tipi XAML necessarie per generare nodi di tipo XAML nel flusso del nodo.
Per generare un oggetto grafico da un flusso di nodi XAML, le dichiarazioni dello spazio dei nomi XAML devono esistere per ogni prefisso XAML usato nel markup originale e registrato nel flusso del nodo XAML. A questo punto, vengono create istanze e si verifica un vero comportamento di mapping dei tipi.
Se devi prepopopolare le informazioni sullo spazio dei nomi XAML, nei casi in cui lo spazio dei nomi XAML che intendi usare nel contesto dello schema XAML non è definito nel markup, una tecnica che puoi usare consiste nel dichiarare dichiarazioni dello spazio dei nomi XML nel XmlParserContext per un XmlReader. Usare quindi tale XmlReader come input per un costruttore del lettore XAML o XamlServices.Load(XmlReader).
Altre due API rilevanti per la gestione dello spazio dei nomi XAML nei servizi XAML .NET sono gli attributi XmlnsDefinitionAttribute e XmlnsPrefixAttribute. Questi attributi si applicano agli assembly. XmlnsDefinitionAttribute viene usato da un contesto dello schema XAML per interpretare qualsiasi dichiarazione dello spazio dei nomi XAML che include un URI. XmlnsPrefixAttribute viene usato dagli strumenti che generano codice XAML in modo che uno spazio dei nomi XAML specifico possa essere serializzato con un prefisso stimabile. Per altre informazioni, vedere XAML-Related attributi CLR per tipi e librerie personalizzati.
Vedere anche
.NET Desktop feedback