Contesto dello schema XAML predefinito e contesto dello schema XAML WPF
Un contesto dello schema XAML è un'entità concettuale che qualifica il modo in cui una produzione XAML che usa un vocabolario XAML specifico interagisce con il comportamento di scrittura degli oggetti, tra cui il modo in cui il mapping dei tipi viene risolto, il modo in cui gli assembly vengono caricati, il modo in cui vengono interpretate determinate impostazioni del lettore e del writer. Questo argomento descrive le funzionalità dei servizi XAML .NET e il contesto dello schema XAML predefinito associato, basato sul sistema dei tipi CLR. Questo argomento descrive anche il contesto dello schema XAML usato per WPF.
Contesto dello schema XAML predefinito
I servizi XAML .NET implementano e usano un contesto di schema XAML predefinito. Il comportamento predefinito del contesto dello schema XAML non è sempre completamente visibile nell'API della classe XamlSchemaContext. In molti casi, tuttavia, il comportamento influenzato dal contesto dello schema XAML predefinito è osservabile tramite l'API comune del sistema di tipi XAML, ad esempio i membri di XamlMember o XamlTypeo tramite API esposte nei lettori XAML e nei writer XAML che usano il contesto dello schema XAML predefinito.
È possibile creare un XamlSchemaContext che incapsula il comportamento predefinito chiamando il costruttore XamlSchemaContext. In questo modo viene creato in modo esplicito il contesto dello schema XAML predefinito. Lo stesso contesto dello schema XAML predefinito viene creato in modo implicito, se si inizializza un lettore XAML o un writer XAML usando api che non accettano esplicitamente un parametro di input XamlSchemaContext.
Il contesto dello schema XAML predefinito si basa sulla reflection CLR per il comportamento di mapping dei tipi. Ciò include l'esame della definizione di CLR Typee dei PropertyInfo correlati o MethodInfo. Inoltre, l'attribuzione CLR su tipi o membri viene usata per compilare le specifiche per il tipo XAML o le informazioni sui membri XAML che usano il tipo di supporto CLR. Il contesto dello schema XAML predefinito non richiede tecniche di estensione del sistema di tipi, ad esempio il modello di Invoker
, perché le informazioni necessarie sono disponibili dal sistema di tipi CLR.
Per la logica di caricamento degli assembly, il contesto dello schema XAML predefinito si basa principalmente su tutti i valori di assembly forniti nei mapping dello spazio dei nomi XAML. Inoltre, LocalAssembly può suggerire a un assembly di caricare, per scenari come il caricamento di tipi interni.
Contesto dello schema XAML WPF
Il contesto dello schema XAML WPF è descritto in questo argomento perché l'implementazione wpf fornisce un'illustrazione interessante dei tipi di funzionalità che possono essere introdotti implementando un contesto dello schema XAML non predefinito. Inoltre, il concetto di contesto dello schema XAML non viene illustrato molto nella documentazione WPF che punta a WPF XAML; Il comportamento che il contesto dello schema XAML abilita potrebbe essere completamente comprensibile solo se integrato con una discussione sul funzionamento del contesto dello schema XAML predefinito. Il contesto dello schema XAML WPF implementa il comportamento seguente.
override della ricerca: WPF include alcuni modelli di contenuto per XAML in cui sono presenti proprietà del contenuto XAML che funzionano senza essere ContentPropertyAttribute attributi. LookupContentProperty override per WPF implementano questo comportamento.
rinvio per le espressioni WPF: WPF include diverse classi di espressioni che rinviano un valore fino a quando non è disponibile un contesto di runtime. Inoltre, l'espansione del modello è un comportamento di runtime che si basa su tecniche di rinvio.
Ottimizzazioni di ricerca del sistema dei tipi: WPF include un ampio vocabolario XAML e un modello a oggetti, incluse le definizioni dei membri della classe di base che ereditano a centinaia letteralmente di classi definite da WPF. Inoltre, WPF stesso è distribuito tra più assembly. WPF ottimizza la ricerca del tipo usando le tabelle di ricerca e altre tecniche. Ciò offre miglioramenti delle prestazioni rispetto al contesto dello schema XAML predefinito e alla ricerca del tipo basato su CLR. Nei casi in cui i tipi non esistono in una tabella di ricerca, il comportamento usa tecniche di contesto dello schema XAML simili al contesto dello schema XAML predefinito.
'estensione XamlType e XamlMember: WPF estende i concetti relativi alle proprietà di dipendenza e i concetti relativi all'evento con gli eventi indirizzati. Per offrire a questi concetti una maggiore visibilità per le operazioni di elaborazione XAML, WPF estende XamlType e XamlMembere aggiunge proprietà interne che segnalano le proprietà di dipendenza e le caratteristiche degli eventi indirizzati.
Accesso al contesto dello schema XAML WPF
Se si usano tecniche XAML basate sul System.Windows.Markup.XamlReader WPF o System.Windows.Markup.XamlWriter, il contesto dello schema XAML WPF è già in uso in tali implementazioni del lettore XAML e del writer XAML.
Se si usano altre implementazioni del lettore XAML o del writer XAML che non vengono inizializzate con il contesto dello schema XAML WPF, è possibile ottenere un contesto dello schema XAML WPF funzionante da XamlReader.GetWpfSchemaContext. È quindi possibile usare questo valore come inizializzazione per altre API che usano un XamlSchemaContext. Ad esempio, puoi chiamare XamlXmlReader per l'inizializzazione e passare il contesto dello schema XAML WPF. In alternativa, è possibile usare il contesto dello schema XAML WPF per le operazioni di sistema dei tipi XAML. Ciò può includere l'inizializzazione della costruzione di un XamlType o di un XamlMemberoppure la chiamata a XamlSchemaContext.GetXamlType.
Si noti che se si accede a determinati aspetti di XAML WPF da prospettive di flusso di nodi XAML puri, alcune delle funzionalità del framework WPF potrebbero non aver ancora agito. Ad esempio, i modelli WPF per i controlli non sono ancora applicati. Pertanto, se si accede a una proprietà che in fase di esecuzione potrebbe essere popolata con una struttura ad albero visuale completa, è possibile che venga visualizzato solo un valore di proprietà che fa riferimento a un modello. Il contesto del servizio fornito per le estensioni di markup WPF potrebbe anche non essere accurato se fornito da una situazione non di runtime e può causare eccezioni quando si tenta di scrivere un oggetto grafico.
Caricamento di xaml e assembly
Il caricamento di assembly per i servizi XAML e .NET si integra con il concetto clr definito da CLR di AppDomain. Un contesto dello schema XAML interpreta come caricare gli assembly o trovare tipi in fase di esecuzione o in fase di progettazione, in base all'uso di AppDomain e altri fattori. La logica è leggermente diversa a seconda che xaml sia libero per un lettore XAML, sia compilato in xaml in una DLL XamlBuildTask
o che sia BAML generato dal PresentationBuildTask
di WPF.
Il contesto dello schema XAML per WPF si integra con il modello di applicazione WPF, che a sua volta usa AppDomain nonché altri fattori che sono dettagli di implementazione WPF.
Input lettore XAML (XAML libero)
Il contesto dello schema XAML scorre il AppDomain dell'applicazione, cercando un assembly già caricato che corrisponde a tutti gli aspetti del nome, a partire dall'assembly caricato più di recente. Se viene trovata una corrispondenza, tale assembly viene usato per la risoluzione.
In caso contrario, una delle tecniche seguenti basate sull'API CLR Assembly viene usata per caricare un assembly:
Se il nome è qualificato nel mapping, chiamare Assembly.Load(String) sul nome completo.
Se il passaggio precedente ha esito negativo, usare il nome breve (e il token di chiave pubblica, se presente) per chiamare Assembly.Load(String).
Se il nome non è qualificato nel mapping, chiamare Assembly.LoadWithPartialName.
XamlBuildTask
XamlBuildTask
viene usato per Windows Communication Foundation (WCF) e Windows Workflow Foundation.
Si noti che i riferimenti agli assembly tramite XamlBuildTask
sono sempre completi.
Chiamare Assembly.Load(String) sul nome completo.
Se il passaggio precedente ha esito negativo, usare il nome breve (e il token di chiave pubblica, se presente) per chiamare Assembly.Load(String).
BAML (PresentationBuildTask)
Esistono due aspetti per il caricamento di assembly per BAML: il caricamento dell'assembly iniziale che contiene BAML come componente e il caricamento degli assembly di backup dei tipi per qualsiasi tipo a cui fa riferimento l'ambiente di produzione BAML.
Caricamento dell'assembly per il markup iniziale:
Il riferimento all'assembly da cui caricare il markup è sempre non qualificato.
Il contesto dello schema XAML WPF scorre il AppDomain dell'applicazione WPF, cercando un assembly già caricato che corrisponde a tutti gli aspetti del nome, a partire dall'assembly caricato più di recente. Se viene trovata una corrispondenza, tale assembly viene usato per la risoluzione.
Se il passaggio precedente ha esito negativo, usare il nome breve (e il token di chiave pubblica, se presente) per chiamare Assembly.Load(String).
Riferimenti agli assembly per tipi BAML:
I riferimenti agli assembly per i tipi usati nell'ambiente di produzione BAML sono sempre completi, come output dell'attività di compilazione.
Il contesto dello schema XAML WPF scorre il AppDomain dell'applicazione WPF, cercando un assembly già caricato che corrisponde a tutti gli aspetti del nome, a partire dall'assembly caricato più di recente. Se viene trovata una corrispondenza, tale assembly viene usato per la risoluzione.
In caso contrario, per caricare un assembly viene usata una delle tecniche seguenti:
Chiamare Assembly.Load(String) sul nome completo.
Se una combinazione di token di chiave pubblica e nome breve corrisponde all'assembly da cui è stato caricato BAML, usare tale assembly.
Usare il nome breve e il token di chiave pubblica per chiamare Assembly.Load(String).
Vedere anche
.NET Desktop feedback