WPF için XAML ve Özel Sınıflar

Ortak dil çalışma zamanı (CLR) çerçevelerinde uygulanan XAML, herhangi bir ortak dil çalışma zamanı (CLR) dilinde özel bir sınıf veya yapı tanımlamayı ve ardından XAML işaretlemesini kullanarak bu sınıfa erişmeyi destekler. Windows Presentation Foundation (WPF) tanımlı türlerin ve özel türlerinizin bir karışımını, genellikle özel türleri bir XAML ad alanı ön ekine eşleyerek aynı işaretleme dosyasında kullanabilirsiniz. Bu konuda, özel bir sınıfın XAML öğesi olarak kullanılabilir olması için karşılaması gereken gereksinimler açıklanmaktadır.

Uygulamalarda veya Derlemelerde Özel Sınıflar

XAML'de kullanılan özel sınıflar iki farklı şekilde tanımlanabilir: arka planda kod içinde veya birincil Windows Presentation Foundation (WPF) uygulamasını üreten başka bir kodda veya sınıf kitaplığı olarak kullanılan yürütülebilir dosya veya DLL gibi ayrı bir derlemede sınıf olarak. Bu yaklaşımların her birinin belirli avantajları ve dezavantajları vardır.

  • Sınıf kitaplığı oluşturmanın avantajı, bu tür özel sınıfların birçok farklı olası uygulamada paylaşılabilmesidir. Ayrı bir kitaplık ayrıca uygulamaların sürüm oluşturma sorunlarını denetlemeyi kolaylaştırır ve hedeflenen sınıf kullanımının bir XAML sayfasında kök öğe olarak olduğu bir sınıf oluşturmayı basitleştirir.

  • Uygulamada özel sınıfları tanımlamanın avantajı, bu tekniğin nispeten basit olması ve ana uygulama yürütülebilir dosyasının ötesinde ayrı derlemeler eklediğinizde karşılaşılan dağıtım ve test sorunlarını en aza indirmesidir.

  • İster aynı ister farklı derlemede tanımlansın, özel sınıfların XAML'de öğe olarak kullanılabilmesi için CLR ad alanı ile XML ad alanı arasında eşlenmesi gerekir. Bkz . WPF XAML için XAML Ad Alanları ve Ad Alanı Eşlemesi.

XAML Öğesi Olarak Özel Sınıf gereksinimleri

Bir nesne öğesi olarak örnek oluşturulabilmesi için sınıfınızın aşağıdaki gereksinimleri karşılaması gerekir:

  • Özel sınıfınızın genel olması ve varsayılan (parametresiz) bir ortak oluşturucuyu desteklemesi gerekir. (Yapılara ilişkin notlar için aşağıdaki bölüme bakın.)

  • Özel sınıfınız iç içe geçmiş bir sınıf olmamalıdır. İç içe sınıflar ve genel CLR kullanım söz dizimindeki "nokta", ekli özellikler gibi diğer WPF ve/veya XAML özellikleriyle çakişir.

Nesne öğesi söz dizimini etkinleştirmeye ek olarak, nesne tanımınız bu nesneyi değer türü olarak alan diğer tüm ortak özellikler için özellik öğesi söz dizimini de etkinleştirir. Bunun nedeni, nesnenin artık bir nesne öğesi olarak örneklenebilir ve böyle bir özelliğin özellik öğesi değerini doldurabilmesidir.

Yapılar

Özel türler olarak tanımladığınız yapılar her zaman WPF'de XAML'de oluşturulabilir. Bunun nedeni, CLR derleyicilerinin tüm özellik değerlerini varsayılanlarına başlatan bir yapı için örtük olarak parametresiz bir oluşturucu oluşturmasıdır. Bazı durumlarda, bir yapı için varsayılan yapı davranışı ve/veya nesne öğesi kullanımı istenmez. Bunun nedeni, yapının değerleri doldurmaya yönelik olması ve kavramsal olarak birleşim olarak çalışması olabilir; burada içerilen değerler birbirini dışlayan yorumlara sahip olabilir ve bu nedenle özelliklerinin hiçbiri ayarlanamaz. Bu tür bir yapıya wpf örneği: GridLength. Genel olarak, bu tür yapıların, yapı değerlerinin farklı yorumlarını veya modlarını oluşturan dize kuralları kullanılarak değerlerin öznitelik biçiminde ifade edilebileceği bir tür dönüştürücüsü uygulaması gerekir. Yapı, parametresiz bir oluşturucu aracılığıyla kod oluşturma için benzer davranışlar da ortaya çıkarmalıdır.

