Biçimlendirme Uzantıları ve WPF XAML

Bu konu, söz dizimi kuralları, amacı ve bunların temelini oluşturan sınıf nesnesi modeli de dahil olmak üzere XAML için işaretleme uzantıları kavramını tanıtır. İşaretle uzantıları, XAML dilinin ve XAML hizmetlerinin .NET uygulamasının genel bir özelliğidir. Bu konu başlığında WPF XAML'de kullanılmak üzere işaretleme uzantıları özellikle ayrıntılı olarak açıklanmaktadır.

XAML İşlemcileri ve İşaretlemeyi Genişletmeler

Genel olarak bakıldığında, bir XAML ayrıştırıcısı bir öznitelik değerini bir temel öğeye dönüştürülebilecek değişmez değer dizesi olarak yorumlayabilir veya bir şekilde bir nesneye dönüştürebilir. Bu tür araçlardan biri, bir tür dönüştürücüye başvurmaktır; Bu, TypeConverters ve XAML konusunda belgelenmiştir. Ancak, farklı davranışların gerekli olduğu senaryolar vardır. Örneğin, bir XAML işlemcisine öznitelik değerinin nesne grafında yeni bir nesneye neden olmaması gerektiği belirtilebilir. Bunun yerine özniteliği, grafiğin başka bir bölümünde önceden oluşturulmuş bir nesneye veya statik bir nesneye başvuruda bulunan bir nesne grafı ile sonuçlanmalıdır. Başka bir senaryo, bir XAML işlemcisine bir nesnenin oluşturucusunda varsayılan olmayan bağımsız değişkenler sağlayan bir söz dizimi kullanma talimatının verileceğidir. Bunlar, bir işaretleme uzantısının çözümü sağlayabildiği senaryo türleridir.

Temel İşaretlemeyi Uzantısı Söz Dizimi

Bir öznitelik kullanımındaki özelliklere, özellik öğesi kullanımındaki özelliklere veya her ikisine de değer sağlamak için bir işaretleme uzantısı uygulanabilir.

Bir öznitelik değeri sağlamak için kullanıldığında, işaretleme uzantısı dizisini XAML işlemcisine ayıran söz dizimi, açma ve kapatma küme ayraçlarının ({ ve }) varlığıdır. İşaretleme uzantısının türü, açılan küme ayracından hemen sonra dize belirteci tarafından tanımlanır.

Özellik öğesi söz diziminde kullanıldığında, işaretleme uzantısı, özellik öğesi değeri sağlamak için kullanılan diğer öğelerle görsel olarak aynıdır: işaretleme uzantısı sınıfına bir öğe olarak başvuran, açılı ayraçlar (<> ) içine alınmış bir XAML öğesi bildirimi.

XAML Tanımlı biçimlendirme uzantıları

