Struktury a koncepty datových proudů uzlu XAML

Čtenáři XAML a zapisovače XAML implementované ve službách .NET XAML jsou založeny na konceptu návrhu datového proudu uzlu XAML. Stream uzlu XAML je konceptualizace sady uzlů XAML. V tomto konceptu prochází procesor XAML strukturou relací uzlů v XAML po jednom. V otevřeném streamu uzlu XAML existuje vždy jenom jeden aktuální záznam nebo aktuální pozice a mnoho aspektů sestavy rozhraní API pouze informace dostupné z této pozice. Aktuální uzel v datovém proudu uzlu XAML lze popsat jako objekt, člen nebo hodnotu. Díky zpracování XAML jako datového proudu uzlu XAML můžou čtenáři XAML komunikovat se zapisovači XAML a umožnit programu zobrazit, pracovat s ním nebo měnit obsah datového proudu uzlu XAML během operace načtení nebo operace uložení cesty, která zahrnuje XAML. Návrh rozhraní API pro čtení a zápis XAML a koncept streamu uzlu XAML jsou podobné předchozím návrhům a konceptům souvisejícím se čtečkami a zapisovači, jako jsou model DOM (Document Object Model) XML a XmlReader třídy.XmlWriter Toto téma popisuje koncepty datového proudu uzlu XAML a popisuje, jak můžete psát rutiny, které pracují s reprezentací XAML na úrovni uzlu XAML.

Načtení XAML do čtečky XAML

Základní XamlReader třída nehlásí konkrétní techniku načítání počátečního KÓDU XAML do čtečky XAML. Místo toho odvozená třída deklaruje a implementuje metodu načítání, včetně obecných charakteristik a omezení jeho vstupního zdroje pro XAML. Například XamlObjectReader přečte graf objektu počínaje vstupním zdrojem jednoho objektu, který představuje kořen nebo základ. Potom XamlObjectReader vytvoří datový proud uzlu XAML z grafu objektu.

Nejvýraznější podtřídou definovanou XamlReader službou .NET XAML Services je XamlXmlReader. XamlXmlReader načte počáteční XAML buď načtením textového souboru přímo prostřednictvím datového proudu nebo cesty k souboru, nebo nepřímo prostřednictvím související třídy čtenáře, například TextReader. Lze XamlReader si představit, že obsahuje celý vstupní zdroj XAML po načtení. Základní rozhraní API je ale navržené tak, XamlReader aby čtečka pracovala s jedním uzlem XAML. Při prvním načtení je první jeden uzel, na který narazíte, kořen XAML a jeho počáteční objekt.

Koncept streamu uzlu XAML

Pokud znáte přístup založený na JAZYCE DOM, metaforu stromové struktury nebo dotazování k přístupu k technologiím založeným na JAZYCE XML, je užitečný způsob, jak pojmenovat stream uzlu XAML, je následující. Představte si, že načtený XAML je DOM nebo strom, kde se všechny možné uzly rozbalí úplně a poté se zobrazí lineárně. Při procházení uzlů můžete procházet úrovně "in" nebo "out", které by byly relevantní pro dom, ale stream uzlu XAML explicitně nesleduje, protože tyto koncepty na úrovni nejsou relevantní pro datový proud uzlu. Stream uzlu má "aktuální" pozici, ale pokud jste neschovali jiné části datového proudu sami jako odkazy, všechny aspekty datového proudu uzlu jiné než aktuální pozice uzlu jsou mimo zobrazení.

Koncept streamu uzlu XAML má výhodu, že pokud procházíte celým streamem uzlu, máte jistotu, že jste zpracovali celou reprezentaci XAML; Nemusíte se obávat, že dotaz, operace MODELU DOM nebo jiný nelineární přístup ke zpracování informací vynechal určitou část kompletní reprezentace XAML. Z tohoto důvodu je reprezentace datového proudu uzlu XAML ideální pro připojení čteček XAML a zapisovačů XAML a k poskytování systému, kde můžete vložit vlastní proces, který funguje mezi fázemi čtení a zápisu operace zpracování XAML. V mnoha případech je pořadí uzlů v datovém proudu uzlu XAML záměrně optimalizováno nebo měnit pořadí čtenářů XAML v porovnání s tím, jak se pořadí může zobrazovat ve zdrojovém textu, binárním nebo objektovém grafu. Toto chování je určeno k vynucení architektury zpracování XAML, kdy zapisovače XAML nejsou nikdy v pozici, kde se musí v datovém proudu uzlu vrátit zpět. V ideálním případě by všechny operace zápisu XAML měly být schopné pracovat na základě kontextu schématu a aktuální pozice streamu uzlu.

