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 jeName
, 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:Uid
nebo 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 hodnotuzel 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ředStartObject
, 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á, žeStartObject
aNamespace
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, nikoliStartObject
kořenového adresáře.Za uzlem
StartObject
může následovatStartMember
,Value
nebo okamžitáEndObject
. Nikdy není následovat okamžitě jinýmStartObject
.Za
StartMember
může následovatStartObject
,Value
nebo bezprostředníEndMember
. Může následovatGetObject
, pro členy, kde hodnota má pocházet z existující hodnoty nadřazeného objektu místoStartObject
, která vytvoří instanci nové hodnoty. Může také následovat uzelNamespace
, který se vztahuje na nadcházejícíStartObject
. Nikdy není následovat okamžitě jinýmStartMember
.Uzel
Value
představuje samotnou hodnotu; neexistuje žádná hodnota EndValue. Může následovat pouzeEndMember
.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ásledovatStartMember
uzel pro dalšího člena nebo uzelEndObject
pro vlastníka člena.Za
EndObject
uzlem může následovatEndMember
uzel. Může také následovat uzelStartObject
pro případy, kdy jsou objekty partnerskými uzly v položkách kolekce. Nebo může následovat uzelNamespace
, 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
.
- U jedinečného případu zavření celého datového proudu uzlu není za
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
_PositionalParameters
a 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 oWriteEndObject
, 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
axml:space
členy jsou hlášeny jako direktivy XAML s názvembase
,lang
aspace
v implementacích .NET XAML Services. Obor názvů pro tyto obory názvů je obor názvů XMLhttp://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 StartObject
objektu 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é
- XamlObjectReader
- služeb XAML
- obory názvů XAML
.NET Desktop feedback