Dela via


XAML-schemakontext och WPF XAML-schemakontext

En XAML-schemakontext är en konceptuell entitet som kvalificerar hur en XAML-produktion som använder en viss XAML-vokabulär interagerar med beteendet för objektskrivning, inklusive hur typmappning löser, hur sammansättningar läses in, hur vissa läsar- och skrivinställningar tolkas. Det här avsnittet beskriver funktionerna i .NET XAML Services och den associerade XAML-standardschemakontexten, som baseras på CLR-typsystemet. Det här avsnittet beskriver också XAML-schemakontexten som används för WPF.

Standardkontext för XAML-schema

.NET XAML Services implementerar och använder en XAML-standardschemakontext. Standardbeteendet för XAML-schemakontexten är inte alltid helt synligt i API:et för XamlSchemaContext-klassen. I många fall kan dock det beteende som XAML-standardschemakontexten påverkar observeras via vanliga API:er för XAML-typsystemet, till exempel medlemmar i XamlMember eller XamlType, eller via API:er som exponeras för XAML-läsare och XAML-skrivare som använder XAML-standardschemakontexten.

Du kan skapa en XamlSchemaContext som kapslar in standardbeteendet genom att anropa XamlSchemaContext konstruktorn. Detta skapar uttryckligen XAML-standardschemakontexten. Samma XAML-standardschemakontext skapas implicit om du initierar en XAML-läsare eller XAML-skrivare med API:er som inte uttryckligen tar en XamlSchemaContext indataparameter.

Standard-XAML-schemakontexten förlitar sig på CLR-reflektion för dess typmappningsbeteende. Detta inkluderar att undersöka den definierande CLR-Typeoch relaterade PropertyInfo eller MethodInfo. CLR-attribution för typer eller medlemmar används också för att fylla i detaljerna för XAML-typ eller XAML-medlemsinformation som använder CLR-säkerhetskopieringstypen. Standard-XAML-schemakontexten kräver inte typsystemtilläggstekniker, till exempel Invoker-mönstret, eftersom nödvändig information är tillgänglig från CLR-typsystemet.

För inläsningslogik för sammansättning är XAML-standardschemakontexten huvudsakligen beroende av eventuella sammansättningsvärden som tillhandahålls i XAML-namnområdesmappningar. Dessutom kan LocalAssembly tipsa en sammansättning att läsa in, för scenarier som inläsning av interna typer.

WPF XAML-schemakontext

WPF XAML-schemakontexten beskrivs i det här avsnittet eftersom WPF-implementeringen ger en intressant bild av vilka typer av funktioner som kan introduceras genom att implementera en XAML-schemakontext som inte är standard. Dessutom diskuteras inte XAML-schemakontextkonceptet särskilt mycket i WPF-dokumentationen som hanterar WPF XAML; det beteende som XAML-schemakontexten aktiverar kanske bara är helt begripligt om det är integrerat med en diskussion om hur standardkontexten för XAML-schema fungerar. WPF XAML-schemakontexten implementerar följande beteende.

åsidosättningar för sökning: WPF har några innehållsmodeller för XAML där det finns XAML-innehållsegenskaper som fungerar utan att ContentPropertyAttribute tillskrivas. LookupContentProperty åsidosättningar för WPF implementerar det här beteendet.

Deferral för WPF-uttryck: WPF har flera uttrycksklasser som skjuter upp ett värde tills en körningskontext är tillgänglig. Dessutom är mallexpansion ett körningsbeteende som förlitar sig på uppskjutningstekniker.

Typ systemsökningsoptimeringar: WPF har en omfattande XAML-vokabulär och objektmodell, inklusive basklassmedlemsdefinitioner som ärver till bokstavligen hundratals WPF-definierade klasser. WPF är också spridd över flera sammansättningar. WPF optimerar sin typsökning med hjälp av uppslagstabeller och andra tekniker. Detta ger prestandaförbättringar jämfört med standard-XAML-schemakontexten och dess CLR-baserade typsökning. I fall där typer inte finns i en uppslagstabell använder beteendet XAML-schemakontexttekniker som liknar standardkontexten för XAML-schema.

XamlType- och XamlMember-tillägget: WPF utökar egenskapsbegrepp med beroendeegenskaper och händelsebegrepp med routade händelser. För att ge dessa begrepp större synlighet för XAML-bearbetningsåtgärder utökar WPF XamlType och XamlMemberoch lägger till interna egenskaper som rapporterar beroendeegenskap och routade händelseegenskaper.

Åtkomst till WPF XAML-schemakontexten