Základní smyčka uzlu čtení

Základní smyčka uzlu čtení pro zkoumání streamu uzlu XAML se skládá z následujících konceptů. Pro účely smyček uzlů, jak je popsáno v tomto tématu, předpokládejme, že čtete textový soubor XAML, který je čitelný pro člověka pomocí XamlXmlReader. Odkazy v této části odkazují na konkrétní rozhraní API smyčky uzlu XAML implementované .XamlXmlReader

  • Ujistěte se, že nejste na konci datového proudu uzlu XAML (zaškrtněte IsEofnebo použijte návratové Read hodnoty). Pokud jste na konci datového proudu, neexistuje žádný aktuální uzel a měli byste ho ukončit.

  • Zkontrolujte, jaký typ uzlu datový proud uzlu XAML aktuálně zveřejňuje voláním NodeType.

  • Pokud máte přidružený zapisovač objektů XAML, který je připojený přímo, obvykle voláte WriteNode v tomto okamžiku.

  • Na základě toho, který XamlNodeType je hlášen jako aktuální uzel nebo aktuální záznam, zavolejte jednu z následujících metod, abyste získali informace o obsahu uzlu:

    • NodeType Pro volání nebo StartMemberEndMembervolání Member získat XamlMember informace o členu. Člen může být , XamlDirectivea proto nemusí být nutně konvenční typ-definovaný člen předchozího objektu. x:Name Například použitý na objekt se zobrazí jako člen XAML, kde IsDirective je true a Name člen je Name, s dalšími vlastnostmi označujícími, že tato direktiva je pod oborem názvů XAML jazyka XAML.

    • NodeType Pro volání nebo StartObjectEndObjectvolání Type získat XamlType informace o objektu.

    • NodeType Pro volání Value, volání Value. Uzel je hodnota pouze v případě, že se jedná o nejjednodušší výraz hodnoty člena nebo inicializační text objektu (měli byste ale vědět o chování převodu typu, jak je popsáno v nadcházející části tohoto tématu).

    • NodeType Pro volání NamespaceDeclarationNamespace pro získání informací o oboru názvů pro uzel oboru názvů.

  • Volání Read pro přechod čtečky XAML na další uzel ve streamu uzlu XAML a opakujte kroky znovu.

Stream uzlu XAML, který poskytuje čtečky XAML služby .NET XAML Services, vždy poskytuje úplnou hloubkovou procházení všech možných uzlů. Mezi typické techniky řízení toku smyčky uzlu XAML patří definování těla uvnitř while (reader.Read())a zapnutí NodeType v každém bodě uzlu ve smyčce uzlu.

Pokud je stream uzlu na konci souboru, aktuální uzel má hodnotu null.

Nejjednodušší smyčka, která používá čtečku a zapisovač, se podobá následujícímu příkladu.

XamlXmlReader xxr = new XamlXmlReader(new StringReader(xamlStringToLoad));
//where xamlStringToLoad is a string of well formed XAML
XamlObjectWriter xow = new XamlObjectWriter(xxr.SchemaContext);
while (xxr.Read()) {
  xow.WriteNode(xxr);
}

