Sdílet prostřednictvím


Výchozí kontext schématu XAML a kontext WPF schématu XAML

Kontext schématu XAML je koncepční entita, která kvalifikuje, jak produkční prostředí XAML, které používá konkrétní slovní zásobu XAML s chováním při zápisu objektu, včetně způsobu překladu mapování typů, načtení sestavení, způsobu interpretace určitých nastavení čtenáře a zapisovače. Toto téma popisuje funkce služeb .NET XAML a přidružený výchozí kontext schématu XAML, který je založen na systému typů CLR. Toto téma také popisuje kontext schématu XAML, který se používá pro WPF.

Výchozí kontext schématu XAML

Služby .NET XAML implementují i používají výchozí kontext schématu XAML. Výchozí chování kontextu schématu XAML není vždy plně viditelné v rozhraní API XamlSchemaContext třídy. V mnoha případech je však chování, které ovlivňuje výchozí kontext schématu XAML, pozorovatelné prostřednictvím společného rozhraní API systému typů XAML, jako jsou členové XamlMember systému typů XAML nebo XamlTyperozhraní API vystavená čtenářům XAML a zapisovačům XAML používajícím výchozí kontext schématu XAML.

Můžete vytvořit, XamlSchemaContext který zapouzdřuje výchozí chování voláním konstruktoru XamlSchemaContext . Tím se explicitně vytvoří výchozí kontext schématu XAML. Stejný výchozí kontext schématu XAML se vytvoří implicitně, pokud inicializujete čtečku XAML nebo zapisovač XAML pomocí rozhraní API, která explicitně nepřebírají XamlSchemaContext vstupní parametr.

Výchozí kontext schématu XAML závisí na reflexi CLR pro chování mapování typu. To zahrnuje zkoumání definice CLR Type, a související PropertyInfo nebo MethodInfo. K vyplnění specifik pro typ XAML nebo informace o členech, které používají backingový typ CLR, se také používá atribut CLR. Výchozí kontext schématu XAML nevyžaduje techniky rozšíření typu, jako Invoker je vzor, protože potřebné informace jsou k dispozici ze systému typů CLR.

Pro logiku načítání sestavení závisí výchozí kontext schématu XAML hlavně na všechny hodnoty sestavení zadané v mapování oboru názvů XAML. Může také radit sestavení, LocalAssembly které se má načíst, pro scénáře, jako je načítání interních typů.

Kontext schématu WPF XAML

Kontext schématu WPF XAML je popsán v tomto tématu, protože implementace WPF poskytuje zajímavý obrázek typů funkcí, které lze zavést implementací nevýkonného kontextu schématu XAML. Koncept kontextu schématu XAML se také příliš neprobírá v dokumentaci WPF, která řeší WPF XAML; Chování, které kontext schématu XAML umožňuje, může být plně pochopitelné pouze v případě, že je integrována s diskuzí o tom, jak funguje výchozí kontext schématu XAML. Kontext schématu WPF XAML implementuje následující chování.

Přepsání vyhledávání: WPF má několik kon režim stanu ls pro XAML, kde existují vlastnosti obsahu XAML, které fungují bez atributuContentPropertyAttribute. LookupContentProperty přepsání pro WPF implementuje toto chování.

Deferral for WPF expressions: WPF obsahuje několik tříd výrazů, které odloží hodnotu, dokud nebude k dispozici kontext modulu runtime. Rozšíření šablony je také chování modulu runtime, které závisí na technikách odložení.

Optimalizace vyhledávání typů systému: WPF má rozsáhlý slovník XAML a objektový model, včetně definic členů základní třídy, které dědí do doslova stovek tříd definovaných WPF. Také samotný WPF je rozložen do několika sestavení. WPF optimalizuje vyhledávání typu pomocí vyhledávacích tabulek a dalších technik. To poskytuje vylepšení výkonu oproti výchozímu kontextu schématu XAML a vyhledávání typu založenému na CLR. V případech, kdy typy ve vyhledávací tabulce neexistují, používá chování techniky kontextu schématu XAML, které jsou podobné výchozímu kontextu schématu XAML.

Rozšíření XamlType a XamlMember: WPF rozšiřuje koncepty vlastností s vlastnostmi závislostí a koncepty událostí se směrovanými událostmi. Chcete-li těmto konceptům poskytnout větší přehled o operacích zpracování XAML, WPF rozšiřuje XamlType a XamlMemberpřidává interní vlastnosti, které hlásí vlastnosti závislosti a směrované vlastnosti událostí.

Přístup k kontextu schématu WPF XAML

Pokud používáte techniky XAML založené na WPF System.Windows.Markup.XamlReader nebo System.Windows.Markup.XamlWriter, kontext schématu WPF XAML se již používá u těchto implementací pro čtení XAML a zapisovače XAML.