XAML Öznitelikleri Olarak Özel Sınıfın Özellikleri için Gereksinimler

Özellikler bir değer türüne (ilkel gibi) başvurmalı veya bir XAML işlemcinin erişebileceği parametresiz oluşturucu veya ayrılmış tür dönüştürücüsü olan tür için bir sınıf kullanmalıdır. CLR XAML uygulamasında, XAML işlemcileri bu tür dönüştürücüleri dil temel bilgileri için yerel destek aracılığıyla veya destek türü tanımlarındaki bir türe veya üyeye uygulama TypeConverterAttribute yoluyla bulur

Alternatif olarak, özellik soyut bir sınıf türüne veya arabirime başvurabilir. Soyut sınıflar veya arabirimler için XAML ayrıştırma beklentisi, özellik değerinin arabirimini uygulayan somut sınıf örnekleriyle veya soyut sınıftan türetilen tür örnekleriyle doldurulması gerektiğidir.

Özellikler soyut bir sınıfta bildirilebilir, ancak yalnızca soyut sınıftan türetilen somut sınıflar üzerinde ayarlanabilir. Bunun nedeni, sınıfı için nesne öğesinin oluşturulması için sınıfta genel parametresiz oluşturucunun gerekli olmasıdır.

TypeConverter Etkin Öznitelik Sözdizimi

Sınıf düzeyinde ayrılmış, öznitelikli tür dönüştürücüsü sağlarsanız, uygulanan tür dönüştürme, bu türün örneğini oluşturması gereken tüm özellikler için öznitelik söz dizimini etkinleştirir. Tür dönüştürücü türün nesne öğesi kullanımını etkinleştirmez; yalnızca bu tür için parametresiz bir oluşturucunun varlığı nesne öğesi kullanımını etkinleştirir. Bu nedenle, türün kendisi nesne öğesi söz dizimini de desteklemediği sürece, tür dönüştürücüsü etkinleştirilmiş özellikler genellikle özellik söz diziminde kullanılamaz. Bunun istisnası, bir özellik öğesi söz dizimi belirtebilmenizdir, ancak özellik öğesinin bir dize içermesini sağlayabilirsiniz. Bu kullanım temelde bir öznitelik söz dizimi kullanımıyla eşdeğerdir ve öznitelik değerinin daha sağlam bir boşluk işlemesine gerek olmadığı sürece bu tür bir kullanım yaygın değildir. Örneğin, aşağıda bir dize alan bir özellik öğesi kullanımı ve öznitelik kullanımı eşdeğeri verilmiştir:

<Button>Hallo!
  <Button.Language>
    de-DE
  </Button.Language>
</Button>
<Button Language="de-DE">Hallo!</Button>

Öznitelik söz dizimine izin verilen ancak nesne öğesi içeren özellik öğesi söz dizimine XAML aracılığıyla izin verilmeyen özelliklere örnek olarak, türü alan Cursor çeşitli özellikler verilebilir. Sınıfın Cursor ayrılmış tür dönüştürücüsü CursorConvertervardır, ancak parametresiz bir oluşturucuyu kullanıma sunmaz, bu nedenle Cursor özellik yalnızca gerçek Cursor tür bir başvuru türü olsa bile öznitelik söz dizimi aracılığıyla ayarlanabilir.

Özellik Başına Tür Dönüştürücüleri

Alternatif olarak, özelliğin kendisi özellik düzeyinde bir tür dönüştürücü bildirebilir. Bu, özniteliğin gelen dize değerlerini uygun türe göre bir işlem için giriş olarak işleyerek satır içi özellik türünün nesnelerinin örneğini oluşturan bir ConvertFrom "mini dil" sağlar. Bu genellikle XAML'de özellik ayarlamayı etkinleştirmek için tek araç olarak değil, kolaylık erişimci sağlamak için yapılır. Ancak, parametresiz oluşturucu veya öznitelikli tür dönüştürücüsü sağlamayan mevcut CLR türlerini kullanmak istediğiniz öznitelikler için tür dönüştürücüleri de kullanabilirsiniz. WPF API'sinden alınan örnekler, türü alan belirli özelliklerdir CultureInfo . Bu durumda WPF, çerçevelerin önceki sürümlerinde kullanılan uyumluluk ve geçiş senaryolarını daha iyi ele almak için mevcut Microsoft .NET Framework CultureInfo türünü kullandı, ancak CultureInfo tür, XAML özellik değeri olarak doğrudan kullanılabilir olması için gerekli oluşturucuları veya tür düzeyinde tür dönüştürmeyi desteklemedi.