Tento základní příklad smyčky uzlu XAML s cestou načítání transparentně spojuje čtečku XAML a zapisovač XAML, což se nijak neliší od toho, jestli jste použili XamlServices.Parse. Tato základní struktura se pak rozšíří tak, aby platila pro váš scénář čtení nebo zápisu. Některé možné scénáře jsou následující:

  • Zapněte .NodeType V závislosti na typu uzlu, který se čte, proveďte různé akce.

  • Nevolejte WriteNode ve všech případech. Volejte WriteNode jenom v některých NodeType případech.

  • V rámci logiky pro konkrétní typ uzlu analyzujte specifika daného uzlu a zareagujte na ně. Můžete například napsat pouze objekty, které pocházejí z konkrétního oboru názvů XAML, a potom vyřadit nebo odložit všechny objekty, které nejsou z tohoto oboru názvů XAML. Nebo můžete odstranit nebo jinak znovu zpracovat jakékoli direktivy XAML, které váš systém XAML nepodporuje jako součást zpracování člena.

  • Definujte vlastní XamlObjectWriter , který přepíše Write* metody, pravděpodobně provádí mapování typů, které obchází kontext schématu XAML.

  • XamlXmlReader Vytvořte objekt pro použití nedefaultovaného kontextu schématu XAML, aby přizpůsobené rozdíly v chování XAML používali čtenář i zapisovač.

Přístup k XAML nad rámec konceptu smyčky uzlu

Existují potenciálně jiné způsoby práce s jinou reprezentací XAML než jako smyčka uzlu XAML. Například může existovat čtečka XAML, která může číst indexovaný uzel nebo zejména přistupovat k uzlům přímo pomocí , podle x:Namex:Uidnebo prostřednictvím jiných identifikátorů. Služby .NET XAML neposkytují úplnou implementaci, ale poskytují navrhovaný vzor prostřednictvím služeb a typů podpory. Další informace najdete v tématech IXamlIndexingReader a XamlNodeList.

Práce s aktuálním uzlem

Většina scénářů, které používají smyčku uzlu XAML, nečte pouze uzly. Většina scénářů zpracovává aktuální uzly a předává každý uzel po jednom do implementace XamlWriter.

V typickém scénáři cesty k načtení vytvoří XamlXmlReader stream uzlu XAML; uzly XAML se zpracovávají podle vaší logiky a kontextu schématu XAML a uzly se předávají do objektu XamlObjectWriter. Výsledný graf objektů pak integrujete do aplikace nebo architektury.

V typickém scénáři XamlObjectReader cesty k uložení se zpracují graf objektů, zpracují se jednotlivé uzly XAML a XamlXmlWriter výstup serializovaného výsledku jako textový soubor XAML. Klíčem je, že cesty i scénáře zahrnují práci s přesně jedním uzlem XAML najednou a uzly XAML jsou k dispozici pro zpracování standardizovaným způsobem, který je definován systémem typů XAML a the.NET rozhraníMI API služeb XAML.

Rámce a obor

Smyčka uzlu XAML prochází streamem uzlu XAML lineárním způsobem. Datový proud uzlu prochází do objektů, do členů, které obsahují další objekty atd. Často je užitečné sledovat rozsah v rámci datového proudu uzlu XAML implementací konceptu rámce a zásobníku. To platí zejména v případě, že aktivně upravujete datový proud uzlu, když jste v něm. Podpora rámce a zásobníku, kterou implementujete jako součást logiky smyčky uzlu, by mohla spočítat StartObject (nebo GetObject) a EndObject rozsahy při sestupu do struktury uzlu XAML, pokud je struktura považována za z hlediska modelu DOM.

Procházení a zadávání uzlů objektů

Prvním uzlem v datovém proudu uzlu při otevření čtečkou XAML je uzel počátečního objektu kořenového objektu. Podle definice je tento objekt vždy jedním uzlem objektu a nemá žádné partnerské vztahy. V jakémkoli skutečném příkladu XAML je kořenový objekt definován tak, aby měl jednu nebo více vlastností, které obsahují více objektů, a tyto vlastnosti mají členské uzly. Členské uzly pak mají jeden nebo více uzlů objektů nebo se místo toho můžou ukončit v uzlu hodnoty. Kořenový objekt obvykle definuje názvové rozsahy XAML, které jsou syntakticky přiřazeny jako atributy v textovém kódu XAML, ale mapují se na Namescope typ uzlu v reprezentaci datového proudu uzlu XAML.