Pokud používáte jiné implementace čtení XAML nebo zapisovače XAML, které neicializují s kontextem schématu WPF XAML, možná budete moct získat funkční kontext schématu WPF XAML z XamlReader.GetWpfSchemaContext. Tuto hodnotu pak můžete použít jako inicializaci pro jiné rozhraní API, které používají XamlSchemaContext. Můžete například volat XamlXmlReader inicializaci a předat kontext schématu WPF XAML. Nebo můžete použít kontext schématu WPF XAML pro systémové operace typu XAML. Může to zahrnovat inicializaci XamlType konstrukce nebo XamlMembervolání XamlSchemaContext.GetXamlType.

Mějte na paměti, že pokud přistupujete k určitým aspektům WPF XAML z pohledu čistého streamu uzlu XAML, některé z funkcí architektury WPF ještě nemusí fungovat. Například šablony WPF pro ovládací prvky ještě nejsou použity. Pokud tedy přistupujete k vlastnosti, která může být za běhu naplněna úplným vizuálním stromem, může se zobrazit pouze hodnota vlastnosti, která odkazuje na šablonu. Kontext služby poskytovaný pro rozšíření značek WPF nemusí být také přesný, pokud je poskytován z jiné než runtime situace, a může vést k výjimkám při pokusu o zápis objektového grafu.

Načítání XAML a sestavení

Načítání sestavení pro SLUŽBY XAML a .NET XAML se integruje s konceptem definovaným AppDomainclR . Kontext schématu XAML interpretuje, jak načíst sestavení nebo najít typy za běhu nebo v době návrhu na základě použití AppDomain a dalších faktorů. Logika se mírně liší v závislosti na tom, zda XAML je volný XAML pro čtečku XAML, je XAML zkompilován do knihovny DLL pomocí XamlBuildTask, nebo je BAML vygenerován WPF ' s PresentationBuildTask.

Kontext schématu XAML pro WPF se integruje s aplikačním modelem WPF, který zase používá AppDomain , a také další faktory, které jsou podrobnostmi implementace WPF.

Vstup čtečky XAML (volný KÓD XAML)

  1. Kontext schématu XAML prochází AppDomain aplikací a hledá již načtené sestavení, které odpovídá všem aspektům názvu počínaje naposledy načteným sestavením. Pokud se najde shoda, použije se toto sestavení k rozlišení.

  2. V opačném případě se k načtení sestavení použije jedna z následujících technik založených na rozhraní CLR Assembly API:

XamlBuildTask

XamlBuildTask se používá pro Windows Communication Foundation (WCF) a Windows Workflow Foundation.

Všimněte si, že odkazy na sestavení jsou XamlBuildTask vždy plně kvalifikované.

  1. Zavolejte Assembly.Load(String) kvalifikovaný název.

  2. Pokud předchozí krok selže, zavolejte krátký název (a token veřejného klíče, pokud je k dispozici).Assembly.Load(String)

BAML (PresentationBuildTask)

Při načítání sestavení pro BAML existují dva aspekty: načtení počátečního sestavení, které obsahuje BAML jako součást, a načtení sestavení backing typu pro všechny typy odkazované v produkčním prostředí BAML.

Načtení sestavení pro počáteční značky:

Odkaz na sestavení, ze které se má načíst značky, je vždy nekvalifikovaný.

  1. Kontext schématu WPF XAML iteruje prostřednictvím AppDomain aplikace WPF a hledá již načtené sestavení, které odpovídá všem aspektům názvu počínaje naposledy načteným sestavením. Pokud se najde shoda, použije se toto sestavení k rozlišení.

  2. Pokud předchozí krok selže, zavolejte krátký název (a token veřejného klíče, pokud je k dispozici).Assembly.Load(String)

Odkazy na sestavení podle typů BAML:

Odkazy na sestavení pro typy používané v produkčním prostředí BAML jsou vždy plně kvalifikované jako výstup úlohy sestavení.

  1. Kontext schématu WPF XAML iteruje prostřednictvím AppDomain aplikace WPF a hledá již načtené sestavení, které odpovídá všem aspektům názvu počínaje naposledy načteným sestavením. Pokud se najde shoda, použije se toto sestavení k rozlišení.

  2. V opačném případě se k načtení sestavení použije jedna z následujících technik:

    • Zavolejte Assembly.Load(String) kvalifikovaný název.

    • Pokud se zkratka + kombinace tokenu veřejného klíče shoduje s sestavením, ze kterého byl načten BAML, použijte toto sestavení.

    • K volání Assembly.Load(String)použijte krátký název + token veřejného klíče .

Viz také