Özellikle bir denetim yazarıysanız, XAML kullanımına sahip bir özelliği kullanıma sunduğunuz her durumda, bu özelliği bir bağımlılık özelliğiyle yedeklemeyi kesinlikle göz önünde bulundurmanız gerekir. Bu durum özellikle XAML işlemcisinin mevcut Windows Presentation Foundation (WPF) uygulamasını kullanıyorsanız geçerlidir çünkü yedeklemeyi kullanarak DependencyProperty performansı geliştirebilirsiniz. Bağımlılık özelliği, kullanıcıların XAML erişilebilir özelliği için bekleyebilecekleri özellik sistemi özelliklerini kullanıma sunar. Buna animasyon, veri bağlama ve stil desteği gibi özellikler dahildir. Daha fazla bilgi için bkz . Özel Bağımlılık Özellikleri ve XAML Yükleme ve Bağımlılık Özellikleri.

Tür Dönüştürücü yazma ve dağıtma

Özellik türünüz için tür dönüştürme sağlamak için bazen özel TypeConverter türetilmiş bir sınıf yazmanız gerekir. XAML kullanımlarını destekleyebilecek bir tür dönüştürücüsü türetme ve oluşturma yönergeleri için TypeConverterAttributebkz . TypeConverters ve XAML.

Özel Bir Sınıfın Olaylarında XAML Olay İşleyicisi Öznitelik Sözdizimi Gereksinimleri

CLR olayı olarak kullanılabilir olması için, olay parametresiz oluşturucuyu destekleyen bir sınıfta veya türetilmiş sınıflarda olaya erişilebilen soyut bir sınıfta genel olay olarak gösterilmelidir. Yönlendirilmiş bir olay olarak rahatça kullanılabilmesi için CLR olayınız, CLR olay imzası için işleyici ekleyip kaldıran ve remove bu işleyicileri ve yöntemlerine AddHandler yönlendiren açık add ve RemoveHandler yöntemler uygulamalıdır. Bu yöntemler, işleyicileri olayın eklendiği örnekte yönlendirilmiş olay işleyici deposuna ekler veya kaldırır.

Not

kullanarak AddHandlerdoğrudan yönlendirilmiş olaylar için işleyicileri kaydetmek ve yönlendirilen olayı kullanıma sunan bir CLR olayını kasıtlı olarak tanımlamamak mümkündür. Olay işleyicileri eklemek için XAML özniteliği söz dizimini etkinleştirmediğinden ve sonuçta elde edilen sınıfınız bu türün özellikleri için daha az saydam bir XAML görünümü sunacağından bu genellikle önerilmez.

Koleksiyon Özellikleri Yazma

Koleksiyon türü alan özellikler, koleksiyona eklenen nesneleri belirtmenize olanak tanıyan bir XAML söz dizimine sahiptir. Bu söz diziminde iki önemli özellik vardır.

  • Koleksiyon nesnesi olan nesnenin nesne öğesi söz diziminde belirtilmesi gerekmez. XAML'de bir koleksiyon türü alan bir özellik belirttiğinizde bu koleksiyon türünün varlığı örtükdür.

  • İşaretlem içindeki koleksiyon özelliğinin alt öğeleri, koleksiyonun üyesi olmak için işlenir. Normalde, bir koleksiyonun üyelerine kod erişimi gibi Addliste/sözlük yöntemleri aracılığıyla veya bir dizin oluşturucu aracılığıyla gerçekleştirilir. Ancak XAML söz dizimi yöntemleri veya dizin oluşturucuları desteklemez (özel durum: XAML 2009 yöntemleri destekleyebilir, ancak XAML 2009 kullanmak olası WPF kullanımlarını kısıtlar; bkz . XAML 2009 Dil Özellikleri). Koleksiyonlar açıkça bir öğe ağacı oluşturmak için çok yaygın bir gereksinimdir ve bu koleksiyonları bildirim temelli XAML'de doldurmak için bir yönteme ihtiyacınız vardır. Bu nedenle, bir koleksiyon özelliğinin alt öğeleri koleksiyon özellik türü değeri olan koleksiyona eklenerek işlenir.

.NET Framework XAML Hizmetleri uygulaması ve dolayısıyla WPF XAML işlemcisi, koleksiyon özelliğini oluşturan şey için aşağıdaki tanımı kullanır. Özelliğin özellik türü aşağıdakilerden birini uygulamalıdır:

CLR'deki bu türlerin her biri, nesne grafiğini oluştururken temel alınan koleksiyona öğe eklemek için XAML işlemcisi tarafından kullanılan bir Add yönteme sahiptir.

