Delen via


Standaardcontext XAML-schema en WPF XAML-schemacontext

Een XAML-schemacontext is een conceptuele entiteit die in aanmerking komt hoe een XAML-productie die gebruikmaakt van een bepaalde XAML-woordenlijst communiceert met het gedrag van het schrijven van objecten, inclusief hoe typetoewijzingen worden omgezet, hoe assembly's worden geladen, hoe bepaalde instellingen voor lezer en schrijver worden geïnterpreteerd. In dit onderwerp worden de functies van .NET XAML Services en de bijbehorende standaard XAML-schemacontext beschreven, die is gebaseerd op het CLR-typesysteem. In dit onderwerp wordt ook de XAML-schemacontext beschreven die wordt gebruikt voor WPF.

Standaardcontext voor XAML-schema

.NET XAML Services implementeert en maakt gebruik van een standaard XAML-schemacontext. Het standaardgedrag van de XAML-schemacontext is niet altijd volledig zichtbaar in de API van de XamlSchemaContext-klasse. In veel gevallen is het gedrag dat de standaardcontext van het XAML-schema beïnvloedt echter waarneembaar via een algemene API van het XAML-typesysteem, zoals leden van XamlMember of XamlType, of via API's die worden weergegeven op XAML-lezers en XAML-schrijvers die de standaardcontext van het XAML-schema gebruiken.

U kunt een XamlSchemaContext maken waarmee het standaardgedrag wordt ingekapseld door de XamlSchemaContext constructor aan te roepen. Hiermee maakt u expliciet de standaard XAML-schemacontext. Dezelfde standaard XAML-schemacontext wordt impliciet gemaakt als u een XAML-lezer of XAML-schrijver initialiseert met behulp van API's die niet expliciet een XamlSchemaContext invoerparameter gebruiken.

De standaardcontext van het XAML-schema is afhankelijk van CLR-reflectie voor het gedrag van de typetoewijzing. Dit omvat het onderzoeken van de definiërende CLR-Typeen gerelateerde PropertyInfo of MethodInfo. Ook wordt de CLR-toewijzing voor typen of leden gebruikt om de specifieke gegevens voor het XAML-type of XAML-lid in te vullen die het clr-backingtype gebruiken. De standaard XAML-schemacontext vereist geen systeemextensietechnieken zoals het Invoker patroon, omdat de benodigde informatie beschikbaar is vanuit het CLR-typesysteem.

Voor de logica voor het laden van assembly's is de standaardcontext van het XAML-schema voornamelijk afhankelijk van assemblywaarden die worden geleverd in XAML-naamruimtetoewijzingen. LocalAssembly kan ook een assembly aan uw werk laten zien voor scenario's zoals het laden van interne typen.

WPF XAML-schemacontext

De WPF XAML-schemacontext wordt beschreven in dit onderwerp omdat de WPF-implementatie een interessante illustratie biedt van de soorten functies die kunnen worden geïntroduceerd door een niet-standaard XAML-schemacontext te implementeren. Ook wordt het concept van de XAML-schemacontext niet veel besproken in de WPF-documentatie die betrekking heeft op WPF XAML; het gedrag dat de XAML-schemacontext mogelijk maakt, is mogelijk alleen volledig begrijpelijk als deze is geïntegreerd met een discussie over de werking van de standaard-XAML-schemacontext. De WPF XAML-schemacontext implementeert het volgende gedrag.

onderdrukkingen voor opzoeken: WPF heeft een aantal inhoudsmodellen voor XAML, waarbij er XAML-inhoudseigenschappen zijn die werken zonder ContentPropertyAttribute toegeschreven. LookupContentProperty onderdrukkingen voor WPF dit gedrag implementeren.

Uitstel voor WPF-expressies: WPF bevat verschillende expressieklassen die een waarde uitstellen totdat een runtimecontext beschikbaar is. Sjabloonuitbreiding is ook een runtimegedrag dat afhankelijk is van uitsteltechnieken.

Type systeemzoekoptimalisaties: WPF heeft een uitgebreid XAML-vocabulaire en objectmodel, waaronder definities van basisklasseleden die overnemen van letterlijk honderden WPF-gedefinieerde klassen. Ook is WPF zelf verspreid over verschillende assembly's. WPF optimaliseert het opzoeken van het type met behulp van opzoektabellen en andere technieken. Dit biedt prestatieverbeteringen ten opzichte van de standaard XAML-schemacontext en de op CLR gebaseerde typezoekactie. In gevallen waarin typen niet bestaan in een opzoektabel, gebruikt het gedrag XAML-schemacontexttechnieken die vergelijkbaar zijn met de standaard-XAML-schemacontext.

extensie XamlType en XamlMember: WPF breidt eigenschapsconcepten uit met afhankelijkheidseigenschappen en gebeurtenisconcepten met gerouteerde gebeurtenissen. Om deze concepten meer inzicht te geven in XAML-verwerkingsbewerkingen, wordt WPF uitgebreid XamlType en XamlMember, en worden interne eigenschappen toegevoegd die afhankelijkheidseigenschap en gerouteerde gebeurteniskenmerken rapporteren.

Toegang tot de WPF XAML-schemacontext

Als u XAML-technieken gebruikt die zijn gebaseerd op de WPF-System.Windows.Markup.XamlReader of System.Windows.Markup.XamlWriter, wordt de WPF XAML-schemacontext al gebruikt voor deze XAML-lezer en XAML writer-implementaties.

