WPF için XAML ve Özel Sınıflar
Ortak dil çalışma zamanı (CLR) çerçevelerinde uygulanan XAML, herhangi bir ortak dil çalışma zamanı (CLR) dilinde özel bir sınıf veya yapı tanımlamayı ve ardından XAML işaretlemesini kullanarak bu sınıfa erişmeyi destekler. Genellikle özel türleri bir XAML ad alanı ön ekini eşlerken, aynı işaretleme dosyasındaki Windows Presentation Foundation (WPF) tanımlı türlerin ve özel türlerinizin bir karışımını kullanabilirsiniz. Bu konuda, bir özel sınıfın XAML öğesi olarak kullanılabilir olması için karşılaması gereken gereksinimler açıklanmıştır.
Uygulamalarda veya Derlemelerde Özel Sınıflar
XAML'de kullanılan özel sınıflar iki farklı şekilde tanımlanabilir: birincil Windows Presentation Foundation (WPF) uygulamasını üreten arka kod veya diğer kod içinde ya da sınıf kitaplığı olarak kullanılan yürütülebilir dosya veya DLL gibi ayrı bir derlemede sınıf olarak. Bu yaklaşımların her biri belirli avantajlara ve dezavantajlara sahiptir.
Sınıf kitaplığı oluşturmanın avantajı, bu tür özel sınıfların birçok farklı olası uygulama arasında paylaştırılana sahip olmasıdır. Ayrı bir kitaplık ayrıca uygulamaların sürüm oluşturma sorunlarını denetlemeyi kolaylaştırır ve hedeflenen sınıf kullanımının XAML sayfasında kök öğe olarak olduğu bir sınıf oluşturmayı kolaylaştırır.
Uygulama içinde özel sınıfları tanımlamanın avantajı, bu tekniğin görece basit olması ve ana uygulama yürütülebilir dosyasının ötesinde ayrı derlemeler tanıtılırken karşılaşılan dağıtım ve test sorunlarını en aza indirmesidir.
Aynı veya farklı derlemede tanımlansa da, XAML'de öğe olarak kullanmak için özel sınıfların CLR ad alanı ve XML ad alanı arasında eşlenmiş olması gerekir. Bkz. WPF XAML için XAML Ad Alanları ve Ad Alanı Eşlemesi.
XAML Öğesi Olarak Özel Sınıf Gereksinimleri
Nesne öğesi olarak örneği olmak için sınıfınız aşağıdaki gereksinimleri karşılamalıdır:
Özel sınıfınız genel olmalıdır ve varsayılan (parametresiz) genel oluşturucu desteğine sahip olmalıdır. (Yapılarla ilgili notlar için aşağıdaki bölüme bakın.)
Özel sınıfınız iç içe geçmiş bir sınıf olması gerekir. İç içe geçmiş sınıflar ve genel CLR kullanım söz dizimlerinde "nokta", ekli özellikler gibi diğer WPF ve/veya XAML özellikleriyle engel olur.
Nesne öğesi söz dizimini etkinleştirmeye ek olarak, nesne tanımınız bu nesneyi değer türü olarak alan diğer genel özellikler için özellik öğesi söz dizimini de sağlar. Bunun nedeni, nesnesinin artık bir nesne öğesi olarak örneği oluşturması ve bu tür bir özelliğin özellik öğesi değerini doldurarak doldurmasıdır.
Yapılar
Özel türler olarak tanımladığınız yapılar her zaman WPF'de XAML'de oluşturulur. Bunun nedeni CLR derleyicilerinin tüm özellik değerlerini varsayılanlarına başlatan bir yapı için örtülü olarak parametresiz bir oluşturucu oluşturmasıdır. Bazı durumlarda, bir yapı için varsayılan oluşturma davranışı ve/veya nesne öğesi kullanımı tercih edilmez. Bunun nedeni, yapının değerleri doldurmaya ve kavramsal olarak bir birlikte çalışmaya yönelik olması olabilir. Burada, içerdiği değerlerin birbirini dışlar ve bu nedenle özelliklerinin hiçbiri ayarlanamaz. Bu tür bir yapının WPF GridLength örneğidir. Genellikle, bu tür yapıların, değerlerin yapı değerlerinin farklı yorumlarını veya modlarını oluşturan dize kuralları kullanılarak öznitelik formunda ifade edil bir tür dönüştürücü uygulaması gerekir. Yapı, parametresiz olmayan bir oluşturucu aracılığıyla kod oluşturma için de benzer davranışları ortaya çıkarmalıdır.
XAML Öznitelikleri Olarak Özel Bir Sınıfın Özellikleri için Gereksinimler
Özellikler, bir değer türüne (örneğin, ilkel) başvurmalıdır veya bir XAML işlemcisinin erişirken kullanabileceği parametresiz oluşturucuya veya ayrılmış tür dönüştürücüye sahip tür için bir sınıf kullanmalıdır. CLR XAML uygulamasında, XAML işlemcileri bu tür dönüştürücüleri dil temelleri için yerel destek aracılığıyla veya destekleyen tür tanımlarında bir türe veya üyeye uygulaması aracılığıyla TypeConverterAttribute bulur
Alternatif olarak, özelliği soyut bir sınıf türüne veya bir arabirime başvurur. Soyut sınıflar veya arabirimler için XAML ayrıştırma için beklenti, özellik değerinin arabirimi uygulayan pratik sınıf örnekleriyle veya soyut sınıftan türeten tür örnekleriyle doldurulmasıdır.
Özellikler soyut bir sınıfta bildirilmelidir, ancak yalnızca soyut sınıftan türeten pratik sınıflarda ayarlanabilirsiniz. Bunun nedeni, sınıf için nesne öğesinin oluşturulmasının sınıfta genel parametresiz bir oluşturucu gerektirerek olmasıdır.
TypeConverter Etkin Öznitelik Söz Dizimi
Sınıf düzeyinde ayrılmış, öznitelikli bir tür dönüştürücü sağlarsanız, uygulanan tür dönüştürmesi bu türün örneğini olması gereken herhangi bir özellik için öznitelik sözdizimini sağlar. Tür dönüştürücü, türün nesne öğesi kullanımını etkinleştirmez; yalnızca bu tür için parametresiz bir oluşturucu olması nesne öğesi kullanımını sağlar. Bu nedenle, türün kendisi nesne öğesi sözdizimini de desteklemediği sürece, tür dönüştürücü etkinleştirilmiş özellikler genellikle özellik söz diziminin içinde kullanılamaz. Bunun istisnası, bir özellik öğesi söz dizimi belirtebilirsiniz, ancak özellik öğesinin bir dize içermesini sebilirsiniz. Bu kullanım, öznitelik söz dizimi kullanımına gerçekten eşdeğerdir ve öznitelik değerinin daha sağlam bir boşluk işlemesine ihtiyaç olmadığı sürece bu tür bir kullanım yaygın değildir. Örneğin, aşağıda bir dize alan bir özellik öğesi kullanımı ve öznitelik kullanımı eşdeğeri yer alır:
<Button>Hallo!
<Button.Language>
de-DE
</Button.Language>
</Button>
<Button Language="de-DE">Hallo!</Button>
Öznitelik söz diziminin izin verilen ancak bir nesne öğesi içeren özellik öğesi söz diziminin XAML aracılığıyla izin verilmeyen özellik özellikleri, türü alan çeşitli Cursor özelliklerdir. sınıfının ayrılmış bir tür dönüştürücüsü vardır, ancak parametresiz bir oluşturucuya sahip değildir, bu nedenle özellik yalnızca gerçek tür bir başvuru türü olsa bile öznitelik söz dizimi CursorCursorConverter aracılığıyla CursorCursor ayarlandırabilirsiniz.
Per-Property Tür Dönüştürücüleri
Alternatif olarak, özelliğin kendisi özellik düzeyinde bir tür dönüştürücü bildiriyor olabilir. Bu, özniteliğin gelen dize değerlerini uygun türe göre bir işlem için giriş olarak işerek, satır içi özellik türünün nesnelerini örnek alan bir "mini dil" ConvertFrom sağlar. Genellikle bu, XAML'de özellik ayarlamayı etkinleştirmenin tek amacı olarak değil kolaylık erişimcisi sağlamak için yapılır. Ancak, parametresiz bir oluşturucu veya öznitelikli tür dönüştürücüsü belirtmiyor mevcut CLR türlerini kullanmak istediğiniz öznitelikler için tür dönüştürücüleri kullanmak da mümkündür. WPF API'lerinden örnekler, türü alan belirli CultureInfo özelliklerdir. Bu durumda WPF, çerçevelerin önceki sürümlerinde kullanılan uyumluluk ve geçiş senaryolarını daha iyi ele almaya yönelik mevcut Microsoft .NET Framework türünü kullandı, ancak tür gerekli oluşturucuları veya tür düzeyi tür dönüştürmeyi CultureInfo doğrudan bir XAML özellik değeri olarak kullanılabilir olacak şekilde CultureInfo desteklemedi.
Özellikle bir denetim yazarıysanız, XAML kullanımına sahip bir özelliği her açığa çıkarsanız, bu özelliği bağımlılık özelliğiyle kesinlikle geri alasanız iyi olur. Bu durum özellikle XAML işlemcisinin mevcut Windows Presentation Foundation (WPF) uygulamasını kullanıyorsanız doğrudur çünkü backing kullanarak performansı DependencyProperty geliştirebilirsiniz. Bağımlılık özelliği, kullanıcıların XAML erişilebilir özelliği için beklediğiniz özelliğin özellik sistemi özelliklerini ortaya çıkarır. Buna animasyon, veri bağlama ve stil desteği gibi özellikler dahildir. Daha fazla bilgi için bkz. Özel Bağımlılık Özellikleri ve XAML Yükleme ve Bağımlılık Özellikleri.
Tür Dönüştürücüsü Yazma ve Attırma
Bazen özellik türünüz için tür dönüştürme TypeConverter sağlamak üzere özel türetilmiş bir sınıf yazmanız gerekir. 'den türetme ve XAML kullanımlarını destekleyabilecek bir tür dönüştürücü oluşturma ve uygulama yönergeleri için TypeConverterAttribute bkz. TypeConverterAttribute.
Özel Sınıfın Olaylarında XAML Olay İşleyicisi Öznitelik Sözdizimi Gereksinimleri
CLR olayı olarak kullanılabilir olması için, olayın parametresiz bir oluşturucu destekleyen bir sınıfta veya türetilmiş sınıflarda olayın erişilil olduğu soyut bir sınıfta genel bir olay olarak açığa çıkarmalıdır. Yönlendirilen bir olay olarak rahatça kullanılamayacak şekilde CLR olayınız, CLR olay imzası için işleyiciler ekp kaldıran ve bu işleyicileri ve yöntemlerine ile yönlendiren açık ve yöntemleri addremoveAddHandlerRemoveHandler uygulamalı. Bu yöntemler, işleyicileri olayın bağlı olduğu örnekte yönlendirilmiş olay işleyici deposuna ekler veya kaldırır.
Not
kullanarak yönlendirilen olaylar için işleyicileri doğrudan kaydetmek ve kasıtlı olarak yönlendirilen olayı ortaya çıkaran bir CLR olayı AddHandler tanımlamamak mümkündür. Olay işleyicileri eklemek için XAML özniteliği söz dizimini etkinleştirmeyecek ve sonuçta elde edilen sınıfınız bu türün özelliklerine daha az saydam bir XAML görünümü sunacak olduğundan bu genellikle önerilmez.
Koleksiyon Özellikleri Yazma
Koleksiyon türü alan özellikler, koleksiyona eklenen nesneleri belirtmenize olanak sağlayan bir XAML söz dizimi içerir. Bu söz dizimi iki önemli özele sahiptir.
Koleksiyon nesnesi olan nesnenin nesne öğesi sözdiziminde belirtilmemiş olması gerekir. XAML'de koleksiyon türü alan bir özellik belirttiğinizde bu koleksiyon türünün varlığı örtülü olarakdır.
İşaretlemede koleksiyon özelliğinin alt öğeleri, koleksiyonun üyesi olmak için işlenir. Normalde, bir koleksiyonun üyelerine kod erişimi, gibi liste/sözlük yöntemleri aracılığıyla veya bir
Adddizinici aracılığıyla gerçekleştirilir. Ancak XAML söz dizimi yöntemleri veya dizinlayıcıları desteklemez (özel durum: XAML 2009 yöntemleri destekleyebildi, ancak XAML 2009 kullanmak olası WPF kullanımlarını kısıtlar; bkz. XAML 2009 Dil Özellikleri). Koleksiyonlar, bir öğe ağacı derlemek için çok yaygın bir gereksinimdir ve bu koleksiyonları bildirimli XAML olarak doldurmak için bir yol gerekir. Bu nedenle, bir koleksiyon özelliğinin alt öğeleri, koleksiyon özellik türü değeri olan koleksiyona eklenerek işlenir.
XAML .NET Framework ve bu nedenle WPF XAML işlemcisi, bir koleksiyon özelliğini oluşturan için aşağıdaki tanımı kullanır. Özelliğin özellik türü, aşağıdakilerden birini uygulamalı:
uygulama. IList
Uygulama veya IDictionary genel eşdeğeri ( IDictionary<TKey,TValue> ).
türetilenler Array (XAML'deki diziler hakkında daha fazla bilgi için bkz. Array.)
Implements IAddChild (WPF tarafından tanımlanan bir arabirim).
CLR'de bu türlerin her biri, nesne grafiğini oluştururken temel alınan koleksiyona öğe eklemek için XAML işlemcisi tarafından kullanılan Add bir yöntemine sahiptir.
Not
Genel ve ListDictionary arabirimler ( IList<T> ve ) IDictionary<TKey,TValue> WPF XAML işlemcisi tarafından koleksiyon algılama için desteklanmaz. Ancak, sınıfını doğrudan uygulayan bir temel sınıf olarak veya doğrudan uygulayan bir List<T>IList temel sınıf olarak Dictionary<TKey,TValue>IDictionary kullanabilirsiniz.
Bir koleksiyon alan bir özellik bildirerken, bu özellik değerinin türün yeni örneklerde nasıl başlatılmış olduğu konusunda dikkatli olun. Özelliği bağımlılık özelliği olarak uygulamazsanız, özelliğin koleksiyon türü oluşturucusu çağıran bir destek alanı kullanması yeterli olur. Özelliğiniz bir bağımlılık özelliği ise, koleksiyon özelliğini varsayılan tür oluşturucuslarının bir parçası olarak başlatmanız gerekir. Bunun nedeni bağımlılık özelliğinin varsayılan değerini meta verilerden istemeniz ve genellikle bir koleksiyon özelliğinin ilk değerinin statik, paylaşılan bir koleksiyon olması istemenizdir. Her biri tür örneği içeren bir koleksiyon örneği olması gerekir. Daha fazla bilgi için bkz. Özel Bağımlılık Özellikleri.
Koleksiyon özelliğiniz için özel bir koleksiyon türü kullanabilirsiniz. Örtülü koleksiyon özelliği nedeniyle, özel koleksiyon türünün XAML'de örtülü olarak kullanmak için parametresiz bir oluşturucu sağlamak zorunda değildir. Ancak, isteğe bağlı olarak koleksiyon türü için parametresiz bir oluşturucu sebilirsiniz. Bu, değerli bir uygulama olabilir. Parametresiz bir oluşturucu sağlamadıkça, koleksiyonu açıkça bir nesne öğesi olarak bildirilemezsiniz. Bazı işaretleme yazarları, işaretleme stiline göre açık koleksiyonu görmek tercih ediyor olabilir. Ayrıca, parametresiz bir oluşturucu, bir özellik değeri olarak koleksiyon türlerinizi kullanan yeni nesneler oluşturma sırasında başlatma gereksinimlerini basitleştirebilir.
XAML İçerik Özelliklerini Bildirim
XAML dili XAML içerik özelliği kavramını tanımlar. Nesne sözdiziminde kullanılabilir olan her sınıf tam olarak bir XAML içerik özelliğine sahip olabilir. Sınıfınız için XAML içerik özelliği olarak bir özelliği bildirmek üzere, ContentPropertyAttribute sınıf tanımının parçası olarak uygulayın. Hedeflenen XAML içerik özelliğinin adını özniteliğinde olarak belirtin Name . Özelliği, gibi bir yansıma yapısı olarak değil, ada göre bir dize olarak belirtilir PropertyInfo .
XAML içerik özelliği olarak bir koleksiyon özelliği belirtebilirsiniz. Bu, nesne öğesinin bir veya daha fazla alt öğesine sahip olması ve herhangi bir araya eklenen koleksiyon nesnesi öğesi ya da Özellik öğesi etiketleri olmadan bu özelliğin kullanılmasına neden olur. Bu öğeler daha sonra XAML içerik özelliği için değer olarak değerlendirilir ve yedekleme koleksiyonu örneğine eklenir.
Bazı var olan XAML içerik özellikleri, öğesinin özellik türünü kullanır Object . Bu, bir XAML içerik özelliğinin, ve gibi basit değerler alıp tek bir String başvuru nesne değeri alınmasına izin verir. Bu modeli izlerseniz, tipiniz tür belirlemekten ve olası türlerin işlenmesinden sorumludur. Bir içerik türünün tipik nedeni, Object nesne içeriğini bir dize olarak (varsayılan bir sunum işlemi alır) ya da varsayılan olmayan bir sunuyu veya ek verileri belirten gelişmiş nesne içeriği ekleme gibi basit bir şekilde desteklemek içindir.
XAML serileştirme
Bir denetim yazarı gibi belirli senaryolarda, XAML 'de örneklenebilir herhangi bir nesne gösteriminin de eşdeğer XAML biçimlendirmesine geri serileştirilmesine emin olmak isteyebilirsiniz. Serileştirme gereksinimleri bu konuda açıklanmamaktadır. Bkz. Denetim yazma genel bakış ve öğe ağacı ve serileştirme.