Biçimlendirme Uzantıları ve WPF XAML
Bu konuda söz dizimi kuralları, amacı ve bunların altında yer alan sınıf nesnesi modeli dahil olmak üzere XAML için işaretleme uzantıları kavramı tanıtılmıştır. İşaretleme uzantıları, XAML dilinin ve XAML hizmetlerinin .NET uygulamasının genel bir özelliğidir. Bu konu, WPF XAML'de kullanım için işaretleme uzantılarını özellikle ayrıntılarıyla açıklamaya yöneliktir.
XAML İşlemcileri ve İşaretleme Uzantıları
Genel olarak ifade etmek gerekir ki XAML ayrıştırıcısı bir öznitelik değerini bir temele dönüştürülecek değişmez değer dizesi olarak yorumlayıcı veya herhangi bir şekilde bir nesneye dönüştürebilirsiniz. Bu türlerden biri, tür dönüştürücüye başvurmaktır; Bu, TypeConverters ve XAML konu başlığı altında belgelendi. Ancak farklı davranışların gerekli olduğu senaryolar da vardır. Örneğin bir XAML işlemcisi, bir özniteliğin değerinin nesne grafı içinde yeni bir nesneyle sonuçlanmayacak şekilde yorumlandırılamayacak şekilde yorumlandırabilirsiniz. Bunun yerine, özniteliği grafın başka bir bölümünde zaten oluşturulmuş bir nesneye veya statik bir nesneye başvuru yapan bir nesne grafı ile sonuçlandır. Başka bir senaryo, bir XAML işlemcisinin, bir nesnenin oluşturucusu için varsayılan olmayan bağımsız değişkenler sağlayan bir söz dizimi kullanması isnilmesidir. Bunlar, bir işaretleme uzantısının çözümü sağlay diline sahip olduğu senaryo türleridir.
Temel Biçimlendirme Uzantısı Söz Dizimi
Bir öznitelik kullanımı, özellik öğesi kullanımında özellikler veya her ikisi için değerler sağlamak için bir işaretleme uzantısı uygulanabilirsiniz.
Bir öznitelik değeri sağlamak için kullanılırken, bir işaretleme uzantısı dizisini XAML işlemcisi ile ayıran söz dizimi, açılış ve kapanış küme ayraçlarının ({ ve }) varlığıdır. İşaretleme uzantısının türü, açılış küme ayracı sonrasında dize belirteci tarafından tanımlanır.
Özellik öğesi söz dizimsinde kullanılan işaretleme uzantısı, özellik öğesi değeri sağlamak için kullanılan diğer tüm öğeyle görsel olarak aynıdır: işaretleme uzantısı sınıfına açılı ayraçlar (<>) içine alınmış bir öğe olarak başvurulan XAML öğesi bildirimi.
XAML-Defined Biçimlendirme Uzantıları
XAML'nin WPF uygulamasına özgü olmayan ama bunun yerine dil olarak XAML'nin iç veya özelliklerinin uygulamaları olan birkaç işaretleme uzantısı vardır. Bu işaretleme uzantıları, XAML hizmetlerinde genel .NET Framework parçası olarak System.Xaml derlemesinde uygulanır ve XAML dili XAML ad alanı içindedir. Ortak işaretleme kullanımı açısından, bu işaretleme uzantıları genellikle kullanım ön eki x: tarafından tanımlanabilir. Temel MarkupExtension sınıf (System.Xaml'de de tanımlanır) WPF XAML dahil olmak üzere XAML okuyucularında ve XAML yazıcılarında destek olmak için tüm işaretleme uzantılarının kullanması gereken deseni sağlar.
x:Typeadlandırılmış Type 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:Type Markup Extension.x:Staticstatik değerler üretir. Değerler, doğrudan bir hedef özelliğin değerinin türü olmayan, ancak bu türe değerlendirilen değer türü kod varlıklarından gelir. Ayrıntılar için bkz. x:Static Markup Extension.x:Nullbirnullözellik için bir değer olarak belirtir ve öznitelikler veya özellik öğesi değerleri için kullanılabilir. Ayrıntılar için bkz. x:Null İşaretleme Uzantısı.x:Array, WPF temel öğeleri ve denetim modelleri tarafından sağlanan koleksiyon desteğinin kasıtlı olarak kullanılmama durumlarında XAML söz dizimlerinde genel diziler oluşturulması için destek sağlar. Ayrıntılar için bkz. x:Array Markup Extension.
Not
Ön ek, bir XAML dosyasının veya üretimin kök öğesinde, XAML dil içlerinin tipik XAML ad alanı x: eşlemesi için kullanılır. Örneğin, WPF Visual Studio şablonları bu eşlemeyi kullanarak bir XAML dosyası x: başlatıyor. Kendi XAML ad alanı eşlemesinde farklı bir ön ek belirteci seçebilirsiniz, ancak bu belge, WPF varsayılan ad alanı veya belirli bir çerçeveyle ilgili 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 eşlemeyi x: varsayacaktır.
WPF-Specific Biçimlendirme Uzantıları
WPF programlamada kullanılan en yaygın işaretleme uzantıları, kaynak başvurularını ( ve ) ve veri bağlamayı destekleyen StaticResource DynamicResource uzantılardır ( Binding ).
StaticResource, önceden tanımlanmış bir kaynağın değerinin yerine bir özellik değeri verir. Değerlendirme sonunda XAML yükleme zamanında yapılır ve çalışma zamanında nesneStaticResourcegrafiğine erişimi olmaz. Ayrıntılar için bkz. StaticResource İşaretleme Uzantısı.DynamicResource, bu değerin bir kaynağa çalışma zamanı başvurusu olarak ertelenerek bir özellik için değer sağlar. Dinamik kaynak başvurusu, bu tür bir kaynağa her erişilirken yeni bir aramayı güçler ve çalışma zamanında nesne grafı erişimine sahip olur. Bu erişimi elde etmek için kavram WPF özellik sistemi bağımlılık özellikleri ve değerlendirilenDynamicResourceifadeler tarafından değerlendirilmesi gerekir. Bu nedenle, yalnızcaDynamicResourcebağımlılık özellik hedefi için kullanabilirsiniz. Ayrıntılar için bkz. DynamicResource İşaretleme Uzantısı.Binding, çalışma zamanında üst nesneye uygulanan veri bağlamını kullanarak bir özellik için veriye bağlı değer sağlar. Bir veri bağlaması belirtmek için önemli bir satır içi söz dizimi sağlayan bu işaretleme uzantısı görece karmaşıktır. Ayrıntılar için bkz. İşaretleme Uzantısını Bağlama.RelativeSource, çalışma zamanı nesne Binding ağacında birkaç olası ilişkide gezinen bir 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 sağlar. Ayrıntılar için bkz. RelativeSource MarkupExtension.TemplateBinding, bir denetim şablonunun şablonu kullanan sınıfın nesne modeli tanımlı özelliklerinden gelen şablon özellikleri için değerleri kullanmalarını sağlar. Başka bir deyişle, şablon tanımı içindeki özelliği, yalnızca şablon uygulandıktan sonra var olan bir bağlama erişebilirsiniz. Ayrıntılar için bkz. TemplateBinding İşaretleme Uzantısı. 'nin pratik kullanımı hakkında daha fazla bilgi içinTemplateBindingbkz. ControlTemplates Örneği ile Stil Oluşturma.ColorConvertedBitmapgörece gelişmiş görüntüleme senaryosunu destekler. Ayrıntılar için bkz. ColorConvertedBitmap İşaretleme Uzantısı.ComponentResourceKeyveThemeDictionaryözellikle özel denetimlerle paketlenmiş kaynaklar ve temalar için kaynak aramanın yönlerini destekler. Daha fazla bilgi için bkz. ComponentResourceKey İşaretleme Uzantısı, ThemeDictionary Biçimlendirme 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ışı, 'den türetilen bir sınıf aracılığıyla bir XAML işlemcisi olarak tanımlanır ve yönteminin bir uygulamasını *Extension MarkupExtension ProvideValue sağlar. Her uzantıda bu yöntem, işaretleme uzantısı değerlendir geldiğinde döndürülen nesnesini 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, sınıfı gerçek kaynak aramanın yüzey uygulamasını sağlar, böylece uygulaması istenen nesneyi döndürür ve bu uygulamanın girişi kaynağına göre aramak için kullanılan bir StaticResourceExtension ProvideValue x:Key dizedir. Mevcut bir işaretleme uzantısı kullanıyorsanız bu uygulama ayrıntıları ö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ürülen veya döndürülen değer bağlamının parametresi aracılığıyla geçirilen hizmetlerden biri aracılığıyla kullanılabilir serviceProvider olmasıdır.
Adlandırma *Extension düzeni kolaylık ve tutarlılık içindir. XAML işlemcisinin bu sınıfı işaretleme uzantısı için destek olarak tanımlaması gerekli değildir. Kod tabanınız System.Xaml'i dahil olduğu ve .NET Framework XAML Hizmetleri uygulamaları kullandığı sürece, XAML işaretleme uzantısı olarak tanınması gereken tek şey, bir yapı söz dizimini desteklemek için ve 'den MarkupExtension türetmektir. WPF, adlandırma desenini takip etmeyen işaretleme uzantısını *Extension etkinleştirme sınıflarını tanımlar, örneğin Binding . Bunun nedeni genellikle sınıfının saf işaretleme uzantısı desteğinin ötesindeki senaryoları desteklemesidir. örneğinde, bu sınıf XAML ile hiçbir ilgisi olmayan senaryolar için nesnenin yöntemlerine ve özelliklerine çalışma Binding zamanı erişimini destekler.
Başlatma Metninin Uzantı Sınıfı Yorumu
İşaretleme uzantısı adını takip eden ve hala küme ayraçlarının içinde yer alan dize belirteçleri aşağıdaki yöntemlerden birini kullanarak bir XAML işlemcisi tarafından yorumlanır:
Virgül her zaman ayrı belirteçlerin ayırıcısını veya sınırlayıcısını temsil eder.
Ayrı ayrı ayrılmış belirteçler herhangi bir eşittir işareti içeriyorsa, 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 uygun sırada ver gerekir.
Not
XAML işlemcisi, çift sayısının bağımsız değişken sayısıyla eşleşen oluşturucuya çağrılmalıdır. Bu nedenle, özel bir işaretleme uzantısı uygulayıyorsanı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 varsa XAML işlemcisinin davranışı tanımlanmamıştır, ancak işaretleme uzantısı türü tanımlarında bu durum varsa bir XAML işlemcisinin kullanım üzerinde özel durum oluşturmasına izin verildiğini tahmin edersiniz.
Ayrı ayrı ayrılmış belirteçler eşittir işaretleri içeriyorsa, XAML işlemcisi ilk olarak işaretleme uzantısı için parametresiz oluşturucusu çağırır. Ardından her name=value çifti, işaretleme uzantısında mevcut olan bir özellik adı ve bu özelite atanma değeri olarak yorumlanır.
Oluşturucu davranışı ile işaretleme uzantısında özellik ayarı davranışı arasında paralel bir sonuç varsa, hangi davranışı kullanırsanız kullanın. Birden fazla ayarlanamayan özelliği olan işaretleme uzantıları için özellik değer çiftlerini kullanmak daha yaygın bir kullanımdır. Bunun nedeni, işaretlemenizin daha kasıtlı olması ve oluşturucu parametrelerini yanlışlıkla başka bir şekilde başka bir değere dönüşüme neden olma ihtimalinizin düşük
=olmasıdır. (Özellik=değer çiftleri belirttiğinizde, bu özellikler herhangi bir sırada olabilir.) Ayrıca, bir işaretleme uzantısının ayarlanamayan özelliklerinin her birini ayaran bir oluşturucu parametresini temin eder. Örneğin, özellik değeri formunda uzantı aracılığıyla ayarlanamayan, ancak yalnızca iki oluşturucu destekler: parametresiz bir oluşturucu ve bir başlangıç yolu ayaran birçok özelliği olan bir işaretleme Binding=Binding uzantısıdır.Sabit virgül, kaçış olmadan bir işaretleme uzantısına geçirılamaz.
Kaçış Dizileri ve İşaretleme Uzantıları
XAML işlemcisinde öznitelik işleme, küme ayraçlarını işaretleme uzantısı dizisinin göstergeleri olarak kullanır. Gerekirse boş küme ayracı çifti ve ardından sabit küme ayracı kullanarak bir kaçış dizisi girerek değişmez küme ayracı karakter özniteliği değeri de üretmek mümkündür. Bkz. {} Kaçış Dizisi - İşaretleme Uzantısı.
XAML Kullanımında İşaretleme Uzantılarını İç İçe Yerleştirme
Birden çok işaretleme uzantısını iç içe yerleştirme desteği vardır ve her işaretleme uzantısı önce en derinden değerlendirilir. Örneğin, aşağıdaki kullanımı dikkate alalım:
<Setter Property="Background"
Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
Bu kullanımda ilk x:Static olarak deyimi değerlendirilir ve bir dize döndürür. Bu dize daha sonra için bağımsız değişken olarak DynamicResource kullanılır.
İşaretleme Uzantıları ve Özellik Öğesi Söz Dizimi
Bir özellik öğesi değerini dolduran bir nesne öğesi olarak kullanılırsa, işaretleme uzantısı sınıfı XAML'de değiştirilebilir tipik bir tür ile 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üre sahip bir değer olarak değerlendirilmesi veya ifade olarak ertelenmiş olarak ertelenmiş olduğudur. Bu nedenle işaretleme uzantısı için özellik değerlerinin olası tür hatalarına ait mekanizmalar, diğer programlama modellerinde geç bağlanmış bir özelliğin nasıl işleneğine benzer şekilde farklı olur. Sıradan bir nesne öğesi, XAML ayrıştırıldıklarına ayarlandıkları hedef özelikle 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 diziminin içinde içerik veya başka özellik öğesi sözdizimine sahip olmaz. Bu nedenle nesne öğesi etiketini kapatır ve alt öğe sağlamaz. Bir XAML işlemcisi herhangi bir nesne öğesiyle karşılaştığında, o sınıfın oluşturucusu çağrılır ve ayrıştırılan öğeden oluşturulan nesnenin örneğini oluşturur. Biçimlendirme uzantısı sınıfı farklı değildir: işaretleme uzantınızı nesne öğesi söz diziminin kullanılabilir olması için parametresiz bir oluşturucu sağlamalısınız. Bazı mevcut işaretleme uzantılarının etkili başlatma için belirtilmelidir en az bir gerekli özellik değeri vardır. Öyleyse, bu özellik değeri genellikle nesne öğesinde bir özellik özniteliği olarak verilir. XAML Ad Alanı'da (x:) Dil Özellikleri ve WPF XAML Uzantıları başvuru sayfaları, gerekli özelliklere sahip işaretleme uzantıları (ve gerekli özelliklerin adları) not edin. Başvuru sayfaları, belirli işaretleme uzantıları için nesne öğesi söz diziminin veya öznitelik söz diziminin izin verilmiyor olduğunu da not eder. Önemli bir durum x:Array MarkupExtension'dır ve bu dizinin içeriği içerik olarak etiketleme içinde belirtilmelidir. Dizi içeriği genel nesneler olarak işlir, bu nedenle özniteliği için varsayılan tür dönüştürücü uygulanabilir değildir. Ayrıca, x:Array Markup Extension bir parametre type gerektirir.