XAML için tür Dönüştürücülerine genel bakış
Tür dönüştürücüler, XAML biçimlendirme içindeki bir dizeden bir nesne grafiğinde belirli nesnelere dönüştüren bir nesne yazıcı için arz mantığı sağlar. .NET XAML hizmetlerinde tür dönüştürücüsü öğesinden türetilen bir sınıf olmalıdır TypeConverter . Bazı dönüştürücüler XAML kayıt yolunu da destekler ve serileştirme biçimlendirmesinde bir nesneyi dize biçiminde seri hale getirmek için kullanılabilir. Bu konu, XAML 'deki tür dönüştürücülerinin nasıl ve ne zaman çağrılacağını açıklar ve metot geçersiz kılmaları için uygulama önerisi sağlar TypeConverter .
Tür dönüştürme kavramları
Aşağıdaki bölümlerde, XAML 'nin dizeleri nasıl kullandığı hakkında temel kavramlar ve .NET XAML Hizmetleri 'ndeki nesne yazıcılarının bir XAML kaynağında karşılaşılan bazı dize değerlerini işlemek için tür dönüştürücülerinin nasıl kullanıldığı açıklanmaktadır.
XAML ve dize değerleri
XAML dosyasında bir öznitelik değeri ayarladığınızda, bu değerin başlangıç türü genel anlamda bir dize ve bir XML anlamda dize özniteliği değeri olur. Gibi diğer temel öğeler de Double BIR XAML işlemcisine ilk olarak dizelerdir.
Çoğu durumda, bir XAML işlemcisinin bir öznitelik değerini işlemek için iki bilgi parçasına ihtiyacı vardır. İ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. Özniteliğin değeri bir numaralandırmaya başvuruyorsa, sağlanan dize, bu Numaralandırmadaki adlandırılmış bir sabit ile bir ad eşleşmesi için denetlenir. Değer, ayrıştırıcının anlamış bir temel veya sabit bir ad numaralandırmasından değilse, uygulanabilir tür, dönüştürülmüş bir dizeye dayalı bir değer veya başvuru sağlayabilmelidir.
Not
XAML dil yönergeleri tür dönüştürücülerini kullanmaz.
Tür dönüştürücüler ve biçimlendirme uzantıları
Biçimlendirme uzantısı kullanımları, özellik türünü ve diğer konuları kontrol etmeden önce bir XAML işlemcisi tarafından işlenmelidir. Örneğin, normalde bir öznitelik olarak ayarlanan bir özelliğin tür dönüştürmesi varsa, ancak belirli bir durumda biçimlendirme uzantısı kullanımı ile ayarlanırsa, biçimlendirme uzantısı davranışı önce işlenir. Biçimlendirme uzantısının gerekli olduğu yaygın bir durum, zaten var olan bir nesneye başvuru yapmak. Bu senaryo için, durum bilgisi olmayan bir tür dönüştürücüsü yalnızca yeni bir örnek oluşturabilir ve bu, istenmeyebilir. Biçimlendirme uzantıları hakkında daha fazla bilgi için bkz. xaml Için biçimlendirme uzantıları genel bakış.
Yerel tür dönüştürücüler
Windows Presentation Foundation (WPF) ve .net XAML hizmetleri uygulamalarında, yerel tür dönüştürme işlemesi olan belirli CLR türleri vardır. Ancak, bu CLR türleri temel öğeler olarak genel olarak düşünülmez. Bu tür bir örnek vardır DateTime . bunun bir nedeni .NET Framework mimarinin nasıl çalıştığına yöneliktir: tür, DateTime .net 'teki en temel kitaplık olan mscorlib 'de tanımlanmıştır. DateTime bağımlılık tanıtan başka bir derlemeden gelen bir öznitelikle ilişkilendirilememesine izin verilmez ( TypeConverterAttribute sistem). 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ı yerel işleme ihtiyacı olan türlerin bir listesini içerir ve bu türleri gerçek temel elemanların işlenme biçimine benzer şekilde işler. DateTimeBu durumda, bu işlem öğesine bir çağrı içerir Parse .
Tür Dönüştürücüsü uygulama
Aşağıdaki bölümlerde sınıfının API 'SI ele alınmaktadır TypeConverter .
TypeConverter
.NET XAML Hizmetleri ' nin altında, XAML için kullanılan tüm tür dönüştürücüler taban sınıftan türetilen sınıflardır TypeConverter . TypeConvertersınıf, XAML silinmeden önce .NET Framework sürümlerinde vardı; özgün senaryolardan biri, TypeConverter visual designer 'daki özellik düzenleyicileri için dize dönüştürmesi sağlamaktır.
XAML için, rolü TypeConverter genişletilir. XAML amaçları için, TypeConverter belirli-dize ve dize dönüştürmelerinde destek sağlamak için temel sınıftır. From-String, XAML 'den bir dize özniteliği değeri ayrıştırmayı mümkün. -String, belirli bir nesne özelliğinin çalışma zamanı değerini seri hale getirme için XAML içindeki bir özniteliğe geri işlemeye olanak sağlayabilir.
TypeConverter XAML işleme amaçları için-String ve from-String ' i dönüştürmeye uygun dört üyeyi tanımlar:
Bu üyelerin en önemli yöntemi, ConvertFrom giriş dizesini gereken nesne türüne dönüştüren ' dir. ConvertFromYöntemi, dönüştürücünün amaçlanan hedef türüne daha geniş bir tür dönüştürmek için uygulanabilir. Bu nedenle, çalışma zamanı dönüştürmelerini destekleme gibi XAML 'in ötesine genişleyen amaçlar sunabilir. Ancak, XAML kullanımı için yalnızca bir girişi işleyecede kod yolu String önemlidir.
İkinci en önemli Yöntem ConvertTo . Bir uygulama, biçimlendirme gösterimine dönüştürülürse (örneğin, XAML 'ye bir dosya olarak kaydedilirse), bir ConvertTo xaml metin yazıcısının bir biçimlendirme temsili oluşturmak için daha büyük senaryoya dahil edilir. Bu durumda, XAML için önemli kod yolu çağıranın bir ' ı geçirme yoludur 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 uygulama, dönüştürme için geçerli bir dize olduğunu benzersiz bir şekilde yorumlayabilir ve ayrıca parametre olarak geçirilen tür açıklamasını kullanabilir veya yoksayabilir. Kültür ve XAML türü dönüştürme için önemli bir göz önünde bulundurmanız gerekenler şunlardır: öznitelik değerleri olarak yerelleştirilebilir dizeler kullanılması XAML tarafından desteklenmekle birlikte, bu yerelleştirilebilir dizeleri belirli kültür gereksinimlerine sahip tür dönüştürücüsü girişi olarak kullanamazsınız. Bu sınırlama, XAML öznitelik değerleri için tür dönüştürücülerinin kültür kullanan sabit dil XAML işleme davranışına sahip olması gerektiğini içerir en-US . Bu kısıtlamanın tasarım nedenleri hakkında daha fazla bilgi için bkz. XAML dil belirtimi ([ms-xaml]) veya WPF Genelleştirme ve yerelleştirme genel bakış.
Kültüre bir sorun olabilecek bir örnek olarak, bazı kültürler dize biçimindeki sayılar için ondalık nokta sınırlayıcısı olarak bir nokta yerine virgül kullanır. Bu kullanım, çok sayıda mevcut tür dönüştürücülerinin sahip olduğu ve sınırlayıcı olarak virgül kullanmanın olduğu davranış ile çakışıyor. Bir kültürü xml:lang çevreleyen XAML içinde geçirme 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 bir biçimeyse ve uygulama tarafından dönüştürülemiyorsa 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 uygulama, dönüştürme için geçerli bir dize oluşturduğunu benzersiz bir şekilde yorumlayabilir ve ayrıca parametre olarak geçirilen tür açıklaması veya 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
Parantez ( {} ), özellikle de açma küme ayracı ({) dize biçiminizdeki bir öğe olarak kullanmayın. Bu karakterler bir işaretleme uzantısı sırası için giriş ve çıkış olarak ayrılmıştır.
Tür dönüştürücüsünün .NET XAML Hizmetleri nesne yazıcısından bir XAML hizmetine erişimi olması gerektiğinde bir özel durum oluşturmak için uygundur, ancak GetService bağlamda gerçekleştirilen çağrının bu hizmeti döndürmez.
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 desteklenen 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 serileştirme biçimi, bu dizenin aynı dönüştürücünün uygulamasına geçirilmesiyle aynı değeri ConvertFrom , önemli ölçüde bilgi kaybı olmadan oluşturabilebilmelidir.
Değer seri hale getirilemez veya dönüştürücü Serileştirmeyi desteklemiyorsa, ConvertTo uygulama döndürmelidir null ve bir özel durum oluşturabilir. Ancak, özel durumlar oluşturuyorsanız, bu dönüştürmeyi uygulamanızın bir parçası olarak kullanmayı, CanConvertTo özel durumların önüne geçmek için en iyi şekilde denetim altına almanız gerektiğini bildirmelisiniz CanConvertTo .
destinationTypeParametre türü değilse String , kendi dönüştürücü işleme seçeneğini belirleyebilirsiniz. Genellikle temel uygulama işlemeye döndürürseniz, temel içinde ConvertTo belirli bir özel durum yükseltilir.
Tür dönüştürücüsünün .NET XAML Hizmetleri nesne yazıcısından bir XAML hizmetine erişimi olması gerektiğinde bir özel durum oluşturmak için uygundur, ancak GetService bağlamda gerçekleştirilen çağrının bu hizmeti döndürmez.
Canconvertuygulama
CanConvertFromUygulamanız true türü için döndürmelidir sourceTypeString , aksi takdirde temel uygulamaya ertelemelidir. ' Den özel durumlar atamayın CanConvertFrom .
Canconvertuygulama
CanConvertToUygulamanız true türü için döndürmelidir destinationTypeString , aksi takdirde temel uygulamaya ertelemelidir. ' Den özel durumlar atamayın CanConvertTo .
TypeConverterAttribute uygulanıyor
Özel tür dönüştürücüsünün .NET XAML Hizmetleri tarafından özel bir sınıf için davranan tür dönüştürücüsü olarak kullanılması için, ' yi 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 özniteliği uygularsanız, bir 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 bir uygulamak yerine TypeConverterAttribute , bunu bir özellik tanımına (Ana tanım, get/set içindeki uygulamaları değil) uygulayın. Özelliğin türü, özel tür dönüştürücülü 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'dan 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 yararlıdır.
Özel bir ekli üye için tür dönüştürme davranışı sağlamak için, ekli üye TypeConverterAttributeGet için uygulama deseninin erişimci yöntemine uygulanır.
İşaretleme Uzantısı Uygulamasından Hizmet Sağlayıcısı Bağlamına Erişme
Kullanılabilir hizmetler herhangi bir değer dönüştürücü için aynıdır. Fark, her değer dönüştürücünün hizmet bağlamını nasıl aldığıdır. Hizmetlere ve kullanılabilir hizmetlere erişim, XAML için Tür Dönüştürücüleri ve İşaretleme Uzantıları konu başlığı altında belgelenmiştir.
XAML Düğüm Akışında Tür Dönüştürücüleri
XAML düğüm akışıyla çalışıyorsanız, tür dönüştürücüsünün eylemi veya bitiş sonucu henüz yürütülmez. Bir yükleme yolunda, yüklemek için sonunda tür dönüştürmesi gereken öznitelik dizesi, başlangıç üyesi ve son üye içinde metin değeri olarak kalır. Bu işlem için sonunda gerekli olan tür dönüştürücü özelliği kullanılarak XamlMember.TypeConverter belirlenebilecek. Ancak, 'den geçerli bir değer elde etmek, temel alınan üye aracılığıyla bu tür bilgilere erişen bir XAML şema bağlamına veya üyenin kullandığı nesne değerinin türüne XamlMember.TypeConverter sahip olur. Tür eşlemesi ve bir dönüştürücü örneği oluşturma gerektirdiği için tür dönüştürme davranışının iptali için XAML şema bağlamı da gerekir.