Představte si následující příklad XAML (jedná se o libovolný kód XAML, který není podporován existujícími typy v .NET). Předpokládejme, že v tomto objektovém modelu, je z Favora jsou přiřaditelné Favor, Balloon.Color vlastnost je podporována Color objektem podobným tomu, FavorCollection jak WPF definuje barvy jako známé názvy barev a Color podporuje převaděč typů pro syntaxi atributů.NoiseMakerBalloonList<T>

Kód XAML Výsledný stream uzlu XAML
<Party Namespace uzel pro Party
xmlns="PartyXamlNamespace"> StartObject uzel pro Party
<Party.Favors> StartMember uzel pro Party.Favors
StartObject uzel pro implicitní FavorCollection
StartMember node for implicit FavorCollection items property.
<Balloon StartObject uzel pro Balloon
Color="Red" StartMember uzel pro Color

Value uzel pro řetězec hodnoty atributu "Red"

EndMember pro Color
HasHelium="True" StartMember uzel pro HasHelium

Value uzel pro řetězec hodnoty atributu "True"

EndMember pro HasHelium
> EndObject pro Balloon
<NoiseMaker>Loudest</NoiseMaker> StartObject uzel pro NoiseMaker

StartMember uzel pro _Initialization

Value uzel pro inicializační řetězec hodnoty "Loudest"

EndMember uzel pro _Initialization

EndObject pro NoiseMaker
EndMember node for implicit FavorCollection items property.
EndObject uzel pro implicitní FavorCollection
</Party.Favors> EndMember pro Favors
</Party> EndObject pro Party

Ve streamu uzlu XAML můžete spoléhat na následující chování:

  • Namespace Pokud uzel existuje, přidá se do datového proudu bezprostředně před StartObject deklarovaný obor názvů XAML s xmlns. Znovu se podívejte na předchozí tabulku s xaml a ukázkovým streamem uzlu. Všimnětesichm bodům a Namespace uzlům, jak StartObject se zdá být transponovány a jejich pozice deklarace v textové Toto je reprezentativní chování, kdy se uzly oboru názvů vždy zobrazují před uzlem, na který se vztahují ve streamu uzlu. Účelem tohoto návrhu je, že informace o oboru názvů jsou nezbytné pro zapisovače objektů a musí být známé před tím, než se zapisovač objektu pokusí provést mapování typů nebo jinak zpracovat objekt. Umístění informací o oboru názvů XAML před obor aplikace do datového proudu usnadňuje vždy zpracování datového proudu uzlu v uvedeném pořadí.

  • Vzhledem k výše uvedenému předpokladu je to jeden nebo více Namespace uzlů, které jste si přečetli jako první ve většině skutečných případů při procházení uzlů od začátku, nikoli StartObject v kořenovém adresáři.

  • Za StartObject uzlem může následovat StartMember, Valuenebo okamžitá EndObject. Nikdy není následovat okamžitě jiným StartObject.

  • Za ním StartMember může následovat , StartObjectValuenebo okamžitá EndMember. Může následovat GetObject, pro členy, kde hodnota má pocházet z existující hodnoty nadřazeného objektu, a nikoli vytvořit StartObject instanci nové hodnoty. Může také následovat Namespace uzel, který se vztahuje na nadcházející StartObject. Nikdy není následovat okamžitě jiným StartMember.

  • Value Uzel představuje samotnou hodnotu; neexistuje žádná hodnota EndValue. Za ním může následovat pouze .EndMember

    • Text inicializace XAML objektu, který může být použit konstrukce, nemá za následek strukturu Object-Value. Místo toho se vytvoří vyhrazený členský uzel pro člena s názvem _Initialization . a tento členský uzel obsahuje inicializační řetězec hodnoty. Pokud existuje, _Initialization je vždy první StartMember. _Initialization může být kvalifikovaný v některých reprezentacích služeb XAML pomocí názvového oboru XAML jazyka XAML, aby bylo jasné, že _Initialization není definovaná vlastnost v backingových typech.

    • Kombinace Member-Value představuje nastavení atributu hodnoty. Při zpracování této hodnoty může být nakonec zapojen převaděč hodnot a hodnota je prostý řetězec. To se však nevyhodnocuje, dokud zapisovač objektu XAML nezvřídí tento datový proud uzlu. Zapisovač objektu XAML má potřebný kontext schématu XAML, mapování systému typů a další podporu potřebnou pro převody hodnot.

  • Uzel EndMember může následovat StartMember uzel pro dalšího člena nebo EndObject uzel pro vlastníka člena.

  • Uzel EndObject může následovat za EndMember uzlem. Může také následovat StartObject uzel pro případy, kdy jsou objekty partnerskými uzly v položkách kolekce. Nebo může následovat Namespace uzel, který se vztahuje na nadcházející StartObject.

    • U jedinečného případu zavření celého datového proudu EndObject uzlu není za kořenem nic následovat; čtenář je nyní konec souboru a Read vrátí false.

