Share via


XAML için tür dönüştürücülerine genel bakış

Tür dönüştürücüleri, XAML işaretlemesindeki bir dizeden nesne grafı içindeki belirli nesnelere dönüştüren bir nesne yazıcı için mantık sağlar. .NET XAML Hizmetleri'nde tür dönüştürücüsü öğesinden TypeConvertertüretilen bir sınıf olmalıdır. Bazı dönüştürücüler XAML kaydetme yolunu da destekler ve serileştirme işaretlemesinde bir nesneyi dize biçiminde serileştirmek için kullanılabilir. Bu konuda, XAML'deki tür dönüştürücülerinin nasıl ve ne zaman çağrıldığı açıklanır ve yöntemi geçersiz kılmaları TypeConverteriçin uygulama önerileri sağlanır.

Tür Dönüştürme Kavramları

Aşağıdaki bölümlerde XAML'nin dizeleri nasıl kullandığı ve .NET XAML Hizmetlerindeki nesne yazıcılarının bir XAML kaynağında karşılaşılan dize değerlerinden bazılarını işlemek için tür dönüştürücülerini nasıl kullandığı hakkında temel kavramlar açıklanmaktadır.

XAML ve Dize Değerleri

Bir XAML dosyasında öznitelik değeri ayarladığınızda, bu değerin ilk türü genel anlamda bir dize ve XML anlamda bir dize öznitelik değeridir. gibi Double diğer temel öğeler bile başlangıçta bir XAML işlemcisine yönelik dizelerdir.

Çoğu durumda, 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. Özniteliğin değeri bir numaralandırmaya başvuruyorsa, sağlanan dize bu numaralandırmadaki adlandırılmış sabitle eşleşen bir ad için denetlenirse. Değer ayrıştırıcı tarafından anlaşılan bir temel öğe veya sabit bir numaralandırmadan sabit bir ad değilse, geçerli türün dönüştürülen dizeyi temel alan bir değer veya başvuru sağlayabilmesi gerekir.

Dekont

XAML dil yönergeleri tür dönüştürücüleri kullanmaz.

Tür Dönüştürücüleri ve İşaretlemeyi Genişletmeleri

İşaretlemeyi genişletme kullanımları, özellik türünü ve diğer önemli noktaları denetlemeden önce bir XAML işlemcisi tarafından işlenmelidir. Örneğin, öznitelik olarak ayarlanan bir özelliğin normalde bir tür dönüştürmesi varsa, ancak belirli bir durumda bir işaretleme uzantısı kullanımı tarafından ayarlandıysa, önce işaretleme uzantısı davranışı işlenir. Bir işaretleme uzantısının gerekli olduğu yaygın durumlardan biri, zaten var olan bir nesneye başvuru yapmaktır. 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 da istenmeyebilir. biçimlendirme uzantıları hakkında daha fazla bilgi için bkz . XAML için biçimlendirme uzantılarına genel bakış.

Yerel Tür Dönüştürücüleri

