XAML düğümü akış yapıları ve kavramları

.NET XAML Hizmetleri'nde uygulanan XAML okuyucuları ve XAML yazıcıları, XAML düğümü akışının tasarım kavramını temel alır. XAML düğüm akışı, XAML düğümleri kümesinin kavramsallaştırmasıdır. Bu kavramsallaştırmada XAML işlemcisi, XAML'deki düğüm ilişkilerinin yapısında birer birer yol gösterir. Herhangi bir zamanda, açık bir XAML düğümü akışında yalnızca bir geçerli kayıt veya geçerli konum bulunur ve API'nin birçok yönü yalnızca bu konumdan sağlanan bilgileri rapor eder. XAML düğümü akışındaki geçerli düğüm nesne, üye veya değer olarak tanımlanabilir. XAML okuyucuları, XAML'yi bir XAML düğümü akışı olarak ele alarak XAML yazıcılarıyla iletişim kurabilir ve bir programın bir yük yolu veya XAML içeren bir kaydetme yolu işlemi sırasında bir XAML düğüm akışının içeriğini görüntülemesini, etkileşim kurmasını veya değiştirmesini sağlayabilir. XAML okuyucu ve yazıcı API'sinin tasarımı ve XAML düğümü akışı kavramı, XML Belge Nesne Modeli (DOM) ve ve XmlWriter sınıfları gibi önceki ilgili okuyucu ve yazıcı tasarımlarına ve kavramlarına XmlReader benzer. Bu konu, XAML düğümü akışı kavramlarını ele alır ve XAML düğüm düzeyinde XAML gösterimleriyle etkileşim kuran yordamları nasıl yazabileceğinizi açıklar.

XAML'yi XAML Okuyucusuna Yükleme

Temel XamlReader sınıf, ilk XAML'yi bir XAML okuyucusuna yüklemek için belirli bir tekniği bildirmez. Bunun yerine türetilmiş bir sınıf, XAML için giriş kaynağının genel özellikleri ve kısıtlamaları da dahil olmak üzere yükleme tekniğini bildirir ve uygular. Örneğin, kök XamlObjectReader veya tabanı temsil eden tek bir nesnenin giriş kaynağından başlayarak nesne grafını okur. daha XamlObjectReader sonra nesne grafından bir XAML düğüm akışı oluşturur.

En göze çarpan .NET XAML Hizmetleri tanımlı XamlReader alt sınıfıdır XamlXmlReader. XamlXmlReader , bir metin dosyasını doğrudan bir akış veya dosya yolu üzerinden ya da dolaylı olarak gibi TextReaderilgili bir okuyucu sınıfı aracılığıyla yükleyerek ilk XAML'yi yükler. XamlReader yüklendikten sonra XAML giriş kaynağının tamamını içeren olarak düşünülebilir. Ancak temel API, XamlReader okuyucunun XAML'nin tek bir düğümüyle etkileşim kurabilmesi için tasarlanmıştır. İlk yüklendiğinde, karşılaştığınız ilk tek düğüm XAML'nin kökü ve başlangıç nesnesidir.

XAML Düğümü Akış Kavramı

XML tabanlı teknolojilere erişmeye yönelik DOM, ağaç metaforu veya sorgu tabanlı yaklaşım hakkında daha fazla bilgi sahibiyseniz, XAML düğümü akışını kavramsallaştırmanın yararlı bir yolu aşağıdaki gibidir. Yüklenen XAML'nin bir DOM veya her olası düğümün tamamen genişletildiği ve ardından doğrusal olarak sunulduğu bir ağaç olduğunu düşünün. Düğümler arasında ilerledikçe, DOM ile ilgili olabilecek düzeylerden "in" veya "out" geçiyor olabilirsiniz, ancak bu düzey kavramları bir düğüm akışıyla ilgili olmadığından XAML düğüm akışı açıkça izlemez. Düğüm akışının "geçerli" bir konumu vardır, ancak akışın diğer bölümlerini başvuru olarak kendiniz depolamadığınız sürece, geçerli düğüm konumu dışındaki düğüm akışının her yönü görüntüden çıkar.

