TypeConverters ve XAML
Bu konu, dizeden Genel XAML dil özelliği olarak tür dönüştürme amacını tanıtır. .NET Framework, TypeConverter sınıfı, XAML öznitelik kullanımında özellik değeri olarak kullanılabilecek yönetilen ö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 uygulama uygulamanız TypeConverterAttribute , özel bir TypeConverter sınıf yazmanız veya her ikisini de yapmanız gerekebilir.
Tür dönüştürme kavramları
XAML ve dize değerleri
XAML dosyasında bir öznitelik değeri ayarladığınızda, bu değerin başlangıç türü, saf metindeki bir dizedir. Gibi diğer temel öğeler Double , BIR XAML işlemcisine başlangıçta metin dizeleridir.
XAML işlemcisi, bir öznitelik değerini işlemek için iki bilgi parçasına ihtiyaç duyuyor. İlk bilgi parçası, ayarlanmakta olan özelliğin değer türüdür. Bir öznitelik değerini tanımlayan ve XAML 'de işlenen herhangi bir dize, sonunda, son olarak o türdeki bir değere dönüştürülmelidir veya çözümlenmelidir. Değer, XAML ayrıştırıcısı (sayısal değer gibi) tarafından anlaşılan bir temel ise, dizenin doğrudan dönüştürülmesine denenir. Değer bir sabit listesi ise, dize söz konusu Numaralandırmadaki adlandırılmış bir sabityle bir ad eşleşmesi denetlemek için kullanılır. Değer, ayrıştırıcının anlaşılmaz veya bir numaralandırma değilse, söz konusu tür, dönüştürülmüş bir dizeye göre türün bir örneğini veya bir değerini sağlayabilmelidir. Bu, bir tür dönüştürücü sınıfı belirterek yapılır. Tür dönüştürücüsü etkin bir şekilde başka bir sınıfın değerlerini sağlamak için, hem XAML senaryosu hem de .NET kodundaki kod çağrıları için bir yardımcı sınıftır.
XAML 'de varolan tür dönüştürme davranışını kullanma
Temel alınan XAML kavramlarıyla ilgili olarak, temel uygulama XAML 'de tür dönüştürme davranışını gerçekleştirmeden önce bu yöntemi zaten kullanıyor olabilirsiniz. Örneğin, WPF, türünde bir değer alan, yüzlerce yüzlerce özelliği tanımlar Point . Point, İki boyutlu koordinat alanında bir koordinatı tanımlayan bir değerdir ve aslında yalnızca iki önemli özelliğe sahiptir: X ve Y . XAML 'de bir nokta belirttiğinizde, bunu X sağladığınız ve değerleri arasında sınırlayıcı (genellikle virgül) olan bir dize olarak belirtirsiniz Y . Örneğin: <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"/>.
XAML 'de bu basit türü Point ve basit kullanımı bile bir tür Dönüştürücüsü içerir. Bu durumda, sınıfı PointConverter .
PointSınıf düzeyinde tanımlanan tür dönüştürücüsü, tüm özelliklerin biçimlendirme kullanımlarını basitleştirir Point . Burada bir tür dönüştürücüsü olmadan, daha önce gösterilen örnek için aşağıdaki çok daha ayrıntılı biçimlendirme gerekir:
<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ı bir eşdeğer sözdiziminin mi kullanılacağı genellikle 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 daha kolay dönmek için biçimlendirmenin en ayrıntılı biçimini yaymaya eğilimlidir.
varolan tür dönüştürücüler, uygulanan varlık için bir sınıf (veya özellik) denetleyerek genellikle WPF ve .NET Framework türlerinde bulunabilir TypeConverterAttribute . Bu öznitelik, bu türün değerleri için destekleme türü Dönüştürücüsü olan sınıfı, XAML amaçları ve potansiyel olarak başka amaçlar için olarak adlandırın.
Tür dönüştürücüler ve biçimlendirme uzantıları
Biçimlendirme uzantıları ve tür dönüştürücüler, XAML işlemci davranışı ve uygulandıkları senaryolar bakımından dikgen rolleri doldurur. Bağlam biçimlendirme uzantısı kullanımları için kullanılabilir olsa da, biçimlendirme uzantısının bir değer sağladığı özelliklerin dönüştürme davranışı genellikle biçimlendirme uzantısı uygulamalarında denetlenmez. Diğer bir deyişle, biçimlendirme uzantısı çıkış olarak bir metin dizesi döndürse bile, ProvideValue Bu dizeye belirli bir özelliğe uygulanan veya özellik değeri türüne uygulanan şekilde tür dönüştürme davranışı çağrılmaz, genellikle bir biçimlendirme 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ürmek olur.
Bir tür dönüştürücüsü yerine bir biçimlendirme uzantısının gerekli olduğu yaygın bir durum, zaten var olan bir nesneye başvuru yapmak olur. En iyi durum bilgisi olmayan tür dönüştürücüsü yalnızca yeni bir örnek oluşturabilir, 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üler
WPF ve XAML ayrıştırıcısının .NET Framework uygulamasında, yerel tür dönüştürme işlemesi olan belirli türler vardır, ancak temel olarak genel olarak olabilecek türler değildir. Bu tür bir örnek vardır DateTime . bunun nedeni, .NET Framework mimarisinin nasıl çalıştığına bağlıdır: tür, DateTime .net 'teki en temel kitaplık olan mscorlib 'te tanımlanmıştır. DateTime , bağımlılık tanıtan başka bir derlemeden gelen bir öznitelikle ilişkilendirilemez ( TypeConverterAttribute sistemdir), bu nedenle, Attributing tarafından her zamanki tür dönüştürücüsü bulma mekanizması desteklenemez. Bunun yerine, XAML ayrıştırıcısı böyle bir yerel işleme ihtiyacı olan türlerin bir listesini içerir ve bunları doğru temel elemanların işlenme şekli gibi işler. (Bu durum durumunda DateTime öğesine bir çağrı içerir Parse .)
Tür Dönüştürücüsü uygulama
TypeConverter
PointDaha önce verilen örnekte, sınıfı PointConverter bahsedildi. XAML .NET uygulamaları için XAML için kullanılan tüm tür dönüştürücüler, temel sınıftan türetilen sınıflardır TypeConverter . TypeConvertersınıf, XAML varlığını önündeki .NET Framework sürümlerinde vardı; özgün kullanımlarından biri, visual designer 'daki özellik iletişimleri için dize dönüştürmesi sağlamaktır. XAML için, rolü TypeConverter bir dize özniteliği değerini ayrıştırmayı sağlayan-String ve from-String dönüştürmeleri için temel sınıf olacak şekilde genişletilir ve muhtemelen bir öznitelik olarak serileştirme için belirli bir nesne özelliğinin çalışma zamanı değerini bir dizeye geri işliyor.
TypeConverter XAML işleme amaçları için dizeden ve dizeden dönüştürmeye uygun dört üyeyi tanımlar:
Bu, en önemli Yöntem ' dir ConvertFrom . Bu yöntem, giriş dizesini gereken nesne türüne dönüştürür. Kesinlikle konuşuyor, ConvertFrom Yöntem çok daha geniş bir tür türü dönüştürücünün amaçlanan hedef türüne dönüştürmek için uygulanabilir ve bu nedenle, çalışma zamanı dönüştürmeleri destekleme gıbı xaml 'in ötesine genişletecek, ancak xaml amacıyla, yalnızca önemli bir girişi işleyebilen kod yoludur String .
En önemli bir sonraki Yöntem ConvertTo . Bir uygulama, biçimlendirme gösterimine dönüştürülürse (örneğin, XAML 'ye bir dosya olarak kaydedilirse), ConvertTo biçimlendirme temsili üretilmekten sorumludur. Bu durumda, XAML için önemli olan kod yolu, bir ' ı geçirdiğinizde olur destinationTypeString .
CanConvertTo ve, CanConvertFrom bir hizmet uygulamanın yeteneklerini sorguladığında kullanılan destek yöntemleridir TypeConverter . Bu yöntemleri, true dönüştürücünün eşit dönüştürme yöntemlerinin desteklediği türe özgü durumlar için döndürmek üzere uygulamalısınız. XAML amaçları için bu genellikle tür anlamına gelir String .
XAML için kültür bilgileri ve tür dönüştürücüler
Her TypeConverter uygulamanın, dönüştürme için geçerli bir dize oluşturduğunu belirlemek için kendi yorumu olabilir ve ayrıca parametre olarak geçirilen tür açıklaması ' nı kullanabilir veya yoksayabilir. Kültür ve XAML türü dönüşümle ilgili önemli bir göz vardır. Öznitelik değerleri olarak yerelleştirilebilir dizelerin kullanılması XAML tarafından tamamen desteklenir. Ancak, XAML öznitelik değerleri için tür dönüştürücülerinin, kültür kullanılarak sabit dil ayrıştırma davranışı içerdiğinden, bu yerelleştirilebilir dizenin tür dönüştürücüsü girdisi olarak kullanılması desteklenmez en-US . 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üre bir sorun olabilecek bir örnek olarak, bazı kültürler sayılar için ondalık nokta sınırlayıcıları olarak virgül kullanır. Bu, WPF XAML tür dönüştürücülerinin çoğunun sahip olduğu davranışla çakışır. Bu, bir sınırlayıcı olarak virgül (ortak X, Y formu veya virgülle ayrılmış listeler gibi geçmiş etkileyenler temelinde) kullanır. Kapsayıcı XAML içindeki bir kültürü ( Language veya xml:langsl-SI kültürü, bu şekilde ondalık için bir virgül kullanan bir kültür örneği) bile, sorunu çözmez.
ConvertFrom uygulama
TypeConverterXaml 'yi destekleyen bir uygulama olarak kullanılabilmesi için, ConvertFrom Bu dönüştürücünün yöntemi parametre olarak bir dize kabul etmelidir value . Dize geçerli biçimeyse ve uygulama tarafından dönüştürülebileceğinden TypeConverter döndürülen nesne, özellik tarafından beklenen türe bir tür dönüştürmeyi desteklemelidir. Aksi takdirde, ConvertFrom uygulamanın dönmesi gerekir null .
Her TypeConverter uygulamanın, bir dönüştürme için geçerli bir dize oluşturduğunu belirlemek için kendi yorumu olabilir ve ayrıca parametre olarak geçirilen tür açıklaması ya da kültür bağlamlarını kullanabilir veya yoksayabilir. Ancak, WPF XAML işleme değerleri her durumda tür açıklaması bağlamına geçirmeyebilir ve ayrıca, temelinde kültürü geçirmeyebilir xml:lang .
Not
Dize biçiminizdeki olası bir öğe olarak, özellikle {, küme ayracı karakterlerini kullanmayın. Bu karakterler bir işaretleme uzantısı sırası için giriş ve çıkış olarak ayrılmıştır.
ConvertTo uygulama
ConvertTo , serileştirme desteği için büyük olasılıkla kullanılıyor. ConvertToÖzel tür ve tür Dönüştürücüsü için serileştirme desteği, mutlak bir gereksinim değildir. Ancak, bir denetim uyguladıysanız veya sınıfınızın özelliklerinin veya tasarımının bir parçası olarak serileştirilmesi kullanıyorsanız, uygulamanız gerekir ConvertTo .
TypeConverterXaml 'yi destekleyen bir uygulama olarak kullanılabilmesi için, ConvertTo Bu dönüştürücünün yöntemi parametre olarak desteklenmekte olan türün (veya bir değerin) bir örneğini kabul etmelidir value . destinationTypeParametre türü olduğunda String , döndürülen nesnenin olarak yayınlanamayacak olması gerekir String . Döndürülen dize, seri hale getirilmiş bir değeri temsil etmelidir value . İdeal olarak, seçtiğiniz seri hale getirme biçimi, bu dizenin ConvertFrom aynı dönüştürücünün uygulamasına geçirilmesi durumunda, önemli bir bilgi kaybı olmadan aynı değeri üretmeye sahip olmalıdır.
Değer seri hale getirilemez veya dönüştürücü Serileştirmeyi desteklemiyorsa, ConvertTo uygulamanın dönmesi gerekir null ve bu durumda bir özel durum oluşturulmasına izin verilir. Ancak özel durumlar oluşturuyorsanız, bu dönüştürmeyi uygulamanızın bir parçası olarak kullanmayı bildirmelisiniz, CanConvertTo böylelikle özel durumların önüne geçmek için en iyi şekilde kontrol altına almanız gerekir CanConvertTo .
destinationTypeParametre türü değilse String , kendi dönüştürücü işleme seçeneğini belirleyebilirsiniz. Genellikle, temelde ConvertTo belirli bir özel durumu oluşturan temel uygulama işlemeye dönülür.
Canconvertuygulama
CanConvertToUygulamanız true türü için döndürmelidir destinationTypeString , aksi takdirde temel uygulamaya ertelemelidir.
Canconvertuygulama
CanConvertFromUygulamanız true türü için döndürmelidir sourceTypeString , aksi takdirde temel uygulamaya ertelemelidir.
TypeConverterAttribute uygulanıyor
Özel tür dönüştürücüsünün bir XAML işlemcisi tarafından özel bir sınıf için davranan tür dönüştürücüsü olarak kullanılabilmesi için, öğesini TypeConverterAttribute sınıf tanımınıza uygulamanız gerekir. ConverterTypeNameÖzniteliği aracılığıyla belirttiğiniz, özel tür dönüştürücünün tür adı olmalıdır. Bu öznitelik uygulandığında, XAML işlemcisi özellik türünün özel sınıf türünü kullandığı değerleri işlediğinde, dizeleri belirtebilir ve nesne örnekleri döndürebilir.
Ayrıca özellik başına bir tür dönüştürücüsü sağlayabilirsiniz. Sınıf tanımına TypeConverterAttribute bir uygulamak yerine, bunu bir özellik tanımına (içindeki uygulamalara değil ana get/set tanım) uygulayabilirsiniz. Özelliğin türü, özel tür dönüştürücüsü tarafından işlenen türle eşleşmesi gerekir. Bu öznitelik uygulandığında, XAML işlemcisi bu özelliğin değerlerini işleyene kadar giriş dizelerini işebilir ve nesne örneklerini dönüşebilir. Özellik başına tür dönüştürücü tekniği, Microsoft .NET Framework'den veya sınıf tanımını kontrol etmek için uygulayamayabilirsiniz başka bir kitaplıktan bir özellik türü kullanmayı seçerseniz TypeConverterAttribute özellikle yararlıdır.