Als u andere XAML-lezer of XAML writer-implementaties gebruikt die niet worden geïnitialiseerd met de context van het WPF XAML-schema, kunt u mogelijk een werkende WPF XAML-schemacontext krijgen van XamlReader.GetWpfSchemaContext. U kunt deze waarde vervolgens gebruiken als initialisatie voor andere API's die gebruikmaken van een XamlSchemaContext. U kunt bijvoorbeeld XamlXmlReader aanroepen voor initialisatie en de WPF XAML-schemacontext doorgeven. U kunt ook de WPF XAML-schemacontext gebruiken voor systeembewerkingen van het type XAML. Dit kan bijvoorbeeld de initialisatie van een XamlType of XamlMemberzijn, of het aanroepen van XamlSchemaContext.GetXamlType.

Houd er rekening mee dat als u bepaalde aspecten van WPF XAML opent vanuit een puur XAML-knooppuntstroomperspectief, sommige van de WPF-frameworkmogelijkheden mogelijk nog niet hebben gereageerd. WPF-sjablonen voor besturingselementen worden bijvoorbeeld nog niet toegepast. Als u dus toegang krijgt tot een eigenschap die tijdens de uitvoering kan worden gevuld met een volledige visuele structuur, ziet u mogelijk alleen een eigenschapswaarde die verwijst naar een sjabloon. De servicecontext voor WPF-markeringsextensies is mogelijk ook niet nauwkeurig als deze afkomstig is van een niet-runtime-situatie en kan leiden tot uitzonderingen bij het schrijven van een objectgrafiek.

XAML en assembly laden

Assembly laden voor XAML en .NET XAML Services kan worden geïntegreerd met het CLR-gedefinieerde concept van AppDomain. Een XAML-schemacontext interpreteert hoe u assembly's laadt of typen zoekt tijdens runtime of ontwerptijd, op basis van het gebruik van AppDomain en andere factoren. De logica verschilt enigszins, afhankelijk van of de XAML losjes XAML is voor een XAML-lezer, is XAML gecompileerd in een DLL door XamlBuildTask, of wordt BAML gegenereerd door de PresentationBuildTaskvan WPF.

De XAML-schemacontext voor WPF kan worden geïntegreerd met het WPF-toepassingsmodel, dat op zijn beurt gebruikmaakt van AppDomain en andere factoren die WPF-implementatiedetails zijn.

XAML-lezerinvoer (losse XAML)

  1. De XAML-schemacontext doorloopt de AppDomain van de toepassing, op zoek naar een al geladen assembly die overeenkomt met alle aspecten van de naam, beginnend bij de laatst geladen assembly. Als er een overeenkomst wordt gevonden, wordt die assembly gebruikt voor resolutie.

  2. Anders worden een van de volgende technieken op basis van CLR Assembly API gebruikt om een assembly te laden:

XamlBuildTask

XamlBuildTask wordt gebruikt voor Windows Communication Foundation (WCF) en Windows Workflow Foundation.

Merk op dat assemblyverwijzingen via XamlBuildTask altijd volledig gekwalificeerd zijn.

  1. Roep Assembly.Load(String) aan op de gekwalificeerde naam.

  2. Als de vorige stap mislukt, gebruikt u de korte naam (en het openbare-sleuteltoken indien aanwezig) om Assembly.Load(String)aan te roepen.

BAML (PresentationBuildTask)

Er zijn twee aspecten voor het laden van assembly's voor BAML: het laden van de eerste assembly die de BAML als onderdeel bevat en het laden van de type-backingassembly's voor alle typen waarnaar wordt verwezen door de BAML-productie.

Assemblybelasting voor initiële opmaak:

De verwijzing naar de assembly waaruit de markeringen moeten worden geladen, is altijd niet gekwalificeerd.

  1. De WPF XAML-schemacontext doorloopt de AppDomain van de WPF-toepassing, op zoek naar een al geladen assembly die overeenkomt met alle aspecten van de naam, beginnend bij de laatst geladen assembly. Als er een overeenkomst wordt gevonden, wordt die assembly gebruikt voor resolutie.

  2. Als de vorige stap mislukt, gebruikt u de korte naam (en het openbare-sleuteltoken indien aanwezig) om Assembly.Load(String)aan te roepen.

Assemblyverwijzingen door BAML-typen:

Assemblyverwijzingen voor typen die in de BAML-productie worden gebruikt, zijn altijd volledig gekwalificeerd als uitvoer van de build-taak.

  1. De WPF XAML-schemacontext doorloopt de AppDomain van de WPF-toepassing, op zoek naar een al geladen assembly die overeenkomt met alle aspecten van de naam, beginnend bij de laatst geladen assembly. Als er een overeenkomst wordt gevonden, wordt die assembly gebruikt voor resolutie.

  2. Anders wordt een van de volgende technieken gebruikt om een assembly te laden:

    • Roep Assembly.Load(String) aan op de gekwalificeerde naam.

    • Als een korte naam + openbare-sleuteltokencombinatie overeenkomt met de assembly waaruit de BAML is geladen, gebruikt u die assembly.

    • Gebruik een korte naam + openbare-sleuteltoken om Assembly.Load(String)aan te roepen.

Zie ook