XAML düğüm akışı kavramı, düğüm akışının tamamında ilerlerseniz XAML gösteriminin tamamını işlediğinize emin olmanızdan önemli bir avantaja sahiptir; Bir sorgunun, DOM işleminin veya bilgileri işlemeye yönelik başka bir doğrusal olmayan yaklaşımın XAML gösteriminin tamamının bir kısmını kaçırdığından endişelenmeniz gerekmez. Bu nedenle, XAML düğümü akış gösterimi hem XAML okuyucularını hem de XAML yazıcılarını bağlamak ve XAML işleme işleminin okuma ve yazma aşamaları arasında işlem yapan kendi işleminizi ekleyebileceğiniz bir sistem sağlamak için idealdir. Çoğu durumda, XAML düğüm akışındaki düğümlerin sırası, XAML okuyucuları tarafından özellikle iyileştirilir veya yeniden sıralanır ve sıranın kaynak metinde, ikili veya nesne grafiğinde nasıl görünebileceğine göre belirlenir. Bu davranış, XAML yazıcılarının düğüm akışında "geri" gitmeleri gereken bir konumda olmadığı bir XAML işleme mimarisini zorlamaya yöneliktir. İdeal olan, tüm XAML yazma işlemlerinin şema bağlamını ve düğüm akışının geçerli konumunu temel alarak işlem yapabilmesidir.

Temel Okuma Düğümü Döngüsü

XAML düğüm akışını incelemeye yönelik temel bir okuma düğümü döngüsü aşağıdaki kavramlardan oluşur. Bu konuda açıklandığı gibi düğüm döngülerinin amaçları için kullanarak metin tabanlı, insan tarafından okunabilir bir XAML dosyası XamlXmlReaderokuduğunuz varsayın. Bu bölümdeki bağlantılar tarafından XamlXmlReaderuygulanan belirli XAML düğüm döngüsü API'sine başvurur.

  • XAML düğüm akışının sonunda olmadığından emin olun (değerini denetleyin IsEofveya dönüş değerini kullanın Read ). Akışın sonundaysanız geçerli bir düğüm yoktur ve çıkış yapmalısınız.

  • XAML düğüm akışının şu anda kullanıma sunduğu düğüm türünü çağırarak NodeTypedenetleyin.

  • Doğrudan bağlı ilişkili bir XAML nesne yazıcınız varsa, genellikle bu noktada çağırırsınız WriteNode .

  • XamlNodeType Geçerli düğüm veya geçerli kayıt olarak bildirilen kayıt temelinde, düğüm içeriği hakkında bilgi edinmek için aşağıdakilerden birini çağırın:

    • veya EndMemberiçin NodeTypeStartMember, bir üye hakkında bilgi almak XamlMember için arayınMember. Üye bir XamlDirectiveolabilir ve bu nedenle önceki nesnenin geleneksel tür tanımlı bir üyesi olmayabilir. Örneğin, x:Name bir nesneye uygulanan, true olan IsDirective bir XAML üyesi olarak görünür ve Name üyenin öğesi, Namebu yönergenin XAML dili XAML ad alanı altında olduğunu gösteren diğer özelliklerle birlikte şeklindedir.

    • veya EndObjectiçin NodeTypeStartObject, bir nesne hakkında bilgi almak XamlType için çağrısı Type yapın.

    • bir NodeType için Valueöğesini çağırın Value. Düğüm, yalnızca bir üye için değerin en basit ifadesi veya bir nesnenin başlatma metniyse bir değerdir (ancak, bu konunun yaklaşan bir bölümünde belgelendiği gibi tür dönüştürme davranışını bilmeniz gerekir).

    • bir NodeType için NamespaceDeclaration, bir ad alanı düğümü için ad alanı bilgilerini almak için çağrısında Namespace bulunur.

  • XAML okuyucuyu XAML düğüm akışındaki bir sonraki düğüme ilerletmek için çağrısı Read yapıp adımları tekrarlayın.

