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 sınıfı, TypeConverter XAML öznitelik kullanımında özellik değeri olarak kullanılabilecek 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 TypeConverter bir 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. gibi Double 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

Temel alınan XAML kavramlarını tanımanıza bağlı olarak, temel uygulama XAML'sinde farkında olmadan tür dönüştürme davranışını zaten kullanıyor olabilirsiniz. Örneğin WPF, türünde Pointbir değer alan yüzlerce özelliği tanımlar. APoint, iki boyutlu koordinat alanında bir koordinatı açıklayan bir değerdir ve gerçekten yalnızca iki önemli özelliği vardır: X ve Y. XAML'de bir nokta belirttiğinizde, bunu sağladığınız ve Y değerleri arasında X sınırlayıcı (genellikle virgül) olan bir dize olarak belirtirsiniz. Örneğin: <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"/>.

Bu basit türü Point ve XAML'deki basit kullanımı bile bir tür dönüştürücü içerir. Bu durumda sınıfıdır PointConverter.

sınıf düzeyinde tanımlanan tür Point dönüştürücüsü, alan Pointtüm özelliklerin işaretleme kullanımlarını kolaylaştırır. Burada bir tür dönüştürücüsü olmadan, 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. Tasarımcı görünümlerine veya kendi serileştirme mekanizmasına gidiş dönüş yapmak daha kolay olduğundan, bazı XAML araçları işaretlemenin en ayrıntılı biçimini yayma eğilimindedir.

Var olan tür dönüştürücüleri genellikle WPF ve .NET Framework türlerinde bir sınıfın (veya özelliğin) uygulanan TypeConverterAttributebir 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 kullanılabilse de, işaretleme uzantısının değer sağladığı özelliklerin tür dönüştürme davranışı genellikle işaretleme uzantısı uygulamalarında işaretlenmez. Başka bir deyişle, bir işaretleme uzantısı çıktı olarak ProvideValue 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, Genel olarak, 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 . İşaretlemeyi Genişletmeler 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ür bir türe örnek olarak .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'de tanımlanır. DateTime bir bağımlılığı tanıtan başka bir derlemeden gelen bir öznitelikle ilişkilendirilmesine izin verilmez (TypeConverterAttribute Sistemdendir), bu nedenle attributing tarafından normal tür dönüştürücü bulma mekanizması desteklenemez. 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. (Bu durumda DateTime için bir çağrı Parseiçerir.)

Tür Dönüştürücü Uygulama

TypeConverter

Point Daha önce verilen örnekte sınıfından PointConverter bahsedildi. XAML'nin .NET uygulamaları için, XAML amaçları için kullanılan tüm tür dönüştürücüleri, temel sınıfından TypeConvertertüretilen sınıflardır. sınıfı, TypeConverter XAML'nin varlığından önceki .NET Framework sürümlerinde vardı; özgün kullanımlarından biri görsel tasarımcılardaki özellik iletişim kutuları için dize dönüştürme sağlamaktı. XAML için rolü TypeConverter , bir dize öznitelik değerini ayrıştırmaya olanak tanıyan dizeden dizeye ve dizeden dönüştürmelere yönelik temel sınıf olacak şekilde genişletilir 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şler.

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öntemdir ConvertFrom. Bu yöntem, giriş dizesini gerekli nesne türüne dönüştürür. Açıkça belirtmek gerekirse, ConvertFrom yöntem ç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 amaçları için yalnızca önemli olan bir String girişi işleyebilen kod yoludur.

Sonraki en önemli yöntemdir 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, bir destinationType geçirmenizdir String .

CanConvertTo ve CanConvertFrom bir hizmet uygulamanın özelliklerini sorguladığında kullanılan destek yöntemleridir TypeConverter . Dönüştürücünüzün eşdeğer dönüştürme yöntemlerinin desteklediği türe özgü durumları döndürmek true için bu yöntemleri uygulamanız gerekir. XAML amacıyla, bu genellikle türü anlamına gelir String .

XAML için Kültür Bilgileri ve Tür Dönüştürücüleri

