XAML düğümü akış yapıları ve kavramları
.NET XAML Hizmetleri'ne uygulanan XAML okuyucuları ve XAML yazıcıları, XAML düğümü akışının tasarım kavramını temel almaktadır. XAML düğüm akışı, bir XAML düğümleri kümesi kavramsallaştırmadır. Bu kavramsallaştırmada, XAML işlemcisi XAML'de düğüm ilişkilerinin yapısını tek tek gösterir. Herhangi bir anda, açık bir XAML düğümü akışında yalnızca bir geçerli kayıt veya geçerli konum vardır ve API'nin birçok yönü yalnızca bu konumdan edinilen bilgileri rapor eder. Bir XAML düğümü akışındaki geçerli düğüm bir nesne, üye veya değer olarak açıklanmıştır. XAML okuyucuları XAML'yi bir XAML düğümü akışı olarak işleyenin, XAML yazıcılarıyla iletişim kurabilir ve bir programın XAML içeren bir yükleme yolu veya XAML içeren bir kaydetme yolu işlemi sırasında XAML düğümü akışının içeriğini görüntülemelerini, etkileşim kurmasını veya değiştirmelerini sağlar. XAML okuyucu ve yazıcı API'si tasarımı ve XAML düğümü akış kavramı, ÖNCEKI ilgili okuyucu ve yazıcı tasarımları ile XML Belge Nesne Modeli (DOM) ve ve sınıfları gibi kavramlara XmlReader XmlWriter benzer. Bu konu, XAML düğüm akışı kavramlarını ele almaktadır ve XAML düğümü düzeyinde XAML gösterimleriyle etkileşime geçme yordamlarını nasıl yazabilirsiniz?
XAML'i XAML Okuyucusu'na Yükleme
Temel XamlReader sınıf, ilk XAML'i bir XAML okuyucuya yüklemeye özel bir teknik bildirmiyor. 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 bildirerek uygulayan bir sınıftır. Örneğin, bir nesne grafını okur ve kök veya tabanı temsil eden XamlObjectReader tek bir nesnenin giriş kaynağından başlayarak. Ardından XamlObjectReader nesne grafiğinden bir XAML düğümü akışı oluşturur.
En belirgin .NET XAML Hizmetleri tanımlı XamlReader alt XamlXmlReader sınıfıdır. XamlXmlReader , bir metin dosyasını doğrudan bir akış veya dosya yoluyla ya da dolaylı olarak gibi ilgili bir okuyucu sınıfı aracılığıyla yükerek ilk XAML'i TextReader yükler. XamlReader, yüklendikten sonra XAML giriş kaynağının tamamını içeren olarak düşün olabilir. Ancak temel XamlReader API, okuyucunun XAML'nin tek bir düğümüyle etkileşim kurarak etkileşim kurması 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ı
DOM, ağaç benzetmesi veya XML tabanlı teknolojilere erişmeye yönelik sorgu tabanlı yaklaşım hakkında daha fazla bilgi sahibiyebilirsiniz. XAML düğüm akışını kavramsallaştırmanın yararlı bir yolu aşağıdaki gibidir. Imagine XAML'nin bir DOM veya olası her düğümün tüm yol genişletilen ve ardından doğrusal olarak sunulan bir ağaç olduğunu gösterir. Düğümler arasında ilerlerken, DOM ile ilgili düzeylerden "in" veya "out" geçişini yapıyor olabilirsiniz, ancak bu düzey kavramları bir düğüm akışıyla ilgili değildir, ancak XAML düğüm akışı açıkça izlanmaz. Düğüm akışının "geçerli" konumu vardır, ancak akışın diğer bölümlerini başvuru olarak kendiniz depolamadıysanız düğüm akışının geçerli düğüm konumu dışında her yönü görünümden çıkar.
XAML düğüm akışı kavramının önemli avantajı, tüm düğüm akışının üzerinden geçiyorsanız XAML gösteriminin tamamını işledikten emin olabilirsiniz; Bir sorgunun, DOM işleminin veya bilgi işlemeye yönelik başka bir satır dışı yaklaşımın tam XAML gösteriminin bir kısmını atlası konusunda endişelenmenize gerek yok. Bu nedenle, XAML düğüm akışı gösterimi hem XAML okuyucularını hem de XAML yazıcılarını bağlamak ve bir XAML işleme işleminin okuma ve yazma aşamaları arasında işlem yapmak için kendi işleminizi ekleyilmenizi sağlayan bir sistem sağlamak için idealdir. Çoğu durumda, XAML düğüm akışında düğümlerin sıraları, XAML okuyucuları tarafından kasıtlı olarak iyileştirilmiş veya yeniden sıralandırılmış ve sıranın kaynak metinde, ikili grafikte veya nesne graflarında nasıl görüne olabileceğiyle karşı karşıyadır. Bu davranış, XAML yazıcıların hiçbir zaman düğüm akışında "geri" dönmeleri gereken bir konumda yer alamayarak XAML işleme mimarisini zorlamaya yöneliktir. İdeal olarak, tüm XAML yazma işlemlerinin şema bağlamına ve düğüm akışının geçerli konumuna göre işlem gerçekleyemleri olmalıdır.
Temel Okuma Düğümü Döngüsü
XAML düğüm akışını incelemeye için temel bir okuma düğümü döngüsü aşağıdaki kavramlardan oluşur. Bu konu başlığında ele alınan düğüm döngülerinin amaçları doğrultusunda, kullanarak metin tabanlı, insan tarafından okunabilir bir XAML dosyası okuduğu kabul XamlXmlReader edin. Bu bölümdeki bağlantılar, tarafından uygulanan belirli XAML düğüm döngüsü API'sine XamlXmlReader başvurur.
XAML düğüm akışının sonunda olmadığınızdan emin olun (değerini kontrol edin IsEof veya Read kullanın). Akışın sonundaysanız geçerli bir düğüm yoktur ve çıkmalısınız.
çağrısıyla XAML düğüm akışının şu anda hangi düğüm türünü açığa çıkar yaptığını kontrol NodeType edin.
Doğrudan bağlı ilişkili bir XAML nesne yazıcısı varsa, genellikle bu WriteNode noktada çağrısında bulundurabilirsiniz.
Geçerli düğüm XamlNodeType veya geçerli kayıt olarak bildirilene bağlı olarak, düğüm içeriği hakkında bilgi almak için aşağıdakilerden birini arayın:
veya NodeType StartMember için, EndMember bir üye hakkında bilgi almak için Member XamlMember çağrısı. Üye bir olabilir XamlDirective ve bu nedenle yukarıdaki nesnenin geleneksel tür tanımlı bir üyesi olmayabilir. Örneğin, bir nesneye uygulanan bir XAML üyesi olarak görünür; burada true, üyesinin ise olur ve bu yönergenin
x:NameIsDirective XAML dili Name XAML ad alanı altında olduğunu gösterenNamediğer özellikler vardır.veya NodeType StartObject için, EndObject nesnesi hakkında bilgi almak için Type XamlType çağrısı.
için NodeType Value çağrısında Value bulundu. Düğüm yalnızca bir üye için değerin en basit ifadesi veya bir nesnenin başlatma metni ise bir değerdir (ancak, bu konunun sonraki bir bölümünde belgelenmiş olan tür dönüştürme davranışını biliyor olması gerekir).
bir NodeType NamespaceDeclaration için, bir ad Namespace alanı düğümü için ad alanı bilgilerini almak için çağrısı.
ReadXAML okuyucuyu XAML düğümü akışında bir sonraki düğüme ilerletin ve 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şini sağlar. XAML düğüm döngüsü için tipik akış denetimi teknikleri, içinde bir gövde tanımlamayı ve düğüm döngüsünde while (reader.Read()) NodeType her düğüm noktasında açmayı içerir.
Düğüm akışı dosyanın sonunda ise geçerli düğüm null olur.
Okuyucu ve yazıcı kullanan en basit döngü aşağıdaki örnekteki gibi olur.
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);
}
Bu temel yük yolu XAML düğüm döngüsü örneği, XAML okuyucu ve XAML yazıcıyı saydam bir şekilde birbirine bağlar ve kullandıklarından farklı bir şey XamlServices.Parse yapmaz. Ancak bu temel yapı daha sonra okuma veya yazma senaryolarına uygulanacak şekilde genişletilir. Bazı olası senaryolar aşağıdaki gibidir:
'i NodeType açma. Okunan düğüm türüne bağlı olarak farklı eylemler gerçekleştirin.
Her durumda WriteNode çağrısı yapma. Yalnızca bazı WriteNode durumlarda NodeType çağrısı.
Belirli bir düğüm türünün mantığı içinde, bu düğümün özellerini analiz edip bu düğümlere göre hareket etme. Örneğin, yalnızca belirli bir XAML ad alanına gelen nesneleri yazabilir ve ardından bu XAML ad alanına yönelik nesneleri bırakabilir veya erteleyebilirsiniz. Öte ya da XAML sisteminizin üye işlemenizin bir parçası olarak desteklemez tüm XAML yönergelerini bırakarak veya başka bir şekilde yeniden işleyesiniz.
Büyük olasılıkla XamlObjectWriter
Write*XAML şema bağlamını atlayan tür eşlemesi gerçekleştirerek yöntemleri geçersiz kılan bir özel tanımlayın.XAML davranışında özelleştirilmiş farkların hem okuyucu hem de yazıcı tarafından kullanılacak şekilde, varsayılan olmayan bir XAML şema bağlamı XamlXmlReader kullanmak için 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 veya özellikle düğümlere doğrudan , tarafından veya diğer tanımlayıcılar aracılığıyla erişen bir XAML x:Name x:Uid okuyucusu olabilir. .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 IXamlIndexingReader ve XamlNodeList bölümlerine bakın.
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 bir uygulamasına XamlWriter iletir.
Tipik yük yolu senaryosunda, bir XAML düğüm akışı üretir; XAML düğümleri mantığınıza ve XAML şema bağlamınıza göre işlenir ve düğümler bir 'e XamlXmlReader XamlObjectWriter geçiriliyor. Ardından, sonuçta elde edilen nesne grafını uygulamanıza veya çerçevenize tümleştirin.
Tipik bir kaydetme yolu senaryosunda nesne grafını okur, tek tek XAML düğümleri işlenir ve serileştirilmiş sonucu XamlObjectReader XamlXmlWriter XAML metin dosyası olarak verir. Burada önemli olan, hem yolların hem de senaryoların aynı anda tam olarak bir XAML düğümüyle çalışmayı ve XAML düğümlerinin XAML türü sistemi ve XAML Hizmetleri API'leri tarafından tanımlanan standart bir şekilde the.NET kullanılabilir durumda yer alan bir durumdur.
Ç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 ve bu şekilde devam eder. Bir çerçeve ve yığın kavramı uygulanarak XAML düğümü akışında kapsamı izlemek genellikle yararlıdır. Bu, özellikle de düğüm akışının içindeyken etkin bir şekilde ayarlanmasında gerçekleşir. Yapı bir DOM perspektifinden düşünilse, düğüm döngü mantığının bir parçası olarak uygulaytığınız çerçeve ve yığın desteği, XAML düğüm yapısına inen kapsamları StartObject sayar (veya ) ve GetObject EndObject kapsamları sayar.
Nesne Düğümlerini Çapraz Geçiş ve Girme
XAML okuyucusu tarafından açıldığında bir düğüm akışında ilk düğüm, kök nesnenin başlangıç nesnesi düğümü olur. Tanım gereği bu nesne her zaman tek bir nesne düğümü olur ve eş düğüme sahip olmaz. Herhangi bir gerçek dünya XAML örneğinde kök nesne, daha fazla nesne bulunduran bir veya daha fazla özele sahip olacak şekilde tanımlanır ve bu özellikler üye düğümlerine sahiptir. Üye düğümler daha sonra bir veya daha fazla nesne düğümüne sahip olur veya bunun yerine bir değer düğümünde de sonlandırılır. Kök nesne genellikle XAML metin işaretlemesinde öznitelik olarak atanan ancak XAML düğüm akışı gösteriminde bir düğüm türüyle eşilen Namescope XAML ad kapsamlarını tanımlar.
Aşağıdaki XAML örneğini göz önünde bulundurarak (bu, .NET'te mevcut türler tarafından desteklanmaz, rastgele bir XAML'tir). Bu nesne modelinde, özelliğinin , ve için atanabilir olduğunu varsayalım, özelliği FavorCollection List<T> Favor Balloon NoiseMaker Favor Balloon.Color Color WPF'nin Color renkleri bilinen renk adları olarak nasıl tanımladığına benzer bir nesne tarafından desteklenebilir ve öznitelik söz dizimi için tür dönüştürücüyü destekler.
| XAML işaretlemesi | Sonuçta elde edilen XAML düğümü akışı |
|---|---|
<Party |
Namespace için düğüm Party |
xmlns="PartyXamlNamespace"> |
StartObject için düğüm Party |
<Party.Favors> |
StartMember için düğüm Party.Favors |
StartObject örtülü düğüm FavorCollection |
|
StartMember düğümünü FavorCollection seçin. |
|
<Balloon |
StartObject için düğüm Balloon |
Color="Red" |
StartMember için düğüm ColorValue öznitelik değer dizesi için düğüm "Red"EndMember Için Color |
HasHelium="True" |
StartMember için düğüm HasHeliumValue öznitelik değeri dizesinin düğümü "True"EndMember bekleniyor HasHelium |
> |
EndObject bekleniyor Balloon |
<NoiseMaker>Loudest</NoiseMaker> |
StartObject için düğüm NoiseMakerStartMember için düğüm _InitializationValue başlatma değeri dizesinin düğümü "Loudest"EndMember için düğüm _InitializationEndObject bekleniyor NoiseMaker |
EndMember örtük FavorCollection öğeler özelliği için düğüm. |
|
EndObject örtük için düğüm FavorCollection |
|
</Party.Favors> |
EndMember bekleniyor Favors |
</Party> |
EndObject bekleniyor Party |
XAML düğüm akışında aşağıdaki davranışa güvenebilirsiniz:
Bir
Namespacedüğüm varsa,StartObjectxaml ad alanını ile bildirdikten hemen önce akışa eklenirxmlns. XAML ve örnek düğüm akışının bulunduğu önceki tabloya bakın.StartObjectVeNamespacedüğümlerinin, metin biçimlendirmesinde bildirim konumlarına göre nasıl konumlandırdığı gibi göründüğünü unutmayın. Bu, ad alanı düğümlerinin düğüm akışında için uygulanan düğümden önce her zaman göründüğü davranış temsilcisidir. Bu tasarımın amacı, ad alanı bilgilerinin nesne yazarları için hayati öneme sahip olması ve nesne yazıcısının tür eşlemesi gerçekleştirmeyi denemesi ya da nesneyi işlemesini denemeden önce bilinmesi gerekir. XAML ad alanı bilgilerini akıştaki uygulama kapsamının önüne koymak, her zaman düğüm akışının sunulma sırasında işlemesini daha kolay hale getirir.Yukarıdaki durumlar nedeniyle,
Namespaceköke göre değil, başlangıçtan itibaren düğümlerden geçiş yaparken çoğu gerçek dünya biçimlendirme durumunda ilk olarak okunan bir veya daha fazla düğümdürStartObject.StartObjectDüğümStartMember,Valueveya hemen arkasından gelebilirEndObject. Hiç bir şekilde başka bir bu değilStartObject.Bir
StartMemberStartObject,, veya hemen arkasından gelebilirValueEndMember.GetObjectDeğerin,StartObjectYeni bir değer örneklenebilecek bir öğesi yerine üst nesnenin var olan bir değerinden gelmesi beklenen Üyeler için tarafından izlenebilir. Ayrıca, yaklaşan bir düğüm tarafından izlenebilirNamespaceStartObject. Hiç bir şekilde başka bir bu değilStartMember.ValueDüğüm, değerin kendisini temsil eder; "EndValue" yoktur. Bu, yalnızca bir ile izlenebilirEndMember.Nesnenin XAML başlatma metni, oluşturma tarafından kullanılabilir, Object-Value yapısına neden olmaz. Bunun yerine, adlı üye için adanmış bir üye düğümü
_Initializationoluşturulur. ve bu üye düğümü başlatma değeri dizesini içerir. Varsa,_Initializationher zaman ilkStartMember._Initialization, bir xaml dili XAML namescope ile bazı XAML Hizmetleri temsillerine uygun olabilir ve bu da,_Initializationyedekleme türlerinde tanımlı bir özellik değildir.Member-Value birleşimi, değerin bir öznitelik ayarını temsil eder. Sonuç olarak bu değeri işlemeye dahil 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şleene kadar değerlendirilmez. XAML nesne yazarı, gerekli XAML şeması bağlamı, tür sistemi eşlemesi ve değer dönüştürmeleri için gereken diğer desteğe sahiptir.
EndMemberDüğümStartMember, sonraki bir üye için düğüm veyaEndObjectüye sahibi için bir düğüm tarafından izlenebilir.EndObjectDüğüm, bir düğüm tarafından izlenebilirEndMember. Ayrıca,StartObjectnesnelerin bir koleksiyonun öğelerinde eşleri olduğu durumlar için bir düğüm tarafından izlenebilir. Ya da gelecekteki bir düğüm tarafından izlenebilirNamespaceStartObject.- Tüm düğüm akışını kapatmakla ilgili benzersiz bir durum olması için,
EndObjectköke ait hiçbir şey uygulanmaz; okuyucu şimdi dosya sonu ve Read döndürürfalse.
- Tüm düğüm akışını kapatmakla ilgili benzersiz bir durum olması için,
Değer dönüştürücüler ve XAML düğüm akışı
Değer Dönüştürücüsü, bir işaretleme uzantısı için genel bir terimdir, bir tür Dönüştürücüsü (değer serileştiriciler dahil) veya XAML tür sistemi aracılığıyla bir değer Dönüştürücüsü olarak bildirilen başka bir ayrılmış sınıf. XAML düğüm akışında, tür dönüştürücüsü kullanımı ve biçimlendirme uzantısı kullanımı çok farklı temsiller de vardır.
XAML düğüm akışında tür dönüştürücüler
Sonunda bir tür dönüştürücüsü kullanımıyla sonuçlanan bir öznitelik kümesi, XAML düğüm akışında bir üyenin değeri olarak raporlanır. XAML düğüm akışı, bir tür dönüştürücü örnek nesnesi üretmeyi ve değeri geçirmeye çalışmaz. Tür dönüştürücünün dönüştürme uygulamasının kullanılması için XAML şema bağlamını çağırma ve tür eşleme için kullanılması gerekir. Değeri işlemek için hangi tür dönüştürücü sınıfının kullanılması gerektiğini belirlemek bile, XAML şeması bağlamını dolaylı olarak gerektirir. Varsayılan XAML şema bağlamını kullandığınızda, bu bilgiler XAML tür sisteminde kullanılabilir. XAML yazıcı ile bağlantı öncesinde XAML düğüm akışı düzeyinde tür dönüştürücüsü sınıf bilgilerine ihtiyacınız varsa, bu dosyayı XamlMember ayarlanan üyenin bilgileriyle elde edebilirsiniz. Ancak, tür dönüştürücüsü girişi, xaml düğüm akışında tür eşleme sistemi ve XAML şeması bağlamı gerektiren işlemlerin geri kalanı yerine düz bir değer olarak korunmalıdır. Örneğin, bir XAML nesne yazarı tarafından nesne oluşturma.
Örneğ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ğıdakiler olarak ifade edilebilir:
StartObjectXamlTypetemsil edenGameBoard
StartMemberXamlMembertemsil edenBoardSize
Valuedüğüm, "" metin dizesiyle 8x8
EndMember Eşleştir BoardSize
EndObject Eşleştir GameBoard
Bu düğüm akışında tür dönüştürücüsü örneği olmadığına dikkat edin. Ancak XamlMember.TypeConverter , için ' de çağırarak tür dönüştürücüsü bilgilerini alabilirsiniz XamlMember BoardSize . Geçerli bir XAML şeması bağlamına sahipseniz, öğesinden bir örnek elde ederek dönüştürücü yöntemlerini de çağırabilirsiniz ConverterInstance .
XAML düğüm akışındaki biçimlendirme uzantıları
Biçimlendirme uzantısı kullanımı, XAML düğüm akışında, nesnenin bir biçimlendirme uzantısı örneğini temsil ettiği bir üye içindeki nesne düğümü olarak raporlanır. Bu nedenle, bir biçimlendirme uzantısı kullanımı, düğüm akışı gösteriminde tür dönüştürücüsü kullanımının daha açık bir şekilde sunulur ve daha fazla bilgi taşır. XamlMember Kullanım durumsal olduğundan ve olası her biçimlendirme durumunda değişiklik yaptığından, bilgi biçimlendirme uzantısıyla ilgili hiçbir şey söylemedi; tür dönüştürücülerinde olduğu gibi tür veya üye başına adanmış ve örtük değildir.
Biçimlendirme uzantılarının nesne düğümleri olarak düğüm akışı temsili, XAML metin biçimlendirmesinde (genellikle büyük/küçük harf) biçimlendirme uzantısı kullanımı öznitelik biçiminde yapılmış olsa bile durumdur. Açık nesne öğesi formu kullanan biçimlendirme uzantısı kullanımları aynı şekilde işlenir.
Biçimlendirme uzantısı nesne düğümü içinde, bu biçimlendirme uzantısının üyeleri olabilir. XAML düğüm akışı temsili, bu biçimlendirme uzantısının kullanımını, Konumsal parametre kullanımı veya açık adlandırılmış parametrelerle kullanım gibi korur.
Konumsal parametre kullanımı için XAML düğüm akışı, kullanımı kaydeden bir XAML dil tanımlı özelliği içerir _PositionalParameters . Bu özellik List<T> Object kısıtlamasıyla geneldir. Çalıp a Konumsal parametre kullanımı, içinde iç içe biçimlendirme uzantısı kullanımları içerebildiğinden kısıtlama Object ve String değildir. Kullanımdan konumsal parametrelere erişmek için, listede yineleyebilir ve tek liste değerleri için Dizin oluşturuculardan yararlanabilirsiniz.
Adlandırılmış bir parametre kullanımı için, her adlandırılmış parametre, düğüm akışındaki bu adın üye düğümü olarak temsil edilir. İç içe geçmiş biçimlendirme uzantısı kullanımı olabileceğinden üye değerleri dize değildir.
ProvideValue biçimlendirme uzantısından henüz çağrılmamıştır. Ancak, bir XAML okuyucuyu ve XAML yazıcısını WriteEndObject , düğüm akışında inceleyebileceğiniz biçimlendirme uzantısı düğümünde çağrılacak şekilde bağladığınızda çağrılır. Bu nedenle, genellikle yükleme yolundaki nesne grafiğini biçimlendirmek için kullanılan aynı XAML şeması bağlamına ihtiyacınız vardır. Aksi takdirde, ProvideValue herhangi bir biçimlendirme uzantısı beklenen hizmetleri kullanılabilir olmadığından burada özel durumlar oluşturabilir.
Xaml düğüm akışındaki XAML ve XML Language-Defined üyeleri
Belirli Üyeler, açıkça bir arama veya yapım yerine bir XAML okuyucusunun yorumlamalar ve kuralları nedeniyle XAML düğüm akışına tanıtılmıştır XamlMember . Genellikle, bu Üyeler XAML yönergelerinden kaynaklanır. Bazı durumlarda, XAML düğüm akışına yönergesini tanıtan XAML okuma işlemidir. Diğer bir deyişle, özgün giriş XAML metni üye yönergesini açıkça belirtmedi, ancak XAML okuyucu, bir yapısal XAML kuralını ve bu bilgiler kaybedilmeden önce XAML düğüm akışındaki rapor bilgilerini karşılamak için yönergesini ekler.
Aşağıdaki listede, bir XAML okuyucusunun bir Directive XAML üye düğümü ve bu üye düğümünün .NET XAML Hizmetleri uygulamalarında nasıl tanımlandığı gösterilmektedir.
Nesne düğümü Için başlatma metni: Bu üye düğümün adı,
_Initializationxaml yönergesini temsil eder ve xaml Language xaml ad alanında tanımlanır. Bunun için bir statik varlık edinebilirsiniz Initialization .Biçimlendirme Uzantısı Için Konumsal Parametreler: Bu üye düğümün adı
_PositionalParameters, XAML Language xaml ad alanında tanımlanmıştır. Her birinin genel bir nesne listesini içerir, her biri,,GIRIŞ xaml 'de sağlanan sınırlayıcı karakter üzerinde bölünerek önceden ayrılmış konumsal bir parametre olur. Konumundan konumsal Parameters yönergesi için statik bir varlık edinebilirsiniz PositionalParameters .Bilinmeyen içerik: Bu üye düğümün adı
_UnknownContent. Kesinlikle konuşuyor XamlDirective ve xaml Language xaml ad alanında tanımlanmış. 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ği belirlenebileceği durumlar için Sentinel olarak kullanılır. Adlı üyeleri denetleyerek bu durumu bir XAML düğüm akışında tespit edebilirsiniz_UnknownContent. Bir yükleme yolu XAML düğüm akışında başka bir işlem alınıyorsa, varsayılan olarak herhangi bir XamlObjectWriterWriteEndObjectnesne üzerinde üyeyle karşılaştığında denendiğinde denenir_UnknownContent. Varsayılan değer XamlXmlWriter throw yapmaz ve üyeyi örtülü olarak değerlendirir. Kaynağından için bir statik varlık edinebilirsiniz_UnknownContentUnknownContent .Bir koleksiyonun koleksiyon özelliği: XAML için kullanılan bir koleksiyon sınıfının backing CLR türü genellikle koleksiyon öğelerini tutan ayrılmış bir adlandırılmış özellik içerir, ancak bu özellik, tür çözümlemesi destek olmadan önce bir XAML tür sistemi tarafından bilinmemektedir. Bunun yerine XAML düğümü akışı, XAML koleksiyonunun
Itemsüyesi olarak bir yer tutucu sunar. .NET XAML Services uygulamasında, düğüm akışında bu yönergenin veya üyenin adı_Itemsolur. Bu yönerge için bir sabit, 'den elde Items edilir.Bir XAML düğümü akışının, geri dönüş türü çözünürlüğüne ve XAML şema bağlamına bağlı olarak ayrıştırılamaz olduğu ortaya çıkaran öğeler içeren bir Items özelliği içere olabileceğini unutmayın. Örneğin,
XML tanımlı üyeler: XML tanımlı ve üyeleri, .NET XAML Hizmetleri uygulamaları içinde
xml:base, ve adlıxml:langxml:spacebaselangspaceXAML yönergeleri olarak rapor edilir. Bunların ad alanı XML adhttp://www.w3.org/XML/1998/namespacealanıdır. Bunların her biri için sabitler'den elde XamlLanguage edilir.
Düğüm Sırası
Bazı durumlarda, XAML düğümü akışında XAML düğümlerinin sırası değişir ve işaretlemede görüntüleniyorsa veya XML olarak işlense düğümlerin görünme XamlXmlReader sırasına göre değişir. Bu, düğüm akışını yalnızca ileriye doğru işleyecek XamlObjectWriter şekilde düğümleri sıralamak için yapılır. .NET XAML Hizmetlerde XAML okuyucu, düğüm akışının XAML nesne yazıcısı tüketicileri için performans iyileştirmesi olarak bu görevi XAML yazıcıya bırakmak yerine düğümleri yeniden sıralar.
Belirli yönergeler, bir nesne öğesinden nesne oluşturmak için daha fazla bilgi sağlamak üzere özel olarak tasarlanmıştır. Bu yönergeler: Initialization , PositionalParameters , , , TypeArguments FactoryMethod Arguments . .NET XAML Hizmetleri XAML okuyucuları, sonraki bölümde açıklanan nedenlerden dolayı bu yönergeleri bir nesnenin ' inden sonra düğüm akışında ilk üyeler olarak StartObject yer almaktadır.
XamlObjectWriter Davranışı ve Düğüm Sırası
StartObject için, XamlObjectWriter nesne örneğini hemen oluşturmak için XAML nesne yazıcıya bir sinyal olması şart değildir. XAML, bir nesneyi ek girişle başlatmayı ve ilk nesneyi üretmek için parametresiz bir oluşturucu çağırarak tamamen güvenmeyi ve yalnızca ardından özellikleri ayarlamayı mümkün hale gelen çeşitli dil özellikleri içerir. Bu özellikler şunlardır: XamlDeferLoadAttribute ; başlatma metni; x:TypeArguments; biçimlendirme uzantısının konumsal parametreleri; fabrika yöntemleri ve ilişkili x:Arguments düğümleri (XAML 2009). Bu örneklerin her biri gerçek nesne oluşturmasını geciktirmektedir ve düğüm akışı yeniden sıralansa, XAML nesne yazıcısı, özellikle bu nesne türü için bir oluşturma yönergesi olan bir başlangıç üyesiyle karşılaşıldıklarında örneği oluşturma davranışına güvenebilirsiniz.
GetObject
GetObject , XAML nesne yazıcısı yeni bir nesne oluşturmak yerine nesnenin içeren özelliğinin değerini alsa bir XAML düğümünü temsil eder. XAML düğüm akışında bir düğümle karşılaşan tipik bir durum, içeren özellik, backing türünün nesne modelinde kasıtlı olarak salt okunur olduğunda bir koleksiyon nesnesi veya sözlük nesnesi GetObject için kullanılır. 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ş olur).