Sdílet prostřednictvím


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í XAML a zapisovač a koncept streamu uzlu XAML se podobají 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 a 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 načte graf objektu počínaje vstupním zdrojem jednoho objektu, který představuje kořen nebo základ. XamlObjectReader pak vytvoří datový proud uzlu XAML z grafu objektu.

Nejvýraznější služba .NET XAML Services definovaná XamlReader podtřídou 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. XamlReader si lze představit jako obsahující celý vstupní zdroj XAML po načtení. Základní rozhraní API XamlReader je ale navržené tak, 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 č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 (zkontrolujte IsEofnebo použijte Read návratové hodnoty). Pokud jste na konci datového proudu, neexistuje žádný aktuální uzel a měli byste ho ukončit.

  • Zkontrolujte, jaký typ uzlu stream 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 možností, abyste získali informace o obsahu uzlu:

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

    • Pro NodeTypeStartObject nebo EndObjectzavolejte Type získat XamlType informace o objektu.

    • Pro NodeTypeValuevolejte 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).

    • Pro NodeTypeNamespaceDeclarationzavolejte Namespace získat informace o oboru názvů pro uzel oboru názvů.

  • Voláním Read přejděte čtenáře 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 v rámci 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 pro načtení cesty transparentně spojuje čtečku XAML a zapisovač XAML, což se nijak neliší, než kdybyste 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. V některých NodeType případech volejte pouze WriteNode.

  • 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.

  • Vytvořte XamlXmlReader tak, aby používal nedefaultní kontext schématu XAML, aby byly přizpůsobené rozdíly v chování XAML používány čtenářem i zapisovačem.

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. Existuje například čtečka XAML, která může číst indexovaný uzel nebo zejména přistupuje k uzlům přímo x:Name, x: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ématu 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 implementaci XamlWriter.

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

V typickém scénáři cesty uložení XamlObjectReader čte graf objektů, zpracovávají se jednotlivé uzly XAML a XamlXmlWriter výstupem 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 typ uzlu Namescope 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 FavorCollection je List<T>Favor, Balloon a NoiseMaker lze přiřadit Favor, Balloon.Color vlastnost je zajištěna objektem Color podobně jako WPF definuje barvy jako známé názvy barev a Color podporuje převaděč typů pro syntaxi atributů.

Kód XAML Výsledný stream uzlu XAML
<Party uzel Namespace pro Party
xmlns="PartyXamlNamespace"> uzel StartObject pro Party
<Party.Favors> uzel StartMember pro Party.Favors
uzel StartObject pro implicitní FavorCollection
StartMember uzel pro implicitní vlastnost položky FavorCollection.
<Balloon uzel StartObject pro Balloon
Color="Red" uzel StartMember pro Color

Value uzel řetězce hodnot atributu "Red"

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

Value uzel řetězce hodnot atributu "True"

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

uzel StartMember pro _Initialization

Value uzel pro "Loudest" inicializačního řetězce hodnot

uzel EndMember pro _Initialization

EndObject pro NoiseMaker
EndMember uzel pro implicitní vlastnost položky FavorCollection.
uzel EndObject 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í:

  • Pokud existuje uzel Namespace, přidá se do datového proudu bezprostředně před StartObject, který deklaroval obor názvů XAML pomocí xmlns. Znovu se podívejte na předchozí tabulku s xaml a ukázkovým streamem uzlu. Všimněte si, jak se zdá, že StartObject a Namespace uzly jsou transponovány a jejich pozice deklarace v textovém kódu. 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 kořenového adresáře.

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

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

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

    • Text inicializace XAML objektu, který může být používán konstrukcí, nemá za následek Object-Value strukturu. 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í oboru názvů 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.

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

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

    • U jedinečného případu zavření celého datového proudu uzlu není za EndObject kořene nic následovat; čtečka je nyní na konci 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:

StartObject s XamlType představujícími GameBoard

StartMember s XamlMember představujícími BoardSize

Value uzel 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ů. Informace o převaděči typů však můžete získat voláním XamlMember.TypeConverter na XamlMember 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 vám o rozšíření značek nic neřekly, 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 definovanou jazykem XAML _PositionalParameters, která zaznamenává využití. Tato vlastnost je obecná List<T> s omezením Object. 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 se ještě nevyvolá. Vyvolá se však, pokud připojíte čtečku XAML a zapisovač XAML, aby WriteEndObject je vyvolána 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í. V opačném případě ProvideValue z jakéhokoli rozšíření značek mohou vyvolat výjimky, protože nemá k dispozici očekávané služby.

Členy Language-Defined 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, a ne prostřednictvím 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.

  • inicializační text pro uzel objektu: Název tohoto uzlu člena je _Initialization, představuje direktivu XAML a je definována 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 XamlDirectivea je 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 cesty načtení neprovedou žádné jiné akce, výchozí XamlObjectWriter vyvolá pokus o WriteEndObject, když narazí na _UnknownContent člen na libovolném objektu. Výchozí XamlXmlWriter nevyvolá a považuje člena za implicitní. Statickou entitu pro _UnknownContent můžete získat z UnknownContent.

  • Collection vlastnost kolekce: Ačkoli 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 backing typem rozlišení. Místo toho datový proud uzlu XAML zavádí zástupný symbol Items jako člena typu XAML kolekce. V implementaci služby .NET XAML Services je název této direktivy nebo člena ve streamu uzlu _Items. 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. Například

  • členy definované jazykem XML:xml:base, xml:lang 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ů XML http://www.w3.org/XML/1998/namespace. Konstanty pro každý z nich lze získat z XamlLanguage.

Pořadí uzlů

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í, pokud jsou zobrazeny v kódu nebo jsou zpracovány jako XML. To se provádí tak, aby uzly uspořádaly tak, aby XamlObjectWriter mohl zpracovávat datový proud uzlu pouze 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, TypeArguments, FactoryMethod, Arguments. Čtenáři XAML služby .NET XAML se pokusí umístit tyto direktivy jako první členy datového proudu uzlu za StartObjectobjektu z důvodů, které jsou vysvětleny v další části.

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

StartObject k XamlObjectWriter nemusí být 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é x:Arguments uzly (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 vytváření nového objektu by místo vytváření nového objektu měl zapisovač objektu získat hodnotu obsahující vlastnost objektu. Typický případ, kdy je v datovém proudu uzlu XAML zjištěn GetObject uzel, je určen objekt kolekce nebo objekt slovníku, pokud je vlastnost obsahující vlastnost záměrně jen pro čtení v objektovém modelu backingového 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é