XAML için işaretleme uzantılarına genel bakış

İşaretleme uzantıları, ilkel veya belirli bir XAML türü olmayan bir değer elde etmek için kullanılan bir XAML tekniğidir. Öznitelik kullanımı için, işaretleme uzantıları, işaretleme uzantısı kapsamına girmek için bilinen açılış küme ayracı karakter dizisini { ve bu kapsamdan çıkmak için kapanış küme ayracı } kullanır. .NET XAML Hizmetleri'ni kullanırken System.Xaml derlemesinden önceden tanımlanmış XAML dil işaretleme uzantılarından bazılarını kullanabilirsiniz. Ayrıca, System.Xaml içinde tanımlanan sınıfından MarkupExtension alt sınıf oluşturabilir ve kendi işaretleme uzantılarınızı tanımlayabilirsiniz. Ya da zaten bu çerçeveye başvuruyorsanız belirli bir çerçeve tarafından tanımlanan işaretleme uzantılarını kullanabilirsiniz.

Bir işaretleme uzantısı kullanımına erişildiğinde, XAML nesne yazıcısı, hizmet bağlantı noktası aracılığıyla MarkupExtension yönteminde özel MarkupExtension.ProvideValue sınıfına hizmet sağlayabilir. Hizmetler, kullanım hakkında bağlamı, nesne yazıcısının belirli özelliklerini, XAML şema bağlamını vb. elde etmek için kullanılabilir.

XAML tanımlı işaretleme uzantıları

XAML dil desteği için .NET XAML Hizmetleri tarafından çeşitli işaretleme uzantıları uygulanır. Bu işaretleme uzantıları, dil olarak XAML belirtiminin bölümlerine karşılık gelir. Bunlar, genellikle yaygın kullanıma bakıldığında, söz dizimindeki x: ön eki ile tanınabilir. Bu XAML dil öğeleri için .NET XAML Hizmetleri uygulamalarının tümü temel sınıftan MarkupExtension türetilir.

Uyarı

XAML dilindeki x: ön eki, bir XAML öğesinin kök kısmında, XAML dil uzayının tipik XAML ad uzayı eşlemesi için kullanılan ögedir. Örneğin, çeşitli çerçeveler için Visual Studio projesi ve sayfa şablonları bu x: eşlemeyi kullanarak bir XAML dosyası başlatır. Kendi XAML ad alanı eşlemenizde farklı bir ön ek belirteci seçebilirsiniz, ancak bu belgelerde, belirli bir çerçevenin varsayılan x: XAML ad alanı veya diğer rastgele CLR veya XML ad alanlarının aksine, XAML dili XAML ad alanının tanımlı bir parçası olan varlıkları tanımlamanın bir aracı olarak varsayılan eşleme varsayılır.

x:Tür

x:Type, adı belirtilen tür için Type nesnesini sağlar. Bu işlevsellik en sık, temel CLR türü ve tür türetmesini gruplandırma adı veya tanımlayıcı olarak kullanan erteleme mekanizmalarında kullanılır. WPF stilleri ve şablonları ve bunların özellik kullanımı TargetType belirli bir örnektir. Daha fazla bilgi için bkz. x:Type biçimlendirme uzantısı.

x:Static

x:Static , bir özelliğin değerinin doğrudan türü olmayan ancak bu türe değerlendirilebilen değer türü kod varlıklarından statik değerler üretir. Bu, bir tür tanımında zaten iyi bilinen sabitler olarak mevcut olan değerleri belirtmek için yararlıdır. Daha fazla bilgi için bkz. x:Static Markup Extension.

x:Null

x:Null, bir XAML üyesi için null değerini belirtir. Belirli türlerin tasarımına veya daha büyük çerçeve kavramlarına bağlı olarak, null her zaman bir özellik için varsayılan değer veya boş dize özniteliğinin zımni değeri değildir. Daha fazla bilgi için bkz. x:Null biçimlendirme uzantısı.

x:Dizi

x:Array temel öğeler ve denetim modelleri tarafından sağlanan koleksiyon desteğinin kasıtlı olarak kullanılmadığı durumlarda XAML söz diziminde genel dizilerin oluşturulmasını destekler. Daha fazla bilgi için bkz. x:Dizi İşaretleme Uzantısı. Özellikle XAML 2009'da dizilere uzantı yerine dil temelleri olarak erişilir. Daha fazla bilgi için bkz . XAML 2009 Dil Özellikleri.

x:Başvuru