Om du använder XAML-tekniker som baseras på WPF-System.Windows.Markup.XamlReader eller System.Windows.Markup.XamlWriteranvänds wpf XAML-schemakontexten redan i dessa XAML-läsare och XAML-skrivarimplementeringar.

Om du använder andra XAML-läsare eller XAML-skrivarimplementeringar som inte initieras med WPF XAML-schemakontexten kanske du kan få en fungerande WPF XAML-schemakontext från XamlReader.GetWpfSchemaContext. Du kan sedan använda det här värdet som initiering för andra API:er som använder en XamlSchemaContext. Du kan till exempel anropa XamlXmlReader för initiering och skicka WPF XAML-schemakontexten. Eller så kan du använda WPF XAML-schemakontexten för systemåtgärder av XAML-typ. Detta kan omfatta bygginitiering av en XamlType eller XamlMember, eller att anropa XamlSchemaContext.GetXamlType.

Observera att om du har åtkomst till vissa aspekter av WPF XAML från en ren XAML-nodströmsperspektiv kanske vissa av WPF-ramverksfunktionerna inte har agerat ännu. WPF-mallar för kontroller tillämpas till exempel inte ännu. Om du får åtkomst till en egenskap som vid körning kan fyllas med ett fullständigt visuellt träd kanske du bara ser ett egenskapsvärde som refererar till en mall. Tjänstkontexten som tillhandahålls för WPF-tillägg kanske inte heller är korrekt om den tillhandahålls från en icke-körningssituation och kan resultera i undantag när du försöker skriva ett objektdiagram.

XAML- och sammansättningsinläsning

Sammansättningsinläsning för XAML- och .NET XAML Services integreras med det CLR-definierade begreppet AppDomain. En XAML-schemakontext tolkar hur du antingen läser in sammansättningar eller hittar typer vid körning eller design, baserat på användningen av AppDomain och andra faktorer. Logiken skiljer sig något beroende på om XAML är lös XAML för en XAML-läsare, är XAML kompilerad till en DLL av XamlBuildTaskeller baml genereras av WPF:s PresentationBuildTask.

XAML-schemakontexten för WPF integreras med WPF-programmodellen, som i sin tur använder AppDomain samt andra faktorer som är WPF-implementeringsinformation.

XAML-indata för läsare (lös XAML)

  1. XAML-schemakontexten itererar genom programmets AppDomain och letar efter en redan inläst sammansättning som matchar alla aspekter av namnet, med början från den senast inlästa sammansättningen. Om en matchning hittas används den sammansättningen för lösning.

  2. I annat fall används en av följande tekniker baserat på CLR Assembly-API:et för att läsa in en sammansättning:

XamlBuildTask

XamlBuildTask används för Windows Communication Foundation (WCF) och Windows Workflow Foundation.

Observera att sammansättningsreferenser via XamlBuildTask alltid är fullständigt kvalificerade.

  1. Anropa Assembly.Load(String) på det kvalificerade namnet.

  2. Om föregående steg misslyckas använder du det korta namnet (och den offentliga nyckeltoken om det finns) för att anropa Assembly.Load(String).

BAML (PresentationBuildTask)

Det finns två aspekter av monteringsinläsning för BAML: inläsning av den första sammansättningen som innehåller BAML som en komponent och inläsning av typbackningssammansättningar för alla typer som refereras till av BAML-produktionen.

Sammansättningsbelastning för inledande markering:

Referensen till sammansättningen som ska läsas in pålägget från är alltid okvalificerad.

  1. WPF XAML-schemakontexten itererar genom AppDomain i WPF-programmet och letar efter en redan inläst sammansättning som matchar alla aspekter av namnet, med början från den senast inlästa sammansättningen. Om en matchning hittas används den sammansättningen för lösning.

  2. Om föregående steg misslyckas använder du det korta namnet (och den offentliga nyckeltoken om det finns) för att anropa Assembly.Load(String).

Sammansättningsreferenser efter BAML-typer:

Sammansättningsreferenser för typer som används i BAML-produktionen är alltid fullständigt kvalificerade som utdata från byggaktiviteten.

  1. WPF XAML-schemakontexten itererar genom AppDomain i WPF-programmet och letar efter en redan inläst sammansättning som matchar alla aspekter av namnet, med början från den senast inlästa sammansättningen. Om en matchning hittas används den sammansättningen för lösning.

  2. I annat fall används någon av följande tekniker för att läsa in en sammansättning:

    • Anropa Assembly.Load(String) på det kvalificerade namnet.

    • Om ett kort namn + en kombination av offentlig nyckeltoken matchar sammansättningen som BAML lästes in från använder du den sammansättningen.

    • Använd kort namn + token för offentlig nyckel för att anropa Assembly.Load(String).

Se även