Převaděče hodnot a stream uzlu XAML

Převaděč hodnot je obecný termín pro rozšíření značek, převaděč typů (včetně serializátorů hodnot) nebo jinou vyhrazenou třídu, která je hlášena jako převaděč hodnot prostřednictvím systému typů XAML. Ve streamu uzlu XAML mají použití převaděče typů a použití rozšíření značek velmi odlišné reprezentace.

Převaděče typů ve streamu uzlu XAML

Sada atributů, která nakonec vede k použití převaděče typů, se v datovém proudu uzlu XAML hlásí jako hodnota člena. Datový proud uzlu XAML se nepokoušel vytvořit objekt instance převaděče typů a předat mu hodnotu. Použití implementace převodu převaděče typů vyžaduje vyvolání kontextu schématu XAML a jeho použití pro mapování typu. Dokonce i určení třídy převaděče typů, která má být použita ke zpracování hodnoty vyžaduje kontext schématu XAML nepřímo. Pokud použijete výchozí kontext schématu XAML, budou tyto informace k dispozici v systému typů XAML. Pokud potřebujete informace o třídě převaděče typů na úrovni datového proudu uzlu XAML před připojením k zapisovači XAML, můžete je získat z XamlMember informací o členu, který je nastaven. V opačném případě by se vstup převaděče typů měl zachovat v datovém proudu uzlu XAML jako prostý údaj, dokud zbývající operace, které vyžadují systém mapování typů a kontext schématu XAML, se provádějí, například vytvoření objektu zapisovačem objektů XAML.

Představte si například následující osnovu definice třídy a použití XAML:

public class BoardSizeConverter : TypeConverter {
  //converts from string to an int[2] by splitting on an "x" char
}
public class GameBoard {
  [TypeConverter(typeof(BoardSizeConverter))]
  public int[] BoardSize; //2x2 array, initialization not shown
}
<GameBoard BoardSize="8x8"/>

Textová reprezentace datového proudu uzlu XAML pro toto použití může být vyjádřena takto:

StartObjects reprezentací XamlTypeGameBoard

StartMembers reprezentací XamlMemberBoardSize

Value node s textovým řetězcem "8x8"

EndMember Odpovídá BoardSize

EndObject Odpovídá GameBoard

Všimněte si, že v tomto datovém proudu uzlu není žádná instance převaděče typů. Můžete však získat informace o převaděči typů voláním XamlMember.TypeConverterXamlMember pro BoardSize. Pokud máte platný kontext schématu XAML, můžete také vyvolat metody převaděče získáním instance z ConverterInstance.

Rozšíření značek ve streamu uzlu XAML

Využití rozšíření značek je hlášeno ve streamu uzlu XAML jako uzel objektu v rámci členu, kde objekt představuje instanci rozšíření značek. Použití rozšíření značek je tedy explicitněji prezentováno v reprezentaci datového proudu uzlu, než je použití převaděče typů, a přináší více informací. XamlMember informace o rozšíření značek vám nemohly nic říct, protože použití je situační a liší se v každém možném případě značek; není vyhrazená a implicitní pro typ nebo člen stejně jako u převaděčů typů.