Windows Presentation Foundation (WPF) ve .NET XAML hizmetleri uygulamalarında, yerel tür dönüştürme işlemesine sahip belirli CLR türleri vardır. Ancak, bu CLR türleri geleneksel olarak ilkel olarak düşünülmemektedir. Bu tür bir türe örnek olarak .DateTime Bunun bir nedeni .NET Framework mimarisinin çalışma şeklidir: tür DateTime , .NET'teki en temel kitaplık olan mscorlib'de tanımlanır. DateTime bir bağımlılığı tanıtan başkaTypeConverterAttribute bir derlemeden (Sistem'den) gelen bir öznitelikle ilişkilendirilmesine izin verilmez. Bu nedenle, attributing tarafından normal tür dönüştürücü bulma mekanizması desteklenemez. Bunun yerine, XAML ayrıştırıcısı yerel işlemeye ihtiyaç duyan türlerin bir listesine sahiptir ve bu türleri gerçek ilkellerin nasıl işlendiğine benzer şekilde işler. durumunda DateTime, bu işleme için Parsebir çağrı içerir.

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

Aşağıdaki bölümlerde sınıfın API'si ele alınıyor TypeConverter .

TypeConverter

.NET XAML Hizmetleri altında, 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 var olmadan önce .NET Framework sürümlerinde vardı; özgün TypeConverter senaryolardan biri, görsel tasarımcılardaki özellik düzenleyicileri için dize dönüştürme sağlamaktı.

XAML için rolü TypeConverter genişletilir. XAML amacıyla, TypeConverter belirli dizeden dizeye ve dizeden dönüştürmelere yönelik destek sağlamaya yönelik temel sınıftır. From-string, XAML'den bir dize özniteliği değerini ayrıştırmanızı sağlar. To-string, belirli bir nesne özelliğinin çalışma zamanı değerinin seri hale getirilmesi için XAML'deki bir öznitelikte işlenmesini etkinleştirebilir.

TypeConverter XAML işleme amacıyla dizeye ve dizeden dizeye dönüştürmeye uygun dört üye tanımlar:

Bu üyelerin en önemli yöntemi, giriş dizesini gerekli nesne türüne dönüştüren yöntemidir ConvertFrom. yöntemi ConvertFrom , daha geniş bir tür aralığını dönüştürücüün hedef türüne dönüştürmek için uygulanabilir. Bu nedenle, çalışma zamanı dönüştürmelerini destekleme gibi XAML'nin ötesine uzanan amaçlara hizmet edebilir. Ancak, XAML kullanımı için yalnızca girişi String işleyebilen kod yolu önemlidir.

en önemli ikinci yöntemdir ConvertTo. Bir uygulama bir işaretleme gösterimine dönüştürülürse (örneğin, dosya olarak XAML'ye kaydedilmişse), ConvertTo bir işaretleme gösterimi oluşturmak için XAML metin yazıcısının daha büyük senaryosunda yer alır. Bu durumda, XAML için önemli kod yolu, çağıranın bir destinationType öğesini geçirmesidir 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, dönüştürme için geçerli bir dizenin ne olduğunu benzersiz olarak yorumlayabilir 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 için önemli bir nokta şunlardır: Öznitelik değerleri olarak yerelleştirilebilir dizelerin kullanılması XAML tarafından desteklense de, bu yerelleştirilebilir dizeleri belirli kültür gereksinimlerine sahip tür dönüştürücü girişi olarak kullanamazsınız. Bu sınırlamanın nedeni, XAML öznitelik değerleri için tür dönüştürücülerinin kültür kullanan en-US sabit dilli bir XAML işleme davranışı içermesidir. 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ştirmeye Genel Bakış.

Kültürün sorun olabileceği bir örnek olarak, bazı kültürler dize biçimindeki sayılar için ondalık ayırıcı olarak nokta yerine virgül kullanır. Bu kullanım, birçok mevcut tür dönüştürücüsunun sahip olduğu davranışla çakılır. Bu, sınırlayıcı olarak virgül kullanmaktır. Çevresindeki XAML'de bir kültürün geçirilmesi xml:lang 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 bir 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, dönüştürme için geçerli bir dize oluşturan şeyi benzersiz olarak yorumlayabilir ve parametre olarak geçirilen tür açıklamasını veya kültür bağlamlarını da 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

Küme ayraçlarını ({} ), özellikle de açılış ayracı ({) dize biçiminizin bir öğesi olarak kullanmayın. Bu karakterler, bir işaretleme uzantısı dizisi için giriş ve çıkış olarak ayrılmıştır.

Tür dönüştürücünüzün .NET XAML Hizmetleri nesne yazıcısından bir XAML hizmetine erişimi olması gerektiğinde bir özel durum oluşturmak uygundur, ancak GetService bağlama göre yapılan çağrı bu hizmeti döndürmez.

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ünde 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, önemli bilgi kaybı olmadan, bu dizenin aynı dönüştürücü uygulamasına ConvertFrom geçirildiği gibi aynı değeri oluşturabilmesi gerekir.

Değer serileştirilemiyorsa veya dönüştürücü serileştirmeyi desteklemiyorsa, ConvertTo uygulamanın döndürülmesi null gerekir ve bir özel durum oluşturabilir. Ancak, özel durumlar oluşturursanız, özel durumlardan kaçınmak için önce ile CanConvertTo denetlemenin en iyi uygulamasının desteklenmesi için bu dönüştürmeyi uygulamanızın bir parçası olarak kullanamama durumunu bildirmeniz CanConvertTo gerekir.

destinationType parametresi türünde Stringdeğilse kendi dönüştürücü işlemenizi seçebilirsiniz. Genellikle, temel uygulama işlemeye geri dönersiniz ve bu işlem tabanda ConvertTo belirli bir özel durum oluşturur.

Tür dönüştürücünüzün .NET XAML Hizmetleri nesne yazıcısından bir XAML hizmetine erişimi olması gerektiğinde bir özel durum oluşturmak uygundur, ancak GetService bağlama göre yapılan çağrı bu hizmeti döndürmez.

CanConvertFrom Uygulama

Uygulamanız CanConvertFrom türü String döndürmelidir truesourceType ve aksi takdirde temel uygulamaya ertelenmelidir. 'den CanConvertFromözel durumlar atmayın.

CanConvertTo Uygulama

Uygulamanız CanConvertTo türü Stringiçin destinationType döndürmelidir true ve aksi takdirde temel uygulamaya ertelemelidir. 'den CanConvertToözel durumlar atmayın.

TypeConverterAttribute Uygulama

Özel tür dönüştürücünüzün .NET XAML Hizmetleri tarafından özel bir sınıf için eylem türü dönüştürücüsü olarak kullanılması 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 özniteliği uygularsanız, 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 örnekleri 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 kullanışlıdır.

Özel bir ekli üye için tür dönüştürme davranışı sağlamak için, ekli üye için uygulama deseninin erişimci yöntemine uygulayın TypeConverterAttributeGet .

İşaretlemeyi Uzantı Uygulamasından Hizmet Sağlayıcısı Bağlamı'nı Erişme

Kullanılabilir hizmetler tüm değer dönüştürücüleri için aynıdır. Fark, her değer dönüştürücüsunun 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 İşaretlemeyi Genişletmeler konusunda belgelenmiştir.

XAML Düğümü Akışında Tür Dönüştürücüleri

Bir XAML düğüm akışıyla çalışıyorsanız, bir tür dönüştürücüsünün eylemi veya bitiş sonucu henüz yürütülmemiş olur. Bir yükleme yolunda, yüklenebilmesi 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 gereken tür dönüştürücüsü, özelliği kullanılarak XamlMember.TypeConverter belirlenebilir. Ancak, geçerli bir değer elde XamlMember.TypeConverter etmek, temel alınan üye veya üyenin kullandığı nesne değerinin türü aracılığıyla bu bilgilere erişebilen bir XAML şema bağlamı olması gerekir. Tür dönüştürme davranışını çağırmak için XAML şema bağlamı da gerekir çünkü bu tür eşlemesi ve dönüştürücü örneği oluşturulmasını gerektirir.

Ayrıca bkz.