.NET XAML Hizmetleri XAML okuyucuları tarafından sağlanan XAML düğümü akışı her zaman tüm olası düğümlerin tam ve derin bir geçişi sağlar. XAML düğüm döngüsü için tipik akış denetimi teknikleri, içinde while (reader.Read())bir gövde tanımlamayı ve düğüm döngüsündeki her düğüm noktasında açma NodeType işlemini içerir.

Düğüm akışı dosyanın sonundaysa geçerli düğüm null olur.

Okuyucu ve yazıcı kullanan en basit döngü aşağıdaki örneğe benzer.

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);
}

Yük yolu XAML düğüm döngüsünün bu temel örneği, XAML okuyucusu ile XAML yazıcısını saydam bir şekilde bağlar ve kullandığınızdan XamlServices.Parsefarklı bir şey yapmıyor. Ancak bu temel yapı daha sonra okuma veya yazma senaryonuza uygulanacak şekilde genişletilir. Bazı olası senaryolar şunlardır:

  • öğesini açın NodeType. Okunan düğüm türüne bağlı olarak farklı eylemler gerçekleştirin.

  • Her durumda aramayın WriteNode . Yalnızca bazı NodeType durumlarda araWriteNode.

  • Belirli bir düğüm türünün mantığı içinde, bu düğümün ayrıntılarını analiz edin ve bunlar üzerinde işlem gerçekleştirin. Örneğin, yalnızca belirli bir XAML ad alanından gelen nesneleri yazabilir ve sonra bu XAML ad alanından olmayan nesneleri bırakabilir veya erteleyebilirsiniz. Ya da XAML sisteminizin üye işleme kapsamında desteklemediği XAML yönergelerini bırakabilir veya başka bir şekilde yeniden işleyebilirsiniz.

  • Yöntemleri geçersiz kılanWrite*, büyük olasılıkla XAML şema bağlamı atlayan tür eşlemesi gerçekleştiren bir özel XamlObjectWriter öğe tanımlayın.

  • XAML davranışındaki özelleştirilmiş farklılıkların XamlXmlReader hem okuyucu hem de yazıcı tarafından kullanılması için, XAML şeması bağlamını kullanmak için öğesini oluşturun.

Düğüm Döngüsü Kavramının Ötesinde XAML'ye Erişme

XAML düğümü döngüsü dışında bir XAML gösterimiyle çalışmanın başka yolları da olabilir. Örneğin, dizine alınan bir düğümü okuyabilen bir XAML okuyucusu olabilir veya özellikle düğümlere doğrudan x:Name, veya x:Uiddiğer tanımlayıcılar aracılığıyla erişir. .NET XAML Hizmetleri tam bir uygulama sağlamaz, ancak hizmetler ve destek türleri aracılığıyla önerilen bir desen sağlar. Daha fazla bilgi için bkz. IXamlIndexingReader ve XamlNodeList.

Geçerli Düğümle Çalışma

XAML düğüm döngüsü kullanan senaryoların çoğu yalnızca düğümleri okumaz. Çoğu senaryo geçerli düğümleri işler ve her düğümü tek tek uygulamasına XamlWritergeçirir.

Tipik yük yolu senaryosunda, bir XamlXmlReader XAML düğüm akışı oluşturur; XAML düğümleri mantığınıza ve XAML şema bağlamınıza göre işlenir ve düğümler öğesine XamlObjectWritergeçirilir. Ardından sonuçta elde edilen nesne grafını uygulamanıza veya çerçevenize tümleştirirsiniz.

Tipik bir kaydetme yolu senaryosunda, bir XamlObjectReader nesne grafiğini okur, tek tek XAML düğümleri işlenir ve serileştirilmiş XamlXmlWriter sonucu XAML metin dosyası olarak verir. Anahtar, hem yolların hem de senaryoların aynı anda tam olarak bir XAML düğümüyle çalışmayı içermesi ve XAML düğümlerinin XAML türü sistemi ve the.NET XAML Hizmetleri API'leri tarafından tanımlanan standartlaştırılmış bir şekilde işleme için kullanılabilir olmasıdır.