Not

Genel List ve Dictionary arabirimler (IList<T> ve IDictionary<TKey,TValue>) WPF XAML işlemcisi tarafından koleksiyon algılama için desteklenmez. Ancak, doğrudan uyguladığı için sınıfını bir temel sınıf olarak veya Dictionary<TKey,TValue> doğrudan uyguladığından IDictionary IList bir temel sınıf olarak kullanabilirsinizList<T>.

Koleksiyon alan bir özellik bildirdiğinizde, bu özellik değerinin türün yeni örneklerinde nasıl başlatıldığı konusunda dikkatli olun. Özelliğini bağımlılık özelliği olarak uygulamıyorsanız, özelliğin koleksiyon türü oluşturucuyu çağıran bir yedekleme alanı kullanması yeterlidir. Özelliğiniz bir bağımlılık özelliğiyse, koleksiyon özelliğini varsayılan tür oluşturucusunun bir parçası olarak başlatmanız gerekebilir. Bunun nedeni, bağımlılık özelliğinin varsayılan değerini meta verilerden alması ve genellikle koleksiyon özelliğinin ilk değerinin statik, paylaşılan bir koleksiyon olmasını istememektir. Her tür örneği için bir koleksiyon örneği olmalıdır. Daha fazla bilgi için bkz . Özel Bağımlılık Özellikleri.

Koleksiyon özelliğiniz için özel bir koleksiyon türü uygulayabilirsiniz. Örtük koleksiyon özellik işlemesi nedeniyle, özel koleksiyon türünün XAML'de örtük olarak kullanılabilmesi için parametresiz bir oluşturucu sağlaması gerekmez. Ancak, isteğe bağlı olarak koleksiyon türü için parametresiz bir oluşturucu sağlayabilirsiniz. Bu, faydalı bir uygulama olabilir. Parametresiz bir oluşturucu sağlamadığınız sürece, koleksiyonu açıkça nesne öğesi olarak bildiremezsiniz. Bazı işaretleme yazarları, açık koleksiyonu işaretleme stili olarak görmeyi tercih edebilir. Ayrıca, parametresiz bir oluşturucu, koleksiyon türünüzü özellik değeri olarak kullanan yeni nesneler oluşturduğunuzda başlatma gereksinimlerini basitleştirebilir.

XAML İçerik Özelliklerini Bildirme

XAML dili, XAML içerik özelliği kavramını tanımlar. Nesne söz diziminde kullanılabilen her sınıfın tam olarak bir XAML içerik özelliği olabilir. Sınıfınızın XAML içerik özelliği olacak bir özellik bildirmek için öğesini sınıf tanımının bir parçası olarak uygulayın ContentPropertyAttribute . Amaçlanan XAML içerik özelliğinin adını özniteliğinde olarak Name belirtin. özelliği gibi bir yansıma yapısı olarak değil ada göre bir dize olarak PropertyInfobelirtilir.

XAML içerik özelliği olarak bir koleksiyon özelliği belirtebilirsiniz. Bu, nesne öğesinin herhangi bir koleksiyon nesnesi öğesi veya özellik öğesi etiketi olmadan bir veya daha fazla alt öğeye sahip olabileceği bu özellik için bir kullanıma neden olur. Bu öğeler daha sonra XAML içerik özelliği için değer olarak değerlendirilir ve yedekleme koleksiyonu örneğine eklenir.

Mevcut bazı XAML içerik özellikleri özelliğinin Objecttürünü kullanır. Bu, bir gibi temel değerleri String alabilen ve tek bir başvuru nesnesi değeri alabilen bir XAML içerik özelliği sağlar. Bu modeli izlerseniz, türünüz hem tür belirleme hem de olası türlerin işlenmesinden sorumludur. İçerik türünün tipik nedeni Object , hem nesne içeriğini dize olarak eklemenin basit bir aracını (varsayılan sunu işlemi alır) hem de varsayılan olmayan bir sunuyu veya ek verileri belirten nesne içeriği eklemenin gelişmiş bir aracını desteklemektir.

XAML seri hale getirildiğinde

Denetim yazarı olmanız gibi belirli senaryolarda, XAML'de örneği oluşturulabilen tüm nesne gösteriminin de eşdeğer XAML işaretlemesine geri serileştirilebileceğine de emin olmak isteyebilirsiniz. Serileştirme gereksinimleri bu konuda açıklanmaz. Bkz. Denetim Yazmaya Genel Bakış ve Öğe Ağacı ve Serileştirme.

Ayrıca bkz.