XAML'nin WPF uygulamasına özgü olmayan, ancak bunun yerine dil olarak XAML'nin iç veya özelliklerinin uygulamaları olan çeşitli işaretleme uzantıları vardır. Bu işaretleme uzantıları, genel .NET Framework XAML hizmetlerinin bir parçası olarak System.Xaml derlemesinde uygulanır ve XAML dili XAML ad alanı içindedir. Yaygın işaretleme kullanımı açısından, bu işaretleme uzantıları genellikle kullanımdaki x: ön ek tarafından tanımlanabilir. MarkupExtension Temel sınıf (System.Xaml'de de tanımlanır) WPF XAML dahil olmak üzere XAML okuyucularında ve XAML yazıcılarında desteklenmek için tüm işaretleme uzantılarının kullanması gereken düzeni sağlar.

  • x:TypeType adlandırılmış tür için nesnesini sağlar. Bu tesis, stillerde ve şablonlarda en sık kullanılır. Ayrıntılar için bkz . x:Tür biçimlendirme uzantısı.

  • x:Static statik değerler üretir. Değerler, doğrudan bir hedef özelliğin değerinin türü olmayan ancak bu türe değerlendirilebilen değer türündeki kod varlıklarından gelir. Ayrıntılar için bkz . x:Static Markup Extension.

  • x:Nullnull bir özellik için değer olarak belirtir ve öznitelikler veya özellik öğesi değerleri için kullanılabilir. Ayrıntılar için bkz . x:Null biçimlendirme uzantısı.

  • x:Array WPF temel öğeleri ve denetim modelleri tarafından sağlanan koleksiyon desteğinin kasıtlı olarak kullanılmadığı durumlar için XAML söz diziminde genel diziler oluşturma desteği sağlar. Ayrıntılar için bkz . x:Dizi İşaretlemeyi Uzantısı.

Dekont

Ön x: ek, XAML dosyasının veya üretimin kök öğesinde XAML dili iç öğelerinin tipik XAML ad alanı eşlemesi için kullanılır. Örneğin, WPF uygulamaları için Visual Studio ş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, WPF varsayılan ad alanının veya belirli bir çerçeveyle ilgili olmayan diğer XAML ad alanlarının aksine, XAML dili için XAML ad alanının tanımlı bir parçası olan varlıkları tanımlamanın bir aracı olarak varsayılan x: eşleme varsayılır.

WPF'ye Özgü İşaretlemeyi Genişletmeler

WPF programlamada kullanılan en yaygın işaretleme uzantıları, kaynak başvurularını (StaticResource ve ) destekleyenler DynamicResourceve veri bağlamayı (Binding) destekleyen uzantılardır.

  • StaticResource , önceden tanımlanmış bir kaynağın değerini değiştirerek bir özellik için bir değer sağlar. Değerlendirme StaticResource sonuçta XAML yükleme zamanında yapılır ve çalışma zamanında nesne grafiğine erişimi yoktur. Ayrıntılar için bkz . StaticResource biçimlendirme uzantısı.

  • DynamicResource bu değeri bir kaynağa çalışma zamanı başvurusu olarak erteleyerek bir özellik için bir değer sağlar. Dinamik kaynak başvurusu, böyle bir kaynağa her erişildiğinde ve çalışma zamanında nesne grafiğine eriştiğinde yeni bir arama yapmaya zorlar. Bu erişimi almak için kavram WPF DynamicResource özellik sistemindeki bağımlılık özellikleri ve değerlendirilen ifadeler tarafından desteklenir. Bu nedenle yalnızca bağımlılık özelliği hedefi için kullanabilirsiniz DynamicResource . Ayrıntılar için bkz . DynamicResource biçimlendirme uzantısı.

  • Binding , çalışma zamanında üst nesneye uygulanan veri bağlamını kullanarak bir özellik için veri bağlama değeri sağlar. Bu işaretleme uzantısı, veri bağlaması belirtmek için önemli bir satır içi söz dizimi etkinleştirdiğinden görece karmaşıktır. Ayrıntılar için bkz . Biçimlendirme Uzantısını Bağlama.

  • RelativeSource , çalışma zamanı nesne ağacındaki çeşitli olası ilişkilerde gezinebilen bir Binding için kaynak bilgileri sağlar. Bu, çok kullanımlı şablonlarda oluşturulan veya çevresindeki nesne ağacı hakkında tam bilgi sahibi olmadan kodda oluşturulan bağlamalar için özel kaynak oluşturma sağlar. Ayrıntılar için bkz . RelativeSource MarkupExtension.

  • TemplateBinding bir denetim şablonunun, şablonu kullanacak sınıfın nesne modeli tanımlı özelliklerinden gelen şablonlu özellikler için değerleri kullanmasını sağlar. Başka bir deyişle, şablon tanımındaki özellik yalnızca şablon uygulandıktan sonra var olan bir bağlama erişebilir. Ayrıntılar için bkz . TemplateBinding Markup Extension. uygulamasının pratik kullanımı TemplateBindinghakkında daha fazla bilgi için bkz . ControlTemplates Ile Stil Oluşturma Örneği.

  • ColorConvertedBitmap görece gelişmiş görüntüleme senaryolarını destekler. Ayrıntılar için bkz . ColorConvertedBitmap Biçimlendirme Uzantısı.

  • ComponentResourceKey ve ThemeDictionary özellikle özel denetimlerle paketlenmiş kaynaklar ve temalar için kaynak aramanın özelliklerini destekler. Daha fazla bilgi için bkz . ComponentResourceKey İşaretleme Uzantısı, Tema Sözlüğü İşaretleme Uzantısı veya Denetim Yazmaya Genel Bakış.

*Uzantı Sınıfları

Hem genel XAML dili hem de WPF'ye özgü işaretleme uzantıları için, her işaretleme uzantısının davranışı, öğesinden MarkupExtensiontüretilen bir *Extension sınıf aracılığıyla bir XAML işlemcisine tanımlanır ve yönteminin ProvideValue bir uygulamasını sağlar. Her uzantıdaki bu yöntem, işaretleme uzantısı değerlendirildiğinde döndürülen nesneyi sağlar. Döndürülen nesne genellikle işaretleme uzantısına geçirilen çeşitli dize belirteçlerine göre değerlendirilir.

Örneğin, StaticResourceExtension sınıfı gerçek kaynak aramasının surface uygulamasını sağlar, böylece ProvideValue uygulaması istenen nesneyi döndürür ve bu uygulamanın girişi kaynağı tarafından x:Keyaramak için kullanılan bir dize olur. Mevcut bir işaretleme uzantısı kullanıyorsanız bu uygulama ayrıntılarının çoğu önemli değildir.

Bazı işaretleme uzantıları dize belirteci bağımsız değişkenlerini kullanmaz. Bunun nedeni statik veya tutarlı bir değer döndürmeleri ya da döndürülmesi gereken değerin bağlamının parametresi aracılığıyla serviceProvider geçirilen hizmetlerden biri aracılığıyla kullanılabilir olmasıdır.

Adlandırma *Extension düzeni kolaylık ve tutarlılık içindir. Bir XAML işlemcinin bu sınıfı işaretleme uzantısı desteği olarak tanımlaması için gerekli değildir. Kod tabanınız System.Xaml'i içerdiği ve .NET Framework XAML Hizmetleri uygulamalarını kullandığı sürece, XAML işaretleme uzantısı olarak tanınması gereken tek şey, ve derleme söz dizimini MarkupExtension desteklemektir. WPF, örneğin Bindingadlandırma desenini izlemeyen *Extension işaretleme uzantısını etkinleştiren sınıfları tanımlar. Bunun nedeni genellikle sınıfın saf işaretleme uzantısı desteğinin ötesinde senaryoları desteklemesidir. durumunda Binding, bu sınıf XAML ile hiçbir ilgisi olmayan senaryolar için nesnenin yöntemlerine ve özelliklerine çalışma zamanı erişimini destekler.

Başlatma Metninin Uzantı Sınıfı Yorumu

İşaretleme uzantısı adını izleyen ve hala küme ayraçlarının içinde olan dize belirteçleri, aşağıdaki yollardan biriyle bir XAML işlemcisi tarafından yorumlanır:

  • Virgül her zaman tek tek belirteçlerin ayırıcısını veya sınırlayıcısını temsil eder.

  • Ayrı ayrı belirteçler herhangi bir eşittir işareti içermiyorsa, her belirteç bir oluşturucu bağımsız değişkeni olarak kabul edilir. Her oluşturucu parametresi, bu imza tarafından beklenen tür olarak ve bu imza tarafından beklenen doğru sırada verilmelidir.

    Dekont

    Bir XAML işlemcisi, çift sayısının bağımsız değişken sayısıyla eşleşen oluşturucuyu çağırmalıdır. Bu nedenle, özel bir işaretleme uzantısı uyguluyorsanız, aynı bağımsız değişken sayısına sahip birden çok oluşturucu sağlamayın. Aynı parametre sayısına sahip birden fazla işaretleme uzantısı oluşturucu yolu tanımlanmamışsa, XAML işlemcisinin davranışı tanımlanmaz, ancak bu durum işaretleme uzantısı türü tanımlarında mevcutsa bir XAML işlemcisinin kullanımda özel durum oluşturmasına izin verilip verilmediğini tahmin etmelisiniz.

  • Ayrı ayrı belirteçler eşittir işaretleri içeriyorsa, XAML işlemcisi önce işaretleme uzantısı için parametresiz oluşturucuyu çağırır. Ardından, her name=value çifti, işaretleme uzantısında var olan bir özellik adı ve bu özelliğe atanacak bir değer olarak yorumlanır.

  • Bir işaretleme uzantısında oluşturucu davranışı ile özellik ayarı davranışı arasında paralel bir sonuç varsa, hangi davranışı kullandığınız önemli değildir. Birden fazla ayarlanabilir özelliğe sahip işaretleme uzantıları için özellik=değer çiftlerini kullanmak daha yaygın bir kullanımdır; bunun nedeni, işaretlemenizi daha kasıtlı hale getirdiği ve oluşturucu parametrelerini yanlışlıkla dönüştürme olasılığınız düşük olmasıdır. (property=value çiftlerini belirttiğinizde, bu özellikler herhangi bir sırada olabilir.) Ayrıca, işaretleme uzantısının ayarlanabilir özelliklerinin her birini ayarlayan bir oluşturucu parametresi sağladığının garantisi yoktur. Örneğin, Binding özellik=değeri biçiminde uzantı aracılığıyla ayarlanabilen, ancak Binding yalnızca iki oluşturucuyu destekleyen bir işaretleme uzantısıdır: parametresiz oluşturucu ve ilk yolu ayarlayan bir uzantı.

  • Sabit virgül, kaçış olmadan işaretleme uzantısına geçirilemez.

Kaçış Dizileri ve İşaretlemeyi Genişletmeler

XAML işlemcisinde öznitelik işleme, işaretleme uzantısı dizisinin göstergeleri olarak küme ayraçlarını kullanır. Gerekirse boş bir küme ayracı çifti ve ardından değişmez küme ayracı kullanarak bir kaçış dizisi girerek bir değişmez küme ayracı karakter özniteliği değeri oluşturmak da mümkündür. Bkz. {} Kaçış Dizisi - İşaretlemeyi Genişletme.

XAML Kullanımında İşaretleme Uzantılarını İç İçe Yerleştirme

Birden çok işaretleme uzantısının iç içe yerleştirilmiş olması desteklenir ve her işaretleme uzantısı önce en derin şekilde değerlendirilir. Örneğin, aşağıdaki kullanımı göz önünde bulundurun:

<Setter Property="Background"  
  Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />  

Bu kullanımda x:Static , deyimi önce değerlendirilir ve bir dize döndürür. Bu dize daha sonra için DynamicResourcebağımsız değişken olarak kullanılır.

İşaretlemeyi Uzantılar ve Özellik Öğesi Sözdizimi

Bir özellik öğesi değerini dolduran bir nesne öğesi olarak kullanıldığında, işaretleme uzantısı sınıfı XAML'de kullanılabilecek tipik tür destekli nesne öğesinden görsel olarak ayırt edilemez. Tipik bir nesne öğesi ile işaretleme uzantısı arasındaki pratik fark, işaretleme uzantısının türlenmiş bir değer olarak değerlendirilmesi veya ifade olarak ertelenmiş olmasıdır. Bu nedenle, işaretleme uzantısı için özellik değerlerinin olası tür hatalarına yönelik mekanizmalar, geç bağlanan bir özelliğin diğer programlama modellerinde nasıl ele alınacağı gibi farklı olacaktır. Sıradan bir nesne öğesi, XAML ayrıştırıldığında ayarlandığı hedef özelliğe göre tür eşleşmesi için değerlendirilir.

Çoğu işaretleme uzantısı, bir özellik öğesini doldurmak için nesne öğesi söz diziminde kullanıldığında, içinde içerik veya başka bir özellik öğesi söz dizimi olmaz. Böylece nesne öğesi etiketini kapatır ve alt öğe sağlamazsınız. Bir XAML işlemcisi tarafından herhangi bir nesne öğesiyle karşılaşıldığında, ayrıştırılan öğeden oluşturulan nesnenin örneğini oluşturan bu sınıfın oluşturucusunun adı verilir. İşaretlemeyi uzantı sınıfı farklı değildir: biçimlendirme uzantınızın nesne öğesi söz diziminde kullanılabilir olmasını istiyorsanız, parametresiz bir oluşturucu sağlamanız gerekir. Bazı mevcut işaretleme uzantıları, etkin başlatma için belirtilmesi gereken en az bir gerekli özellik değerine sahiptir. Öyleyse, bu özellik değeri genellikle nesne öğesinde özellik özniteliği olarak verilir. XAML Ad Alanı (x:) Dil Özellikleri ve WPF XAML Uzantıları başvuru sayfalarında, gerekli özelliklere (ve gerekli özelliklerin adlarına) sahip işaretleme uzantıları not edilir. Başvuru sayfaları, belirli işaretleme uzantıları için nesne öğesi söz dizimine veya öznitelik söz dizimine izin verilmediğini de not eder. Dikkate değer bir durum x:Dizi İşaretleme Uzantısı'dır. Bu uzantı, söz konusu dizinin içeriğinin içerik olarak etiketleme içinde belirtilmesi gerektiğinden öznitelik söz dizimini destekleyemez. Dizi içeriği genel nesneler olarak işlenir, bu nedenle özniteliği için varsayılan tür dönüştürücüsü uygun değildir. Ayrıca, x:Dizi İşaretlemeyi Uzantısı bir type parametre gerektirir.

Ayrıca bkz.