Çerçeveler ve Kapsam

XAML düğüm döngüsü, bir XAML düğümü akışında doğrusal bir şekilde yol gösterir. Düğüm akışı nesnelere, diğer nesneleri içeren üyelere vb. arasında geçiş sağlar. Genellikle bir çerçeve ve yığın kavramı uygulayarak kapsamı XAML düğüm akışı içinde izlemek yararlı olur. Bu durum özellikle düğüm akışının içindeyken etkin bir şekilde ayarlıyorsanız geçerlidir. Düğüm döngüsü mantığınızın bir parçası olarak uyguladığınız çerçeve ve yığın desteği, yapı DOM perspektifinden düşünülüyorsa bir XAML düğüm yapısına indikçe (veya GetObject) ve EndObject kapsamları sayabilir StartObject .

Nesne Düğümlerini Geçirme ve Girme

XAML okuyucusu tarafından açıldığında düğüm akışındaki ilk düğüm, kök nesnenin start-object düğümüdür. Tanım gereği, bu nesne her zaman tek bir nesne düğümüdür ve eşleri yoktur. Herhangi bir gerçek dünya XAML örneğinde kök nesne, daha fazla nesne barındıran bir veya daha fazla özelliğe sahip olacak şekilde tanımlanır ve bu özelliklerin üye düğümleri vardır. Ardından üye düğümlerin bir veya daha fazla nesne düğümü vardır veya bunun yerine bir değer düğümünde sonlandırabilirsiniz. Kök nesnesi genellikle XAML metin işaretlemesinde öznitelik olarak atanan ancak XAML düğüm akışı gösterimindeki bir Namescope düğüm türüyle eşlenen XAML ad kapsamlarını tanımlar.

Aşağıdaki XAML örneğini göz önünde bulundurun (bu, .NET'teki mevcut türler tarafından desteklenmeyen rastgele XAML'dir). Bu nesne modelinde değerinin FavorCollectionFavorBalloon olduğunu List<T> ve NoiseMaker öğesine Favoratanabilir olduğunu varsayalım. Özelliğin Balloon.Color WPF'nin renkleri bilinen renk adları olarak tanımlamasına benzer bir Color nesne tarafından yedeklendiğini ve Color öznitelik söz dizimi için tür dönüştürücüsü desteklediğini varsayalım.

XAML işaretlemesi Sonuçta elde edilen XAML düğümü akışı
<Party Namespace düğümü Party
xmlns="PartyXamlNamespace"> StartObject düğümü Party
<Party.Favors> StartMember düğümü Party.Favors
StartObject örtük düğüm FavorCollection
StartMember örtük FavorCollection öğeler özelliği için düğüm.
<Balloon StartObject düğümü Balloon
Color="Red" StartMember düğümü Color

Value öznitelik değeri dizesi düğümü "Red"

Color için EndMember
HasHelium="True" StartMember düğümü HasHelium

Value öznitelik değeri dizesi düğümü "True"

HasHelium için EndMember
> Balloon için EndObject
<NoiseMaker>Loudest</NoiseMaker> StartObject düğümü NoiseMaker

StartMember düğümü _Initialization

Value başlatma değeri dizesi düğümü "Loudest"

EndMember düğümü _Initialization

NoiseMaker için EndObject
EndMember örtük FavorCollection öğeler özelliği için düğüm.
EndObject örtük düğüm FavorCollection
</Party.Favors> Favors için EndMember
</Party> Party için EndObject

