Share via


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 XamlSchemaContext classe . 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 oggetto XamlSchemaContext che incapsula il comportamento predefinito chiamando il XamlSchemaContext costruttore . 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 inizializzi un lettore XAML o un writer XAML usando API che non accettano esplicitamente un XamlSchemaContext parametro di input.

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 correlati a PropertyInfo 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 Invoker modello, 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.

Sostituzioni di ricerca: WPF ha alcuni con modalità tenda ls per XAML in cui sono presenti proprietà del contenuto XAML che funzionano senza attributiContentPropertyAttribute. LookupContentProperty gli 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 vocabolario XAML completo 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 caratteristiche delle dipendenze e degli eventi indirizzati.

Accesso al contesto dello schema XAML WPF

Se usi tecniche XAML basate su WPF System.Windows.Markup.XamlReader 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 usi altre implementazioni del lettore XAML o del writer XAML che non inizializzano con il contesto dello schema XAML WPF, potresti essere in grado di ottenere un contesto dello schema XAML WPF funzionante da XamlReader.GetWpfSchemaContext. È quindi possibile usare questo valore come inizializzazione per altre API che usano un oggetto XamlSchemaContext. Ad esempio, è possibile 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 oggetto o XamlMembero la chiamata XamlSchemaContext.GetXamlTypea .

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 XAML e .NET si integra con il concetto CLR definito da 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 ad altri fattori. La logica è leggermente diversa a seconda che xaml sia libero per un lettore XAML, sia compilato in XAML in una DLL da XamlBuildTasko che sia BAML generato da WPF PresentationBuildTask.

Il contesto dello schema XAML per WPF si integra con il modello di applicazione WPF, che a sua volta usa AppDomain e altri fattori che sono dettagli di implementazione WPF.

Input lettore XAML (XAML libero)

  1. Il contesto dello schema XAML scorre l'oggetto 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.

  2. In caso contrario, una delle tecniche seguenti basate sull'API CLR Assembly viene usata per caricare un assembly:

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.

  1. Chiamare Assembly.Load(String) il nome completo.

  2. 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.

  1. Il contesto dello schema XAML WPF scorre l'oggetto 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.

  2. 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.

  1. Il contesto dello schema XAML WPF scorre l'oggetto 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.

  2. In caso contrario, per caricare un assembly viene usata una delle tecniche seguenti:

    • Chiamare Assembly.Load(String) il 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).

Vedi anche