x:Reference , özgün (2006) dil kümesinin uzantısı olan XAML 2009'un bir parçasıdır. x:Reference , nesne grafında var olan başka bir nesneye başvurudur. Bu nesne x:Name ile tanımlanır. Daha fazla bilgi için bkz. x:Başvuru biçimlendirme uzantısı.

Diğer x: Yapılar

XAML dil özelliklerini destekleyen başka x: yapılar da vardır, ancak bunlar işaretleme uzantıları olarak uygulanmaz. Daha fazla bilgi için bkz. XAML Ad Alanı (x:) Dil Özellikleri.

MarkupExtension Temel Sınıfı

System.Xaml'de XAML okuyucularının ve XAML yazıcılarının varsayılan uygulamalarıyla etkileşim kurabilen özel bir işaretleme uzantısı tanımlamak için soyut MarkupExtension sınıftan bir sınıf türetebilirsiniz. Bu sınıfın geçersiz kılmak için tek bir yöntemi vardır: ProvideValue. Ayrıca işaretleme uzantısı kullanımına yönelik bağımsız değişkenleri ve eşleşen ayarlanabilir özellikleri desteklemek için ek oluşturucular tanımlamanız gerekebilir.

ProvideValue aracılığıyla, özel bir işaretleme uzantısı, bir XAML işlemcisi tarafından çağrıldığı ortamı bildiren hizmet bağlamına erişim sağlar. Yükleme yolunda bu genellikle bir XamlObjectWriterşeklindedir. Kaydetme yolunda bu genellikle bir XamlXmlWriterşeklindedir. Her bir hizmet bağlamını bir hizmet sağlayıcısı deseni uygulayan bir iç XAML hizmet sağlayıcısı bağlam sınıfı olarak rapor eder. Kullanılabilir hizmetler ve bunların neyi temsil ettikleri hakkında daha fazla bilgi için bkz. XAML için Tür Dönüştürücüleri ve İşaretlem Uzantıları.

İşaretlemeyi genişletme sınıfınız genel erişim düzeyi kullanmalıdır; XAML işlemcilerinin hizmetlerini kullanabilmesi için her zaman işaretleme uzantısının destek sınıfının örneğini oluşturabilmesi gerekir.

Özel İşaretlemeyi Genişletme için Destek Türünü Tanımlama

.NET XAML Hizmetleri'ni veya .NET XAML Hizmetleri'ni temel alan çerçeveler kullandığınızda, işaretleme uzantısı destek türünü adlandırmak için iki seçeneğiniz vardır. Tür adı, XAML nesne yazıcılarının XAML'de bir işaretleme uzantısı kullanımıyla karşılaştıklarında bir işaretleme uzantısı destek türüne erişmeye ve çağırmaya çalışmalarıyla ilgilidir. Aşağıdaki adlandırma stratejilerinden birini kullanın:

  • Tür adını XAML işaretleme kullanım belirteciyle tam olarak eşleşecek şekilde adlandırın. Örneğin, uzantı {Collate ...} kullanımını desteklemek için destek türünü Collateolarak adlandırın.
  • Tür adını kullanım dizesi belirteci artı son ek Extension olarak adlandırın. Örneğin, uzantı {Collate ...} kullanımını desteklemek için destek türünü CollateExtensionolarak adlandırın.

Arama sırası, önce Extension soneki olan sınıf adını aramak, ardından Extension sonek olmadan sınıf adını aramaktır.

İşaretleme kullanımı açısından, Extension sonekinin kullanımın bir parçası olarak dahil edilmesi geçerlidir. Ancak bu, sınıf adının gerçekten bir parçası gibi Extension davranır ve destek sınıfının son eki yoksa XAML nesne yazıcıları bu kullanım için bir işaretleme uzantısı destek sınıfını Extension çözümleyemedi.

Parametresiz oluşturucu

Tüm işaretleme uzantısı destek türleri için genel parametresiz oluşturucuyu kullanıma sunmanız gerekir. Bir XAML nesne yazıcısının bir nesne öğesi kullanımından işaretleme uzantısını örneklediği her durumda parametresiz oluşturucu gereklidir. Nesne öğesi kullanımını desteklemek, özellikle serileştirme için bir işaretleme uzantısı için adil bir beklentidir. Ancak, yalnızca işaretleme uzantısının öznitelik kullanımlarını desteklemek istiyorsanız, ortak oluşturucu olmadan bir işaretleme uzantısı uygulayabilirsiniz.

İşaretleme uzantısı kullanımınızda argüman yoksa, kullanımı desteklemek için parametresiz bir yapılandırıcı gereklidir.

