Výchozí kontext schématu XAML a kontext schématu WPF 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 třídy XamlSchemaContext. 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 členy XamlMember nebo XamlType, nebo prostřednictvím rozhraní API vystavených pro čtenáře XAML a zapisovače XAML, které používají výchozí kontext schématu XAML.
Můžete vytvořit XamlSchemaContext, který zapouzdřuje výchozí chování voláním XamlSchemaContext konstruktoru. 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í vstupní parametr XamlSchemaContext.
Výchozí kontext schématu XAML závisí na reflexi CLR pro chování mapování typu. To zahrnuje zkoumání definování TypeCLR a souvisejících 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 je vzor Invoker
, protože nezbytné informace jsou k dispozici v 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. LocalAssembly také může naznačovat sestavení, 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 modelů obsahu pro XAML, kde existují vlastnosti obsahu XAML, které fungují bez ContentPropertyAttribute atributu. LookupContentProperty přepsání pro WPF toto chování implementují.
Deferral pro výrazy WPF: 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í v systému typů: 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. Aby byly tyto koncepty přehlednější pro operace zpracování XAML, WPF rozšiřuje XamlType a XamlMembera př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 System.Windows.Markup.XamlReader WPF 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é se neicializují s kontextem schématu WPF XAML, můžete z XamlReader.GetWpfSchemaContextzískat funkční kontext schématu WPF XAML . Tuto hodnotu pak můžete použít jako inicializaci pro jiné rozhraní API, které používají XamlSchemaContext. Můžete například volat XamlXmlReader pro 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. To může zahrnovat inicializaci konstrukce XamlType nebo XamlMember, nebo volá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 AppDomaindefinovaným jazykem CLR . 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 XamlBuildTask
, nebo je BAML generována WPF 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 podrobnosti implementace WPF.
Vstup čtečky XAML (volný KÓD XAML)
Kontext schématu XAML prochází AppDomain aplikace 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í.
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:
Pokud je název v mapování kvalifikovaný, zavolejte Assembly.Load(String) pro kvalifikovaný název.
Pokud předchozí krok selže, použijte krátký název (a token veřejného klíče, pokud je k dispozici) k volání Assembly.Load(String).
Pokud je název v mapování nekvalifikovaný, zavolejte Assembly.LoadWithPartialName.
XamlBuildTask
XamlBuildTask
se používá pro Windows Communication Foundation (WCF) a Windows Workflow Foundation.
Všimněte si, že odkazy na sestavení prostřednictvím XamlBuildTask
jsou vždy plně kvalifikované.
Zavolejte Assembly.Load(String) na kvalifikovaný název.
Pokud předchozí krok selže, použijte krátký název (a token veřejného klíče, pokud je k dispozici) k volání 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ý.
Kontext schématu WPF XAML prochází 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í.
Pokud předchozí krok selže, použijte krátký název (a token veřejného klíče, pokud je k dispozici) k volání 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í.
Kontext schématu WPF XAML prochází 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í.
V opačném případě se k načtení sestavení použije jedna z následujících technik:
Zavolejte Assembly.Load(String) na 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é
.NET Desktop feedback