Reprezentace rozšíření značek v podobě streamu uzlu jako uzly objektů je případ, i když bylo použití rozšíření značek provedeno ve formě atributu v textovém kódu XAML (což je často případ). Použití rozšíření značek, které používaly explicitní formulář elementu objektu, jsou zpracovávány stejným způsobem.

V uzlu objektu rozšíření značek můžou existovat členové tohoto rozšíření značek. Reprezentace streamu uzlu XAML zachovává použití tohoto rozšíření značek, ať už se jedná o použití pozičního parametru nebo použití s explicitními pojmenovanými parametry.

Pro použití pozičních parametrů datový proud uzlu XAML obsahuje vlastnost _PositionalParameters definovanou jazykem XAML, která zaznamenává využití. Tato vlastnost je obecná List<T> s Object omezením. Omezení je objekt, a nikoli řetězec, protože použití pozičních parametrů může obsahovat vnořené použití rozšíření značek v něm. Pokud chcete získat přístup k pozičním parametrům z použití, můžete iterovat seznamem a použít indexery pro jednotlivé hodnoty seznamu.

Pro použití pojmenovaného parametru je každý pojmenovaný parametr reprezentován jako členský uzel tohoto názvu ve streamu uzlu. Hodnoty členů nemusí být nutně řetězce, protože může existovat vnořené použití rozšíření značek.

ProvideValue z rozšíření značek ještě není vyvolána. Vyvolá se však, pokud připojíte čtečku XAML a zapisovač XAML tak, aby WriteEndObject byl vyvolán na uzlu rozšíření značek při prozkoumání ve streamu uzlu uzlu. Z tohoto důvodu obecně potřebujete stejný kontext schématu XAML, který je k dispozici, jako by byl použit k vytvoření grafu objektu v cestě načtení. Jinak může ProvideValue z jakéhokoli rozšíření značek vyhodit výjimky, protože nemá k dispozici očekávané služby.

Jazykově definované členy XAML a XML ve streamu uzlu XAML

Některé členy jsou zavedeny do datového proudu uzlu XAML kvůli interpretacím a konvencím čtenáře XAML místo explicitního XamlMember vyhledávání nebo konstrukce. Tyto členy jsou často direktivy XAML. V některých případech se jedná o čtení xaml, které zavádí direktivu do datového proudu uzlu XAML. Jinými slovy, původní vstupní text XAML explicitně nezadal direktivu člena, ale čtečka XAML vloží direktivu, aby splňovala strukturální konvenci XAML a informace sestavy v datovém proudu uzlu XAML před ztrátou informací.

V následujícím seznamu jsou uvedeny všechny případy, kdy se očekává, že čtenář XAML zavede členský uzel direktivy XAML a jak je tento členský uzel identifikován v implementacích služeb XAML .NET.

  • Text inicializace pro uzel objektu: Název tohoto členového uzlu je _Initialization, představuje direktivu XAML a je definován v oboru názvů XAML jazyka XAML. Statickou entitu pro ni můžete získat z Initialization.

  • Poziční parametry rozšíření značek: Název tohoto uzlu člena je _PositionalParametersa je definován v oboru názvů XAML jazyka XAML. Vždy obsahuje obecný seznam objektů, z nichž každý je předdělaný pozičním parametrem rozdělením , na znak oddělovače, jak je uvedeno ve vstupním kódu XAML. Statickou entitu pro direktivu pozičních parametrů můžete získat z PositionalParameters.

  • Neznámý obsah: Název tohoto uzlu člena je _UnknownContent. Přesněji řečeno, je to a XamlDirectiveje definován v oboru názvů XAML jazyka XAML. Tato direktiva se používá jako sentinel pro případy, kdy element objektu XAML obsahuje obsah ve zdrojovém kódu XAML, ale v aktuálně dostupném kontextu schématu XAML nelze určit žádnou vlastnost obsahu. Tento případ můžete zjistit v datovém proudu uzlu XAML tak, že vyhledáte členy s názvem _UnknownContent. Pokud se ve streamu uzlu XAML s cestou načtení neprovedou žádná jiná akce, výchozí XamlObjectWriter vyvolá pokus při pokusu WriteEndObject o výskyt člena na libovolném objektu _UnknownContent . Výchozí hodnota XamlXmlWriter se nevyvolá a považuje člena za implicitní. Můžete získat statickou entitu pro _UnknownContent .UnknownContent

  • Vlastnost kolekce: I když záložní typ CLR třídy kolekce, která se používá pro XAML, má obvykle vyhrazenou pojmenovanou vlastnost, která obsahuje položky kolekce, tato vlastnost není známa systému typů XAML před řešením typu backing. Místo toho datový proud uzlu XAML zavádí Items zástupný symbol jako člena typu XAML kolekce. V implementaci služby .NET XAML Services je _Itemsnázev této direktivy nebo člena v datovém proudu uzlu . Konstantu pro tuto direktivu lze získat z Items.

    Všimněte si, že datový proud uzlu XAML může obsahovat vlastnost Items s položkami, které se ukázaly jako neanalyzovatelné na základě rozlišení záložního typu a kontextu schématu XAML. Příklad:

  • Členy definované jazykem XML xml:langxml:base: Definované XML a xml:space členy jsou hlášeny jako direktivy XAML s názvem base, langa space v implementacích .NET XAML Services. Obor názvů pro tyto obory názvů je obor názvů http://www.w3.org/XML/1998/namespaceXML . Konstanty pro každý z nich lze získat z XamlLanguage.