Özel İşaretlemeleri Uzantısı için Yapıcı Desenler ve Konumsal Argümanlar

Hedeflenen bağımsız değişken kullanımına sahip bir işaretleme uzantısı için, ortak oluşturucuların hedeflenen kullanımın şekillerine uygun olması gerekir. Başka bir deyişle, işaretleme uzantınız geçerli bir kullanım olarak tek bir konumsal bağımsız değişken gerektirecek şekilde tasarlanmışsa, konumsal bağımsız değişkeni alan bir giriş parametresine sahip bir ortak oluşturucuyu desteklemeniz gerekir.

Örneğin, Collate işaretleme uzantısının, yalnızca bir modunu belirtmek amacıyla tasarlandığını ve bu modun, bir numaralandırma sabiti olarak belirlenmiş tek bir konumsal bağımsız değişken içerdiğini varsayalım. Bu durumda, aşağıdaki forma sahip bir oluşturucu olmalıdır:

public Collate(CollationMode collationMode) {...}

Temel düzeyde, bir işaretleme uzantısına geçirilen bağımsız değişkenler işaretlemenin öznitelik değerlerinden iletildikleri için bir metin dizesidir. Tüm argümanlarınızı dizelere dönüştürebilir ve bu düzeydeki girdilerle çalışabilirsiniz. Ancak, bağımsız değişkenleri işaretleme uzantısı destek sınıfına geçirilmeden önce gerçekleşen belirli işlemelere erişiminiz vardır.

İşleme kavramsal olarak, işaretleme uzantısı oluşturulacak bir nesne gibi çalışır ve ardından üye değerleri ayarlanır. Ayarlanacak belirtilen her özellik, XAML ayrıştırıldığında belirtilen bir üyenin oluşturulan nesnede nasıl ayarlanabileceğine benzer şekilde değerlendirilir. İki önemli fark vardır:

  • Daha önce belirtildiği gibi, bir işaretleme uzantısı destek türünün XAML'de oluşturulabilmesi için parametresiz bir oluşturucuya sahip olması gerekmez. Nesne yapısı, metin söz dizimindeki olası bağımsız değişkenleri belirteci haline getirilene ve konumsal veya adlandırılmış bağımsız değişkenler olarak değerlendirilene kadar ertelenmiş olur ve o sırada uygun oluşturucu çağrılır.
  • İşaretleme uzantılarının kullanımları iç içe yerleştirilebilir. En içteki işaretleme uzantısı önce değerlendirilir. Bu nedenle, böyle bir kullanımı varsayabilir ve oluşturma parametrelerinden birini üretmek için bir değer dönüştürücüsü (örneğin, bir işaretleme uzantısı) gerektiren bir tür olarak bildirebilirsiniz.

Önceki örnekte bu tür işlemeye bağlılık gösterilmiştir. .NET XAML Hizmetleri XAML nesne yazıcısı, numaralandırma sabit adlarını yerel düzeyde numaralandırılmış değerler halinde işler.

Biçimlendirme uzantısı konumsal parametresinin metin söz dizimini işlemek, yapı bağımsız değişkenindeki türle ilişkili bir tür dönüştürücüsü de kullanabilir.

Kullanımdaki belirteçlerin karşılaşıldığı sıra, atandıkları oluşturucu parametresinin konum sırasına karşılık geldiği için bağımsız değişkenler konumsal bağımsız değişkenler olarak adlandırılır. Örneğin, aşağıdaki oluşturucu imzasını göz önünde bulundurun:

public Collate(CollationMode collationMode, object collateThis) {...}

XAML işlemcisi bu işaretleme uzantısı için iki konumsal bağımsız değişken bekler. bir kullanım {Collate AlphaUp,{x:Reference circularFile}}varsa, AlphaUp belirteç ilk parametreye gönderilir ve sabit adlı bir CollationMode numaralandırma olarak değerlendirilir. İçin x:Reference sonucu ikinci parametreye gönderilir ve nesne olarak değerlendirilir.

XAML kurallarında belirtilen işaretleme genişletme söz dizimi ve işlemede, virgül bağımsız değişkenler arasındaki sınırlayıcıdır; ister konumsal ister adlandırılmış bağımsız değişkenler olsun, bu bağımsız değişkenler arasındaki ayırıcı görevi görür.

Konumsal bağımsız değişkenlerin yinelenen parametre sayısı

