TypeConverters ve XAML
Bu konu, genel bir XAML dil özelliği olarak dizeden tür dönüştürmenin amacını tanıtır. .NET Framework'te TypeConverter sınıfı, XAML öznitelik kullanımında özellik değeri olarak kullanılabilen yönetilen bir özel sınıf için uygulamanın bir parçası olarak belirli bir amaca hizmet eder. Özel bir sınıf yazarsanız ve sınıfınızın örneklerinin XAML ayarlanabilir öznitelik değerleri olarak kullanılabilir olmasını istiyorsanız, sınıfınıza bir TypeConverterAttribute uygulamanız, özel bir TypeConverter sınıfı yazmanız veya her ikisini birden yapmanız gerekebilir.
Tür Dönüştürme Kavramları
XAML ve Dize Değerleri
Bir XAML dosyasında öznitelik değeri ayarladığınızda, bu değerin ilk türü saf metindeki bir dizedir. Double gibi diğer temel öğeler bile başlangıçta bir XAML işlemcisine yönelik metin dizeleridir.
Bir XAML işlemcisinin öznitelik değerini işlemek için iki bilgi parçasına ihtiyacı vardır. İlk bilgi parçası, ayarlanan özelliğin değer türüdür. Bir öznitelik değerini tanımlayan ve XAML'de işlenen herhangi bir dize, sonuçta bu tür bir değere dönüştürülmelidir veya çözümlenmelidir. Değer, XAML ayrıştırıcısı tarafından anlaşılan bir ilkel ise (sayısal bir değer gibi), dizenin doğrudan dönüştürülmesi denenmiştir. Değer bir sabit listesiyse, bu sabit listesi içindeki adlandırılmış sabitle bir ad eşleşmesi olup olmadığını denetlemek için dize kullanılır. Değer, ayrıştırıcı tarafından anlaşılan bir temel öğe veya numaralandırma değilse, söz konusu türün türün bir örneğini veya dönüştürülen dizeyi temel alan bir değer sağlayabilmesi gerekir. Bu, bir tür dönüştürücü sınıfı belirtilerek yapılır. Tür dönüştürücüsü, hem XAML senaryosu hem de .NET kodundaki kod çağrıları için başka bir sınıfın değerlerini sağlamaya yönelik bir yardımcı sınıftır.
XAML'de Mevcut Tür Dönüştürme Davranışını Kullanma
XAML'nin altında yatan kavramları tanımanıza bağlı olarak, farkında olmadan temel uygulama XAML'sinde tür dönüştürme davranışını zaten kullanıyor olabilirsiniz. Örneğin WPF, Pointtüründe bir değer alan yüzlerce özelliği tanımlar.
Point, iki boyutlu koordinat alanında koordinatı açıklayan bir değerdir ve gerçekten iki önemli özelliği vardır: X ve Y. XAML'de bir nokta belirttiğinizde, bunu sağladığınız X ve Y değerleri arasında sınırlayıcı (genellikle virgül) olan bir dize olarak belirtirsiniz. Örneğin: <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"/>
.
Bu basit Point türü ve XAML'deki basit kullanımı bile bir tür dönüştürücü içerir. Bu durumda bu, PointConvertersınıfıdır.
Sınıf düzeyinde tanımlanan Point için tür dönüştürücüsü, Pointalan tüm özelliklerin işaretleme dilindeki kullanımlarını kolaylaştırır. Tür dönüştürücüsü olmadan burada, daha önce gösterilen aynı örnek için aşağıdaki çok daha ayrıntılı işaretlemeye ihtiyacınız olacaktır.
<LinearGradientBrush>
<LinearGradientBrush.StartPoint>
<Point X="0" Y="0"/>
</LinearGradientBrush.StartPoint>
<LinearGradientBrush.EndPoint>
<Point X="1" Y="1"/>
</LinearGradientBrush.EndPoint>
</LinearGradientBrush>
Tür dönüştürme dizesinin mi yoksa daha ayrıntılı eşdeğer bir söz diziminin mi kullanılacağı genellikle bir kodlama stili seçimidir. XAML araç iş akışınız, değerlerin nasıl ayarlandığını da etkileyebilir. Bazı XAML araçları, tasarımcı görünümlerine veya kendi serileştirme mekanizmasına geri döndürmenin daha kolay olması nedeniyle işaretlemenin en ayrıntılı biçimini üretme eğilimindedir.
Var olan tür dönüştürücüleri, genellikle WPF ve .NET Framework türlerinde, bir sınıfa (veya özelliğe) uygulanmış bir TypeConverterAttribute'nın varlığı denetlenerek bulunabilir. Bu öznitelik, XAML amacıyla ve potansiyel olarak diğer amaçlarla bu türdeki değerler için destekleyici tür dönüştürücüsü olan sınıfı adlandıracaktır.
Tür Dönüştürücüleri ve İşaretlemeyi Genişletmeleri
İşaretlem uzantıları ve tür dönüştürücüleri, XAML işlemci davranışı ve uygulandıkları senaryolar açısından ortogonal rolleri doldurur. Biçimlendirme uzantısı kullanımları için bağlam mevcut olsa da, biçimlendirme uzantısının değer sağladığı özelliklerin tür dönüştürme davranışı genellikle biçimlendirme uzantısı uygulamalarında kontrol edilmez. Başka bir deyişle, biçimlendirme uzantısı ProvideValue
çıktısı olarak bir metin dizesi döndürse bile, belirli bir özellik veya özellik değer türüne uygulandığı gibi bu dizede tür dönüştürme davranışı çağrılmaz, Genellikle, işaretleme uzantısının amacı bir dizeyi işlemek ve herhangi bir tür dönüştürücüsü olmadan bir nesne döndürmektir.
Tür dönüştürücüsü yerine işaretleme uzantısının gerekli olduğu yaygın durumlardan biri, zaten var olan bir nesneye başvuru yapmaktır. En iyi durumda, durum bilgisi olmayan bir tür dönüştürücü yalnızca yeni bir örnek oluşturabilir ve bu da istenmeyebilir. biçimlendirme uzantıları hakkında daha fazla bilgi için bkz. biçimlendirme uzantıları ve WPF XAML.
Yerel Tür Dönüştürücüleri
XAML ayrıştırıcısının WPF ve .NET Framework uygulamasında, yerel tür dönüştürme işlemesi olan bazı türler vardır, ancak geleneksel olarak ilkel olarak düşünülebilecek türler değildir. Bu türe örnek olarak DateTime. Bunun nedeni. .NET Framework mimarisinin nasıl çalıştığına bağlıdır: DateTime türü, .NET'teki en temel kitaplık olan mscorlib'de tanımlanır. DateTime, bağımlılık (TypeConverterAttribute Sistem'den) ekleyen başka bir derlemeden gelen bir öznitelikle ilişkilendirilmesine izin verilmez, bu nedenle attributing tarafından normal tür dönüştürücü bulma mekanizması desteklenmez. Bunun yerine, XAML ayrıştırıcısı, bu tür yerel işleme gerektiren türlerin bir listesine sahiptir ve bunları gerçek ilkellerin nasıl işlendiğine benzer şekilde işler. (DateTime durumunda bu, Parseçağrısı içerir.)
Tür Dönüştürücü Uygulaması
TypeConverter
Daha önce verilen Point örnekte sınıf PointConverter belirtildi. XAML'nin .NET uygulamaları için, XAML amaçları için kullanılan tüm tür dönüştürücüleri, TypeConvertertemel sınıfından türetilen sınıflardır. TypeConverter sınıfı, XAML'nin varlığından önceki .NET Framework sürümlerinde mevcut; özgün kullanımlarından biri, görsel tasarımcılarda özellik iletişim kutuları için dize dönüştürme sağlamaktı. XAML için, TypeConverter rolü, dize öznitelik değerini ayrıştırma ve büyük olasılıkla belirli bir nesne özelliğinin çalışma zamanı değerini öznitelik olarak serileştirme için bir dizeye geri işlemeyi sağlayan dizeden dizeye ve dizeden dönüştürmelere yönelik temel sınıf olacak şekilde genişletilir.
TypeConverter, XAML işleme amacıyla dizelere ve dizelerden dönüştürme için uygun dört üye tanımlar:
Bunlardan en önemli yöntem ConvertFrom. Bu yöntem, giriş dizesini gerekli nesne türüne dönüştürür. Açıkça belirtmek gerekirse, ConvertFrom yöntemi çok daha geniş bir tür aralığını dönüştürücüün hedef türüne dönüştürmek için uygulanabilir ve bu nedenle çalışma zamanı dönüştürmelerini destekleme gibi XAML'nin ötesine uzanan amaçlara hizmet edebilir, ancak XAML amacıyla yalnızca önemli olan String girişi işleyebilen kod yoludur.
Sonraki en önemli yöntem ConvertTo. Bir uygulama bir işaretleme gösterimine dönüştürülürse (örneğin, dosya olarak XAML'ye kaydedilirse), ConvertTo işaretleme gösterimi oluşturmakla sorumludur. Bu durumda, XAML için önemli olan kod yolu, String'in destinationType
'sını geçtiğiniz zamandır.
CanConvertTo ve CanConvertFrom, bir hizmet TypeConverter uygulamasının özelliklerini sorguladığında kullanılan destek yöntemleridir. Dönüştürücünüzün eşdeğer dönüştürme yöntemlerinin desteklediği türe özgü durumlar için true
döndürmek için bu yöntemleri uygulamanız gerekir. XAML amacıyla bu genellikle String türü anlamına gelir.
XAML için Kültür Bilgileri ve Tür Dönüştürücüleri
Her TypeConverter uygulaması, bir dönüştürmede geçerli sayılacak bir dizenin ne olduğunu kendi bakış açısına göre yorumlayabilir ve ayrıca parametre olarak verilen tür açıklamasını kullanabilir veya görmezden gelebilir. Kültür ve XAML tür dönüştürme konusunda önemli bir husus vardır. Öznitelik değerleri olarak yerelleştirilebilir dizelerin kullanılması XAML tarafından tamamen desteklenir. Ancak bu yerelleştirilebilir dizeyi belirli kültür gereksinimlerine sahip tür dönüştürücü girişi olarak kullanmak desteklenmez, çünkü XAML öznitelik değerleri için tür dönüştürücüleri, en-US
kültürü kullanarak mutlaka sabit dil ayrıştırma davranışı gerektirir. Bu kısıtlamanın tasarım nedenleri hakkında daha fazla bilgi için XAML dil belirtimine ([MS-XAML]başvurmalısınız.
Kültürün sorun olabileceği bir örnek olarak, bazı kültürler sayılar için ondalık ayırıcı olarak virgül kullanır. Bu durum, WPF XAML tür dönüştürücülerinin çoğunun sahip olduğu davranışla çakışır, çünkü bu dönüştürücüler, sınırlayıcı olarak virgül kullanmayı içerir (ortak X,Y formu veya virgülle ayrılmış listeler gibi tarihi öncüllere dayanarak). Çevresindeki XAML'de bir kültürü geçirmek (Language
veya xml:lang
sl-SI
kültürüne ayarlamak, bu şekilde ondalık için virgül kullanan bir kültür örneği) sorunu çözmez.
ConvertFrom yönteminin uygulanması
XAML'yi destekleyen bir TypeConverter uygulaması olarak kullanılabilir olması için, bu dönüştürücü için ConvertFrom yöntemi bir dizeyi value
parametresi olarak kabul etmelidir. Dize geçerli biçimdeyse ve TypeConverter uygulaması tarafından dönüştürülebiliyorsa, döndürülen nesnenin özelliği tarafından beklenen türe dönüştürmeyi desteklemesi gerekir. Aksi takdirde, ConvertFrom uygulaması null
döndürmelidir.
Her TypeConverter uygulaması, farklı bir yorumla, bir dönüşüm için geçerli bir dizeyi neyin oluşturduğunu belirleyebilir ve ayrıca parametre olarak sağlanan tür açıklamasını veya kültür bağlamlarını kullanabilir ya da göz ardı edebilir. Ancak, WPF XAML işleme mekanizması tüm durumlarda tür açıklama bağlamına değerleri aktarmayabilir ve xml:lang
'e göre kültürel ayarları geçirmeyebilir.
Not
Dize biçiminizin olası bir öğesi olarak özellikle {, küme ayracı karakterlerini kullanmayın. Bu karakterler, bir işaretleme uzantısı dizisi için giriş ve çıkış olarak ayrılmıştır.
ConvertTo İşlevini Uygulama
ConvertTo potansiyel olarak serileştirme desteği için kullanılır. Özel türünüz ve tür dönüştürücüsü için ConvertTo aracılığıyla serileştirme desteği mutlak bir gereksinim değildir. Ancak, bir denetim uyguluyorsanız veya serileştirmesini sınıfınızın özelliklerinin veya tasarımının bir parçası olarak kullanıyorsanız, ConvertTouygulamanız gerekir.
XAML'yi destekleyen bir TypeConverter uygulaması olarak kullanılabilir olması için, bu dönüştürücü için ConvertTo yöntemi, value
parametresi olarak desteklenen türün (veya değerin) bir örneğini kabul etmelidir.
destinationType
parametresi Stringtürü olduğunda, döndürülen nesne Stringolarak yayınlanmalıdır. Döndürülen dize, value
serileştirilmiş değerini temsil etmelidir. İdeal olarak, seçtiğiniz serileştirme biçimi, bu dize önemli bilgi kaybı olmadan aynı dönüştürücü ConvertFrom uygulamasına geçirildiyse aynı değeri oluşturabilmelidir.
Değer serileştirilemiyorsa veya dönüştürücü serileştirmeyi desteklemiyorsa, ConvertTo uygulaması null
döndürmelidir ve bu durumda özel durum oluşturmasına izin verilir. Ancak özel durumlar oluşturursanız, CanConvertTo uygulamanızın bir parçası olarak o dönüştürmeyi kullanamama durumunu bildirmelisiniz; böylece özel durumlardan kaçınmak için öncelikle CanConvertTo ile kontrol etmenin en iyi uygulama olduğu desteklenir.
destinationType
parametresi Stringtüründe değilse kendi dönüştürücü işlemenizi seçebilirsiniz. Genellikle, en temel ConvertTo'da belirli bir özel durumu tetikleyen temel uygulama işlemesine geri dönersiniz.
CanConvertTo Uygulamasını Yapma
CanConvertTo uygulamanız, Stringtüründen olan destinationType
için true
döndürmeli ve aksi durumda temel uygulamanın işleyişine bırakmalıdır.
CanConvertFrom'un Uygulanması
CanConvertFrom uygulamanız, Stringtüründe olan sourceType
için true
döndürmeli ve aksi takdirde temel uygulamaya yönlendirmelidir.
TypeConverterAttribute Uygulaması
Özel tür dönüştürücünüzün bir XAML işlemcisi tarafından özel bir sınıf için eylem türü dönüştürücüsü olarak kullanılabilmesi için sınıf tanımınıza TypeConverterAttribute uygulamanız gerekir. özniteliği aracılığıyla belirttiğiniz ConverterTypeName, özel tür dönüştürücünüzün tür adı olmalıdır. Bu öznitelik uygulandığında, bir XAML işlemcisi özellik türünün özel sınıf türünüzü kullandığı değerleri işlediğinde, dizeleri girip nesne örneklerini döndürebilir.
Ayrıca özellik başına bir tür dönüştürücü de sağlayabilirsiniz. Sınıf tanımına bir TypeConverterAttribute uygulamak yerine, bunu bir özellik tanımına (içindeki get
/set
uygulamalarına değil ana tanım) uygulayın. Özelliğin türü, özel tür dönüştürücünüz tarafından işlenen türle eşleşmelidir. Bu öznitelik uygulandığında, bir XAML işlemcisi bu özelliğin değerlerini işlediğinde, giriş dizelerini işleyebilir ve nesne örnekleri döndürebilir. Özellik başına tür dönüştürücü tekniği, Microsoft .NET Framework'ten veya sınıf tanımını denetleyemeyeceğiniz ve orada bir TypeConverterAttribute uygulayamadığınız başka bir kitaplıktan özellik türü kullanmayı seçerseniz özellikle yararlıdır.
Ayrıca bkz.
.NET Desktop feedback