Pořadí uzlů

V některýchpřípadechch kódech XAML v některých případech XamlXmlReader změní pořadí uzlů XAML ve streamu uzlu XAML v porovnání s pořadím, ve které se uzly zobrazí, nebo pokud jsou zpracovány jako XML. To se provádí tak, aby uzly uspořádaly tak, aby XamlObjectWriter mohly zpracovávat datový proud uzlu jen vpřed. Ve službách .NET XAML čtenář XAML přeuspořádá uzly místo toho, aby tento úkol opustil zapisovač XAML, jako optimalizaci výkonu pro uživatele zapisovače objektů XAML streamu uzlu.

Určité direktivy jsou určeny speciálně k poskytnutí dalších informací pro vytvoření objektu z objektu elementu. Tyto direktivy jsou: Initialization, PositionalParameters, TypeArgumentsFactoryMethod, Arguments. Čtenáři XAML služeb .NET XAML se pokusí umístit tyto direktivy jako první členy do datového proudu uzlu za objektem StartObjectz důvodů, které jsou vysvětleny v další části.

Chování XamlObjectWriter a pořadí uzlů

StartObject na objekt XamlObjectWriter není nutně signál pro zapisovač objektu XAML, který okamžitě vytvoří instanci objektu. XAML obsahuje několik jazykových funkcí, které umožňují inicializovat objekt s dodatečným vstupem, a nespoléhá se výhradně na vyvolání konstruktoru bez parametrů k vytvoření počátečního objektu a teprve potom nastavení vlastností. Mezi tyto funkce patří: XamlDeferLoadAttribute; inicializační text; x:TypeArguments; poziční parametry rozšíření značek; metody továrny a přidružené uzly x:Arguments (XAML 2009). Každý z těchto případů zpožďuje skutečnou konstrukci objektu a vzhledem k tomu, že je stream uzlu přeuspořádaný, může zapisovač objektu XAML spoléhat na chování skutečného sestavení instance, kdykoli je zjištěn počáteční člen, který není konkrétně direktivou konstrukce pro daný typ objektu.

GetObject

GetObject představuje uzel XAML, kde místo vytvoření nového objektu by měl zapisovač objektu XAML místo toho získat hodnotu obsahující vlastnost objektu. Typický případ, kdy GetObject je uzel zjištěn ve streamu uzlu XAML je pro objekt kolekce nebo objekt slovníku, pokud je vlastnost obsahující záměrně jen pro čtení v backingovém objektovém modelu typu. V tomto scénáři se kolekce nebo slovník často vytváří a inicializuje (obvykle prázdné) inicializační logikou vlastního typu.

Viz také