Bir XAML nesne yazıcısı konumsal bağımsız değişkenlerle bir işaretleme uzantısı kullanımıyla karşılaşırsa ve bu sayıda bağımsız değişkeni (yinelenen arity) alan birden çok oluşturucu bağımsız değişkeni varsa, bu mutlaka bir hata değildir. Davranış, özelleştirilebilir bir XAML şeması bağlam ayarına bağlı olarak değişir SupportMarkupExtensionsWithDuplicateArity. Eğer SupportMarkupExtensionsWithDuplicateAritytrue ise, bir XAML nesne yazıcısı yalnızca tekrar eden arite nedeniyle bir istisna oluşturmamalıdır. Bu noktanın ötesindeki davranış kesin olarak tanımlanmamıştır. Temel tasarım varsayımı, şema bağlamının belirli parametreler için tür bilgisine sahip olduğu ve hangi imzanın en iyi eşleşme olabileceğini görmek için tekrarlayan adaylarla uyumlu açık dönüşümleri denemesine olanak tanımasıdır. XAML nesne yazıcısı üzerinde çalışan belirli bir şema bağlamı tarafından uygulanan testleri önceden tanımlanmış hiçbir imza geçemezse, bir özel durum yine de oluşabilir.

Varsayılan olarak, SupportMarkupExtensionsWithDuplicateArity CLR tabanlı false içinde .NET XAML Hizmetleri için XamlSchemaContext'dir. Bu nedenle, destekleyici türün oluşturucularında yinelenen arity olan bir işaretleme uzantısı kullanımıyla karşılaşırsa varsayılan XamlObjectWriter istisnalar fırlatır.

Özel işaretleme uzantısı için adlandırılmış argümanlar

XAML tarafından belirtilen işaretleme uzantıları, kullanım için adlandırılmış bağımsız değişkenler formu da kullanabilir. Belirteç oluşturmanın ilk düzeyinde, metin söz dizimi bağımsız değişkenlere ayrılır. Herhangi bir bağımsız değişken içinde eşittir işareti (=) varlığı, bağımsız değişkeni adlandırılmış bağımsız değişken olarak tanımlar. Böyle bir bağımsız değişken de bir isim/değer çifti olarak tokenize edilir. Bu örnekteki ad, işaretleme uzantısının destek türünün genel ayarlanabilir özelliğini adlandırmaktadır. Adlandırılmış bağımsız değişken kullanımını desteklemeyi planlıyorsanız, bu genel ayarlanabilir özellikleri sağlamanız gerekir. Özellikler, herkese açık oldukları sürece devralınabilir.

"Biçimlendirme Uzantısı Uygulamasından Hizmet Sağlayıcısı Bağlamına Erişimi"

Kullanılabilir hizmetler tüm değer dönüştürücüleri için aynıdır. Fark, her değer dönüştürücüsunun hizmet bağlamını nasıl aldığıdır. Hizmetlere ve kullanılabilir hizmetlere erişim , XAML için Tür Dönüştürücüleri ve İşaretlemeyi Genişletmeler konusunda belgelenmiştir.

biçimlendirme uzantısının özellik öğesi kullanımı

İşaretleme uzantısı kullanım senaryoları, genellikle öznitelik kullanımı etrafında tasarlanır. Ancak, özellik öğesi kullanımını desteklemek için yedekleme sınıfını tanımlamak da mümkündür.

İşaretleme uzantınızın özellik öğesi kullanımını desteklemesi için genel bir parametresiz oluşturucu tanımlayın. Bu, statik bir oluşturucu değil örnek oluşturucu olmalıdır. Bu gereklidir çünkü bir XAML işlemcisi genellikle işaretlemeden işlediği herhangi bir nesne öğesinde parametresiz oluşturucuyu çağırmalıdır ve bu, işaretleme uzantısı sınıflarını nesne öğeleri olarak içerir. Gelişmiş senaryolar için sınıflar için varsayılan olmayan yapı yolları tanımlayabilirsiniz. (Daha fazla bilgi için bkz . x:FactoryMethod Yönergesi.) Ancak, hem tasarımcılar hem de ham işaretleme kullanıcıları için kullanım desenini bulmayı çok daha zor hale getirdiğinden, bu desenleri işaretleme uzantısı amacıyla kullanmamalısınız.

Özel işaretleme uzantısı için özellik atama

Hem tasarım ortamlarını hem de belirli XAML nesne yazıcı senaryolarını desteklemek için, bir işaretleme uzantısı destek türünü birkaç CLR özniteliğiyle ilişkilendirmelisiniz. Bu öznitelikler hedeflenen işaretleme uzantısı kullanımını bildirir.