XAML düğümü akışında aşağıdaki davranışa güvenebilirsiniz:

  • Bir Namespace düğüm varsa, ile XAML ad alanını xmlnsbildirmeden StartObject hemen önce akışa eklenir. XAML ve örnek düğüm akışı ile önceki tabloya yeniden bakın. ve Namespace düğümlerinin metin işaretlemesindeki StartObject bildirim konumlarına göre nasıl çevrilmiş gibi göründüğüne dikkat edin. Bu, ad alanı düğümlerinin her zaman düğüm akışında uygulandıkları düğümün önünde göründüğü davranışı temsil eden bir davranıştır. Bu tasarımın amacı, ad alanı bilgilerinin nesne yazıcıları için çok önemli olması ve nesne yazıcının tür eşlemesi gerçekleştirmeye veya nesneyi başka bir şekilde işlemeye çalışmadan önce bilinmesi gerekir. XAML ad alanı bilgilerini uygulama kapsamının önüne akışa yerleştirmek, düğüm akışını her zaman sunulan sırayla işlemeyi kolaylaştırır.

  • Yukarıdaki dikkate alındığından, düğümleri kökten değilStartObject, başlangıçtan geçiş yaparken çoğu gerçek dünya işaretleme örneğinde ilk olarak okuduğunuz bir veya daha fazla Namespace düğümdür.

  • Bir StartObject düğümün ardından StartMember, Valueveya anlık EndObjectbir olabilir. Hiçbir zaman hemen başka bir StartObjecttarafından takip edilir.

  • bir StartMember , veya hemen EndMembertarafından takip StartObjectValueedilebilir. Bunu, değerin yeni bir değer örneği oluşturacak bir değer yerine StartObject üst nesnenin mevcut bir değerinden gelmesi gereken üyeler için tarafından takip GetObjectedilebilir. Bunu, yaklaşan StartObjectbir Namespace için geçerli olan bir düğüm de takip edebilir. Hiçbir zaman hemen başka bir StartMembertarafından takip edilir.

  • Düğüm Value değerin kendisini temsil eder; "EndValue" yoktur. Yalnızca bir EndMembertarafından takip edilebilir.

    • Yapı tarafından kullanılabilecek nesnenin XAML başlatma metni Nesne-Değer yapısına neden olmaz. Bunun yerine, adlı _Initialization üye için ayrılmış bir üye düğümü oluşturulur. ve bu üye düğümü başlatma değeri dizesini içerir. Varsa, _Initialization her zaman ilk StartMemberolur. _Initialization , yedekleme türlerinde tanımlı bir özellik olmadığını netleştirmek _Initialization için XAML dili XAML ad kapsamına sahip bazı XAML hizmet gösterimlerinde nitelenebilir.

    • Üye-Değer bileşimi, değerin öznitelik ayarını temsil eder. Sonunda bu değerin işlenmesinde bir değer dönüştürücüsü olabilir ve değer düz bir dizedir. Ancak, bir XAML nesne yazıcısı bu düğüm akışını işleyene kadar bu değerlendirilmez. XAML nesne yazıcısı, gerekli XAML şema bağlamını, tür sistem eşlemesini ve değer dönüştürmeleri için gereken diğer desteği içerir.

  • Bir EndMember düğümü izleyen üye için bir StartMember düğüm veya üye sahibi için bir EndObject düğüm takip edebilir.

  • Bir EndObject düğümün ardından bir EndMember düğüm gelebilir. Ayrıca, bir koleksiyonun öğelerinde nesnelerin eş olduğu durumlar için bir düğüm tarafından da takip StartObject edilebilir. Ya da bir düğüm tarafından Namespace takip edilebilir ve bu düğüm yaklaşan StartObjectbir için geçerlidir.

    • Düğüm akışının tamamını kapatmanın benzersiz durumu için kökün EndObject arkasından hiçbir şey gelmez; okuyucu artık dosya sonudur ve Read döndürür false.

Değer Dönüştürücüleri ve XAML Düğümü Akışı

Değer dönüştürücüsü, işaretleme uzantısı, tür dönüştürücüsü (değer serileştiricileri dahil) veya XAML tür sistemi aracılığıyla değer dönüştürücü olarak bildirilen başka bir ayrılmış sınıf için genel bir terimdir. XAML düğümü akışında tür dönüştürücü kullanımı ve işaretleme uzantısı kullanımı çok farklı gösterimlere sahiptir.

XAML Düğümü Akışında Tür Dönüştürücüleri