Her TypeConverter uygulama, bir dönüştürme için geçerli bir dize oluşturan şeyin kendi yorumuna sahip olabilir ve parametre olarak geçirilen tür açıklamasını da kullanabilir veya yoksayabilir. Kültür ve XAML türü dönüştürme ile ilgili önemli bir konu 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, kültürü kullanarak en-US 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, WPF XAML türü dönüştürücülerinin çoğunun sahip olduğu davranışla çakılır. Bu, sınırlayıcı olarak virgül kullanmaktır (ortak X,Y formu veya virgülle ayrılmış listeler gibi geçmiş etkileyenleri temel alır). Çevresindeki XAML'de bir kültür geçirmek bile (bu şekilde ondalık için virgül kullanan bir kültür örneği olan kültüre veya ayarına Languagexml:langsl-SI ) sorunu çözmez.

ConvertFrom Uygulama

XAML'yi destekleyen bir TypeConverter uygulama olarak kullanılabilir olması için, bu dönüştürücü yönteminin ConvertFrom parametre olarak bir dizeyi value kabul etmesi gerekir. Dize geçerli biçimdeyse ve uygulama tarafından TypeConverter dönüştürülebiliyorsa, döndürülen nesne özelliği tarafından beklenen türe dönüştürmeyi desteklemelidir. Aksi takdirde, ConvertFrom uygulama döndürmelidir null.

Her TypeConverter uygulama, bir dönüştürme için geçerli bir dize oluşturan şeyin kendi yorumuna sahip olabilir ve ayrıca parametre olarak geçirilen tür açıklamasını veya kültür bağlamlarını kullanabilir veya yoksayabilir. Ancak WPF XAML işlemesi her durumda tür açıklaması bağlamı için değer geçirmeyebilir ve ayrıca temelinde xml:langkültür geçirmeyebilir.

Dekont

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 Uygulama

ConvertTo serileştirme desteği için potansiyel olarak kullanılır. Özel türünüz ve onun tür dönüştürücüsü için aracılığıyla ConvertTo 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 uygulamanız ConvertTogerekir.

XAML'yi destekleyen bir TypeConverter uygulama olarak kullanılabilir olması için, ConvertTo bu dönüştürücü için yöntemin parametre olarak desteklenen türün (veya değerin) bir örneğini value kabul etmesi gerekir. destinationType parametresi türü Stringolduğunda, döndürülen nesne olarak Stringyayınlanabilir olmalıdır. Döndürülen dizenin serileştirilmiş değerini valuetemsil etmesi gerekir. İdeal olarak, seçtiğiniz serileştirme biçimi, bu dize önemli bilgi kaybı olmadan aynı dönüştürücü uygulamasına ConvertFrom geçirildiyse aynı değeri oluşturabilmelidir.

Değer serileştirilemiyorsa veya dönüştürücü serileştirmeyi desteklemiyorsa, ConvertTo uygulamanın döndürmesi nullgerekir ve bu durumda bir özel durum oluşturmasına izin verilir. Ancak özel durumlar oluşturursanız, özel durumları önlemek için önce ile CanConvertTo denetlemenin en iyi uygulamasının CanConvertTo desteklenmesi için bu dönüştürmenin uygulamanızın bir parçası olarak kullanılamadığını bildirmelisiniz.

Parametresi türünde StringdeğilsedestinationType, kendi dönüştürücü işlemenizi seçebilirsiniz. Genellikle, en temelde belirli bir özel durum oluşturan temel ConvertTo uygulama işlemeye geri dönersiniz.

CanConvertTo Uygulama

Uygulamanız CanConvertTo türü Stringiçin destinationType döndürmelidir true ve aksi takdirde temel uygulamaya ertelemelidir.

CanConvertFrom Uygulama

Uygulamanız CanConvertFrom türü Stringiçin sourceType döndürmelidir true ve aksi takdirde temel uygulamaya ertelemelidir.

TypeConverterAttribute Uygulama

Ö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 öğesini sınıf tanımınıza uygulamanız TypeConverterAttribute gerekir. ConverterTypeName Özniteliği aracılığıyla belirttiğiniz, ö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 uygulamak TypeConverterAttribute yerine, bunu bir özellik tanımına (içindeki uygulamalara değil get/set 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 buraya uygulayamayacağınız başka bir TypeConverterAttribute kitaplıktan özellik türü kullanmayı seçerseniz özellikle yararlıdır.

Ayrıca bkz.