MarkupExtensionReturnTypeAttribute , döndüren Type nesne türüne ilişkin ProvideValue bilgileri raporlar. Saf imzası ile ProvideValue kümesi Object'i döndürür. Ancak çeşitli tüketiciler daha kesin dönüş türü bilgileri isteyebilir. Buna aşağıdakiler dahildir:

  • İşaretleme uzantılarının kullanımına tür farkındalıklı destek sağlayabilecek tasarımcılar ve IDE'ler.
  • Hedef sınıflardaki SetMarkupExtension işleyicilerinin gelişmiş uygulamaları, bilinen belirli MarkupExtension uygulamalara ada göre dallanmak yerine, bir işaretleme uzantısının dönüş türünü belirlemek için yansımaya dayanabilir.

İşaretleme uzantısı kullanımlarının seri hale getirilmesi

tr-TR: Bir XAML nesne yazıcısı bir işaretleme uzantısı kullanımını işlediğinde ve ProvideValue çağırdığında, daha önce bir işaretleme uzantısı kullanımına ilişkin bağlam XAML düğüm akışında kalır, ancak nesne grafiğinde kalmaz. Nesne grafiğinde yalnızca değer korunur. Özgün işaretleme uzantısı kullanımını serileştirilmiş çıktıda kalıcı hale getirmeniz için tasarım senaryolarınız veya başka nedenleriniz varsa, XAML düğüm akışından işaretleme uzantısı kullanımlarını izlemek için kendi altyapınızı tasarlamanız gerekir. Düğüm akışının öğelerini yük yolundan yeniden oluşturmak ve düğüm akışının uygun konumundaki değeri değiştirerek kaydetme yolunda seri hale getirmek üzere XAML yazıcılarına geri oynatmak için davranış uygulayabilirsiniz.

XAML düğüm akışındaki işaretleme uzantıları

Yük yolunda bir XAML düğüm akışıyla çalışıyorsanız, düğüm akışında nesne olarak bir işaretleme uzantısı kullanımı görünür.

İşaretleme uzantısı kullanımı pozisyonel argümanlar kullanıyorsa, başlatma değeri olan bir başlangıç nesnesi olarak temsil edilir. Kaba metin gösterimi olarak düğüm akışı aşağıdakine benzer:

StartObject (XamlType biçimlendirme uzantısının tanım türüdür, dönüş türü değildir)

StartMember (XamlMember adı _InitializationText'dir)

Value (değer, araya giren sınırlayıcılar da dahil olmak üzere bir dize olarak konumsal bağımsız değişkenlerdir)

EndMember

EndObject

Adlandırılmış bağımsız değişkenler içeren bir işaretleme uzantısı kullanımı, her biri metin dizesi değerleriyle ayarlanmış, ilgili adların üyelerine sahip bir nesne olarak temsil edilir.

Aslında bir işaretleme uzantısının ProvideValue uygulamasını çağırmak için XAML şema bağlamı gerekir çünkü bu, tür eşlemesi ve bir işaretleme uzantısı destek türü örneği oluşturmayı gerektirir. Bu, işaretleme uzantısı kullanımlarının varsayılan .NET XAML Hizmetleri düğüm akışlarında bu şekilde korunmasının bir nedenidir. Bir yük yolunun okuyucu bölümünde genellikle gerekli XAML şema bağlamı yoktur.

Kaydetme yolunda bir XAML düğüm akışıyla çalışıyorsanız, genellikle bir nesne grafiği temsilinde serileştirilecek nesnenin başlangıçta bir işaretleme uzantısı kullanımıyla ve bir ProvideValue sonucu ile sağlandığını bildiren hiçbir şey yoktur. Nesne grafiğindeki diğer değişiklikleri yakalarken yuvarlama için işaretleme uzantısı kullanımlarını kalıcı hale getirmek için gereken senaryolar, özgün XAML girişinden bir işaretleme uzantısı kullanımı bilgisini korumak için kendi tekniklerini tasarlamalıdır. Örneğin, işaretleme uzantısı kullanımlarını geri yüklemek için, işaretleme uzantısı kullanımlarını geri yüklemek veya özgün XAML ile yuvarlatılmış XAML arasında bir tür birleştirme gerçekleştirmek için kaydetme yolunda düğüm akışıyla çalışmanız gerekebilir. WPF gibi bazı XAML uygulayan çerçeveler, işaretleme uzantısı kullanımlarının değerleri sağladığı durumları temsil etmeye yardımcı olmak için ara türler (ifadeler) kullanır.

Ayrıca bakınız