XAML düğümü akışında sonunda bir tür dönüştürücü kullanımıyla sonuçlanan bir öznitelik kümesi üyenin değeri olarak bildirilir. XAML düğüm akışı bir tür dönüştürücü örneği nesnesi üretmeye çalışmaz ve değeri buna geçirmez. Tür dönüştürücüsunun dönüştürme uygulamasını kullanmak için XAML şema bağlamını çağırmak ve bunu tür eşlemesi için kullanmak gerekir. Değeri işlemek için hangi tür dönüştürücü sınıfının kullanılacağını belirlemek için bile dolaylı olarak XAML şema bağlamı gerekir. Varsayılan XAML şema bağlamını kullandığınızda, bu bilgiler XAML türü sisteminden kullanılabilir. XAML yazıcısına bağlanmadan önce XAML düğümü akış düzeyinde tür dönüştürücü sınıf bilgilerine ihtiyacınız varsa, bunu ayarlanan üyenin bilgilerinden XamlMember alabilirsiniz. Ancak, tür eşleme sistemi ve XAML şema bağlamı gerektiren işlemlerin geri kalanı, örneğin bir XAML nesne yazıcısı tarafından nesne oluşturma gerçekleştirilene kadar, tür dönüştürücü girişi XAML düğüm akışında düz bir değer olarak korunmalıdır.

Örneğin, bunun için aşağıdaki sınıf tanımı ana hattını ve XAML kullanımını göz önünde bulundurun:

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"/>

Bu kullanım için XAML düğümü akışının metin gösterimi aşağıdaki gibi ifade edilebilir:

StartObject temsil XamlType eden GameBoard

StartMember temsil XamlMember eden BoardSize

Value node, "8x8" metin dizesiyle

EndMember Eşleşen BoardSize

EndObject Eşleşen GameBoard

Bu düğüm akışında tür dönüştürücü örneği olmadığına dikkat edin. Ancak için BoardSizeöğesini XamlMember çağırarak XamlMember.TypeConverter tür dönüştürücü bilgilerini alabilirsiniz. Geçerli bir XAML şema bağlamı varsa, dosyasından ConverterInstancebir örnek alarak dönüştürücü yöntemlerini de çağırabilirsiniz.

XAML Düğüm Akışındaki İşaretlemeyi Genişletme

XAML düğümü akışında bir işaretleme uzantısı kullanımı, nesnenin bir işaretleme uzantısı örneğini temsil ettiği bir üye içinde nesne düğümü olarak bildirilir. Bu nedenle, bir işaretleme uzantısı kullanımı düğüm akışı gösteriminde tür dönüştürücü kullanımına göre daha açık bir şekilde sunulur ve daha fazla bilgi taşır. XamlMember kullanım durumsal olduğundan ve her olası işaretleme örneğinde farklılık gösterdiğinden, bu bilgiler size işaretleme uzantısı hakkında hiçbir şey anlatamadığını; tür dönüştürücülerinde olduğu gibi tür veya üye başına ayrılmış ve örtük değildir.

İşaretlemeyi genişletme uzantılarının nesne düğümleri olarak düğüm akışı gösterimi, işaretleme uzantısı kullanımı XAML metin işaretlemesinde öznitelik biçiminde yapılmış olsa bile (genellikle böyledir). Açık nesne öğesi formu kullanan işaretleme uzantısı kullanımları da aynı şekilde ele alınıyor.

Bir işaretleme uzantısı nesne düğümünde, bu işaretleme uzantısının üyeleri olabilir. XAML düğümü akış gösterimi, konumsal parametre kullanımı veya açık adlandırılmış parametreler içeren bir kullanım olsun, bu işaretleme uzantısının kullanımını korur.

Konumsal parametre kullanımı için XAML düğümü akışı, kullanımı kaydeden bir XAML dil tanımlı özellik _PositionalParameters içerir. Bu özellik, kısıtlaması olan Object genel List<T> bir özelliktir. Bir konumsal parametre kullanımı içinde iç içe işaretleme uzantısı kullanımları içerebileceğinden kısıtlama dize değil nesnedir. Kullanımdan konumsal parametrelere erişmek için, listede yinelenebilir ve tek tek liste değerleri için dizin oluşturucuları kullanabilirsiniz.

Adlandırılmış parametre kullanımı için, adlandırılmış her parametre düğüm akışında bu adın üye düğümü olarak temsil edilir. İç içe işaretleme uzantısı kullanımı olabileceğinden üye değerleri dize olmayabilir.

ProvideValue işaretleme uzantısından henüz çağrılmadı. Ancak, düğüm akışında incelediğinizde işaretleme uzantısı düğümünde çağrılması için WriteEndObject bir XAML okuyucusu ve XAML yazıcısı bağlarsanız çağrılır. Bu nedenle, genellikle yük yolunda nesne grafını oluşturmak için kullanılan XAML şeması bağlamını kullanmanız gerekir. Aksi takdirde, ProvideValue herhangi bir işaretleme uzantısından burada özel durumlar oluşturabilir, çünkü kullanılabilir beklenen hizmetlere sahip değildir.

XAML Düğümü Akışında XAML ve XML Dil Tanımlı Üyeler

Belirli üyeler, açık XamlMember arama veya derleme yerine XAML okuyucusunun yorumları ve kuralları nedeniyle bir XAML düğümü akışına tanıtılır. Bu üyeler genellikle XAML yönergeleridir. Bazı durumlarda, yönergesini XAML düğüm akışına tanıtır XAML'yi okuma eylemidir. Başka bir deyişle, özgün giriş XAML metni açıkça üye yönergesini belirtmedi, ancak XAML okuyucusu bu bilgiler kaybolmadan önce yapısal bir XAML kuralını karşılamak ve XAML düğümü akışındaki bilgileri bildirmek için yönergesini ekler.

Aşağıdaki listede, bir XAML okuyucusunun yönerge XAML üye düğümü tanıtmasının beklendiği tüm durumlar ve bu üye düğümün .NET XAML Hizmetleri uygulamalarında nasıl tanımlandığı not edilir.

  • Nesne düğümü için başlatma metni: Bu üye düğümün adı, _Initializationbir XAML yönergesini temsil eder ve XAML dili XAML ad alanında tanımlanır. statik Initializationbir varlık elde edebilirsiniz.

  • Bir işaretleme uzantısının konumsal parametreleri: Bu üye düğümün adı olur _PositionalParametersve XAML dili XAML ad alanında tanımlanır. Her zaman, giriş XAML'sinde sağlanan sınırlayıcı karakterine , bölünerek önceden ayrılmış konumsal bir parametre olan nesnelerin genel bir listesini içerir. konumundan konumsal parametreler yönergesi PositionalParametersiçin statik bir varlık alabilirsiniz.

  • Bilinmeyen içerik: Bu üye düğümünün adı şeklindedir _UnknownContent. Kesin olarak belirtmek gerekirse, bir XamlDirectiveve XAML dili XAML ad alanında tanımlanır. Bu yönerge, bir XAML nesne öğesinin kaynak XAML'de içerik içerdiği ancak şu anda kullanılabilir olan XAML şema bağlamı altında hiçbir içerik özelliğinin belirlenemediği durumlar için sentinel olarak kullanılır. adlı _UnknownContentüyeleri denetleyerek bir XAML düğüm akışında bu durumu algılayabilirsiniz. Bir yük yolu XAML düğümü akışında başka bir eylem gerçekleştirilmezse, herhangi bir nesnede üyeyle karşılaştığında _UnknownContent varsayılan XamlObjectWriter olarak denendi WriteEndObject oluşturulur. Varsayılan XamlXmlWriter değer oluşturmaz ve üyeyi örtük olarak ele alır. için _UnknownContent statik bir varlık alabilirsiniz.UnknownContent

  • Koleksiyonun koleksiyon özelliği: XAML için kullanılan bir koleksiyon sınıfının destekleyen CLR türü genellikle koleksiyon öğelerini tutan ayrılmış adlandırılmış bir özelliğe sahip olsa da, bu özellik, yedekleme türü çözümlemesi öncesinde bir XAML türü sistemi tarafından bilinmez. Bunun yerine, XAML düğüm akışı koleksiyon XAML türünün üyesi olarak bir Items yer tutucu ekler. .NET XAML Hizmetleri uygulamasında, düğüm akışındaki bu yönergenin veya üyenin adı olur _Items. Bu yönerge için bir sabit' den Itemsalınabilir.

    Bir XAML düğüm akışının, yedekleme türü çözümlemesine ve XAML şema bağlamı temelinde ayrıştırılamayan öğelere sahip bir Items özelliği içerebileceğini unutmayın. Örneğin,

  • XML tanımlı üyeler: XML tanımlı xml:baseve xml:space üyeleri, xml:lang .NET XAML Hizmetleri uygulamalarında , langve space adlı baseXAML yönergeleri olarak bildirilir. Bunların ad alanı XML ad alanıdır http://www.w3.org/XML/1998/namespace. Bunların her biri için sabitler'den XamlLanguageelde edilebilir.

Düğüm Sırası

Bazı durumlarda, XamlXmlReader XAML düğüm akışındaki XAML düğümlerinin sırasını, işaretlemede görüntülendiği veya XML olarak işlendiği durumlarda düğümlerin görüntülenme sırasını değiştirir. Bu, düğümleri, bir XamlObjectWriter düğüm akışını yalnızca ileriye doğru işleyebilecek şekilde sıralamak için yapılır. .NET XAML Hizmetleri'nde XAML okuyucusu, düğüm akışının XAML nesne yazıcı tüketicileri için performans iyileştirmesi olarak bu görevi XAML yazıcısına bırakmak yerine düğümleri yeniden sıralar.

Belirli yönergeler, özellikle bir nesne öğesinden nesne oluşturmaya yönelik daha fazla bilgi sağlamaya yöneliktir. Bu yönergeler şunlardır: Initialization, PositionalParameters, TypeArguments, FactoryMethod, Arguments. .NET XAML Hizmetleri XAML okuyucuları, sonraki bölümde açıklanan nedenlerle bu yönergeleri bir nesnenin StartObjectöğesini izleyen düğüm akışına ilk üyeler olarak yerleştirmeye çalışır.

XamlObjectWriter Davranışı ve Düğüm Sırası

StartObjectXamlObjectWriter için XAML nesne yazıcısının nesne örneğini hemen oluşturması için bir sinyal olması şart değildir. XAML, bir nesneyi ek girişle başlatmayı ve ilk nesneyi üretmek için parametresiz bir oluşturucuyu çağırmayı ve yalnızca sonra özellikleri ayarlamayı sağlayan çeşitli dil özellikleri içerir. Bu özellikler şunlardır: XamlDeferLoadAttribute; başlatma metni; x:TypeArguments; işaretleme uzantısının konumsal parametreleri; fabrika yöntemleri ve ilişkili x:Arguments düğümleri (XAML 2009). Bu durumların her biri gerçek nesne yapısını geciktiriyor ve düğüm akışı yeniden sıralandığından, XAML nesne yazıcısı, özellikle bu nesne türü için bir oluşturma yönergesi olmayan bir başlangıç üyesiyle karşılaşıldığında örneği oluşturma davranışına güvenebilir.

GetObject

GetObject , XAML nesne yazıcısının yeni bir nesne oluşturmak yerine nesnenin içeren özelliğinin değerini alması gereken bir XAML düğümünü temsil eder. XAML düğüm akışında bir GetObject düğümle karşılaşıldığı tipik bir durum, içeren özellik arka plan türünün nesne modelinde kasıtlı olarak salt okunur olduğunda bir koleksiyon nesnesine veya sözlük nesnesine yöneliktir. Bu senaryoda, koleksiyon veya sözlük genellikle sahip olan bir türün başlatma mantığı tarafından oluşturulur ve başlatılır (genellikle boştur).

Ayrıca bkz.