.NET XAML Hizmetleri ile kullanım için özel türleri tanımlama

İş nesneleri olan veya belirli çerçevelere bağımlılığı olan türler olan özel türleri tanımladığınız zaman, XAML için izleyebilirsiniz bazı en iyi yöntemler vardır. Bu uygulamaları takip edersanız, .NET XAML Hizmetleri ve onun XAML okuyucuları ile XAML yazıcıları, türün XAML özelliklerini keşfederek XAML tür sistemini kullanarak bir XAML düğüm akışında uygun temsili sağlar. Bu konu, tür tanımları, üye tanımları ve türlerin veya üyelerin CLR atbuting için en iyi yöntemleri açıklar.

XAML için Oluşturucu Desenleri ve Tür Tanımları

XAML'de nesne öğesi olarak örneği oluşturmak için özel bir sınıfın aşağıdaki gereksinimleri karşılaması gerekir:

  • Özel sınıf genel olmalı ve parametresiz bir ortak oluşturucunun kullanımına açık olmalıdır. (Yapılarla ilgili notlar için aşağıdaki bölüme bakın.)

  • Özel sınıf iç içe geçmiş bir sınıf olması gerekir. Tam ad yolundaki fazladan "nokta", sınıf-ad alanı bölmeyi belirsiz yapar ve ekli özellikler gibi diğer XAML özelliklerini engellemez. Bir nesne bir nesne öğesi olarak örneği oluşturulabilirse, oluşturulan nesne nesneyi temel alınan tür olarak alan herhangi bir özelliğin özellik öğesi formunu doldurabilirsiniz.

Değer dönüştürücüyü etkinleştirirsanız, bu ölçütleri karşılamayan türler için nesne değerleri sebilirsiniz. Daha fazla bilgi için bkz. XAML için Tür Dönüştürücüleri ve İşaretleme Uzantıları.

Yapılar

Yapılar, CLR tanımına göre her zaman XAML'de oluşturulur. Bunun nedeni, CLR derleyicinin yapı için örtülü olarak parametresiz bir oluşturucu oluşturmasıdır. Bu oluşturucu, tüm özellik değerlerini varsayılan değerlerinde başlatıyor.

Bazı durumlarda, bir yapı için varsayılan yapı davranışı tercih edilmez. Bunun nedeni yapının değerleri doldurması ve kavramsal olarak bir birliktelik olarak çalışması olabilir. Bir bütün olarak, içerdiği değerler birbirini dışlar ve bu nedenle özelliklerinin hiçbiri ayarlanamaz. WPF sözlüğünde bu tür bir yapının GridLength örneğidir. Bu tür yapılar, değerlerin yapı değerlerinin farklı yorumlarını veya modlarını oluşturan dize kuralları kullanılarak öznitelik formunda ifade edil için bir tür dönüştürücü uygulamalı. Yapı, parametresiz olmayan bir oluşturucu aracılığıyla kod oluşturma için de benzer davranışları ortaya çıkarmalıdır.

Arabirimler

Arabirimler, temel üye türleri olarak kullanılabilir. XAML tür sistemi atanabilir listeyi denetler ve değer olarak sağlanan nesnenin arabirime atanabilir olmasını bekler. İlgili atanabilir tür XAML yapı gereksinimlerini desteklediği sürece arabirimin bir XAML türü olarak nasıl sun olması gerektiğinin kavramı yoktur.

Fabrika Yöntemleri

Fabrika yöntemleri bir XAML 2009 özelliğidir. Nesnelerin parametresiz oluşturuculara sahip olması gereken XAML ilkesini değiştirirler. Fabrika yöntemleri bu makalede belgelenmiş değildir. Bkz. x:FactoryMethod Yönergesi.

Listelemeler

Numaralar XAML yerel tür dönüştürme davranışına sahip. XAML'de belirtilen sabit adları sabit sabit adları, temel alınan sabit değer türüne göre çözümlenir ve sabit değer bir XAML nesne yazıcıya geri döner.

XAML, uygulanan numaralar için bayrak stili kullanımı FlagsAttribute destekler. Daha fazla bilgi için bkz. Ayrıntılı XAML Söz Dizimi. (XAML Söz Dizimi Ayrıntılı olarak WPF hedef kitlesi için yazılmıştır, ancak bu konudaki bilgilerin çoğu belirli bir uygulama çerçevesine özgü olan XAML için alakalıdır.)

Üye Tanımları

Türler XAML kullanımı için üye tanımlayabilir. Türlerin, belirli bir tür XAML kullanılabilir olsa bile XAML ile kullanılabilir üyeleri tanımlaması mümkündür. ClR devralması nedeniyle bu mümkündür. Bu nedenle, üyeyi devralan bazı türler bir tür olarak XAML kullanımını desteklediği ve üyenin temel alınan türü için XAML kullanımını desteklediği veya kullanılabilir yerel bir XAML söz dizimi olduğu sürece, bu üye XAML tarafından kullanılabilir.

Özellikler

Özellikleri tipik CLR ve erişimci desenlerini ve dile uygun anahtar sözcüğünü kullanarak genel CLR özelliği olarak tanımlarsanız, XAML tür sistemi özelliği ve gibi özellikler için uygun bilgilerle birlikte bir üye olarak getsetXamlMemberIsReadPublicIsWritePublic bildirebilirsiniz.

Belirli özellikler uygulayarak metin söz dizimlerini TypeConverterAttribute etkinleştirebilirsiniz. Daha fazla bilgi için bkz. XAML için Tür Dönüştürücüleri ve İşaretleme Uzantıları.

Metin söz dizimi veya yerel XAML dönüştürmesi olmaması ve işaretleme uzantısı kullanımı gibi başka bir dolaylılık olmamasında, bir özelliğin türü (XAML tür sisteminde) hedef türü CLR türü olarak davranarak bir XAML nesne yazıcıya bir örnek getirene sahip olması TargetType gerekir.

XAML 2009 kullanılıyorsa, önceki önemli noktalar karşılanmazsa değer sağlamak için x:Reference Markup Extension kullanılabilir; ancak, bu tür tanımı sorunundan daha çok kullanım sorunudur.

etkinlik

Olayları genel CLR olayı olarak tanımlarsanız, XAML tür sistemi olayı ile bir üye olarak IsEventtrue bildirebilirsiniz. Olay işleyicilerini kablolama . NET XAML Hizmetleri özellikleri kapsamında değildir; kablolama belirli çerçevelere ve uygulamalara bıraktır.

Yöntemler

Yöntemler için satır içi kod, varsayılan bir XAML özelliği değildir. Çoğu durumda, XAML'den yöntem üyelerine doğrudan başvurur ve XAML'de yöntemlerin rolü yalnızca belirli XAML desenleri için destek sağlamaktır. x:FactoryMethod Yönergesi bir özel durumdur.

Alanlar

CLR tasarım yönergeleri,statik olmayan alanları önermektedir. Statik alanlar için statik alan değerlerine yalnızca x:Static Markup Extension aracılığıyla erişebilirsiniz; bu durumda, x:Static kullanımları için bir alanı açığa çıkarmak için CLR tanımında özel bir şey yapmıyor oluruz.

Eklenebilir Üyeler

Eklenebilir üyeler, tanımlama türü üzerinde bir erişimci yöntemi deseni aracılığıyla XAML'ye açık olur. Tanımlayan türün bir nesne olarak XAML ile kullanılabilir olması gerekmemektedir. Aslında, ortak bir desen, rolü iliştirilebilir üyeye sahip olan bir hizmet sınıfı bildirmek ve ilgili davranışları uygulamak, ancak ui gösterimi gibi başka bir işleve hizmet etmektir. Aşağıdaki bölümler için PropertyName yer tutucusu, iliştirilebilir üyenizin adını temsil eder. Bu ad, XamlName Dilbilgisinde geçerli olmalıdır.

Bu desenler ve bir türün diğer yöntemleri arasındaki ad çakışmalarına karşı dikkatli olun. Desenlerden biri ile eşleşen bir üye varsa, amacınız bu değildi bile XAML işlemcisi tarafından iliştirilebilir üye kullanım yolu olarak yorumlanabilir.

GetPropertyName Erişimcisi

Erişimcinin GetPropertyName imzası şu şekildedir:

public static object GetPropertyName(object target)

  • targetNesne, uygulamanıza daha belirli bir tür olarak belirtilebilir. Bunu, eklenebilir üyenizin kullanımının kapsamını yapmak için kullanabilirsiniz; Amaçlanan kapsamınız dışındaki kullanımlar, daha sonra bir XAML ayrıştırma hatasıyla ortaya çıkarılan geçersiz yayın özel durumları oluşturur. Parametre adı target bir gereksinim değildir, ancak çoğu uygulamada target kurala göre adlandırılmıştır.

  • Dönüş değeri, uygulamanıza daha belirli bir tür olarak belirtilebilir.

Eklenebilir TypeConverter üyenin öznitelik kullanımı için etkinleştirilmiş metin söz dizimlerini desteklemek için TypeConverterAttribute erişimciye GetPropertyName başvurun. yerine 'ye uygulanması sezgisel değildir; ancak bu kural, serileştirilebilir salt okunur eklenebilir üyeler kavramını desteklemektedir ve bu da tasarımcı senaryolarında getset yararlıdır.

SetPropertyName Erişimcisi

Erişimcinin SetPropertyName imzası şu şekildedir:

public static void SetPropertyName(object target, object value)

  • Nesne, önceki bölümde açıklandığı gibi aynı mantık ve target sonuçlarla, uygulamanıza daha belirli bir tür olarak belirtilebilir.

  • valueNesne, uygulamanıza daha belirli bir tür olarak belirtilebilir.

Bu yöntemin değerinin genellikle öznitelik formundaki XAML kullanımından gelen giriş olduğunu unutmayın. Öznitelik formundan metin söz dizimi için değer dönüştürücü desteği, erişimcide ise GetPropertyName özniteliğini desteklemesi gerekir.

Eklenebilir Üye Depoları

Erişimci yöntemleri genellikle bir nesne grafı içine iliştirilebilir üye değerleri eklemek veya nesne grafiğinden değerleri almak ve bunları düzgün serileştirmek için bir yöntem sağlamak için yeterli değildir. Bu işlevi sağlamak için, target önceki erişimci imzalarında yer alan nesnelerin değerleri depolayama özelliğine sahip olması gerekir. Depolama mekanizması, üyenin, eklenebilir üyenin üye listesinde yer alan hedeflere eklenebilir olmasıyla tutarlı olmalıdır. .NET XAML Hizmetleri, ve API'leri aracılığıyla eklenebilir üye depoları için bir uygulama tekniği IAttachedPropertyStoreAttachablePropertyServices sağlar. IAttachedPropertyStore , mağaza uygulamasını bulmak için XAML yazıcıları tarafından kullanılır ve erişimcilerin target türüne uygulanıyor olması gerekir. Statik AttachablePropertyServices API'ler erişimcilerin gövdesi içinde kullanılır ve tarafından iliştirilebilir üyeye AttachableMemberIdentifier başvurur.

XAML türü sistem bilgilerini .NET XAML Hizmetleri'ne rapor etmek için türlerinizi, üyelerinizi ve derlemelerinizi doğru şekilde atdırmanız önemlidir. Aşağıdaki durumlardan biri geçerli olursa XAML türü sistem bilgilerini raporlamak geçerlidir:

  • Türlerinizi doğrudan .NET XAML Hizmetleri XAML okuyucuları ve XAML yazıcılarını temel alan XAML sistemleriyle kullanmak üzere tasarlanmıştır.
  • Bu XAML okuyucuları ve XAML yazıcılarını temel alan bir XAML kullanan çerçeve tanımlar veya kullanırsınız.

Özel türlerinizin XAML desteğiyle ilgili her XAML ile ilgili özniteliğin listesi için bkz. Özel Türler ve Kitaplıklar için XAML ile İlgili CLR Öznitelikleri.

Kullanım

Özel türlerin kullanımı, işaretleme yazarının özel türü içeren derleme ve CLR ad alanı için bir ön eki eşlemesi gerekir. Bu yordam bu konuda belgelenmiş değildir.

Erişim düzeyi

XAML, erişim düzeyine sahip türleri yüklemek ve örneği yapmak için bir internal sistem sağlar. Bu özellik, kullanıcı kodunun kendi türlerini tanımlayabilmesi ve ardından aynı kullanıcı kodu kapsamının bir parçası olan biçimlendirmeden bu sınıfların örneklemesinin sağlanması için sağlanır.

WPF 'den bir örnek, Kullanıcı kodu, bir UserControl UI davranışını yeniden düzenleme yöntemi olarak tasarlanan, ancak destekleme sınıfı erişim düzeyiyle tanımlanarak ima edilebilir olan herhangi bir uzantı mekanizmalarının bir parçası olarak değil, her ne zaman bir örnektir public . Bu tür bir UserControlinternal , yedekleme kodu bir xaml türü olarak başvurulduğu aynı derlemeye derlenirse erişim ile bildirilemez.

Tam güven ve kullanımları altında XAML yükleyen bir uygulama için XamlObjectWriter , erişim düzeyiyle sınıfları yüklemek internal her zaman etkindir.

Kısmi güven altına XAML yükleyen bir uygulama için, API 'yi kullanarak erişim düzeyi özelliklerini kontrol edebilirsiniz XamlAccessLevel . Ayrıca, erteleme mekanizmaları (WPF şablon sistemi gibi), herhangi bir erişim düzeyi izni yayabilir ve bunları nihai çalışma süresi değerlendirmelerine karşı koruyabilmelidir; Bu, bilgileri geçirerek dahili olarak işlenir XamlAccessLevel .

WPF uygulama

WPF XAML, kısmi güven altında BAML 'nin yüklendiği durumlarda kısmi güven erişim modeli kullanır, AssemblyAccessTo Bu da BAML kaynağı olan derleme için erişim kısıtlıdır. Deferral için WPF, IXamlObjectWriterFactory.GetParentSettings erişim düzeyi bilgilerini geçirmek için bir mekanizma kullanır.

WPF XAML terminolojisinde, dahili bir tür , başvuran xaml de içeren aynı derleme tarafından tanımlanan bir türdür. Böyle bir tür, bir eşlemenin derleme = bölümünü (örneğin,) kasıtlı olarak atbir XAML ad alanı aracılığıyla eşlenebilir xmlns:local="clr-namespace:WPFApplication1" . BAML bir iç türe başvuruyorsa ve bu türün internal erişim düzeyi varsa, bu GeneratedInternalTypeHelper derleme için bir sınıf oluşturur. Kaçınmak isterseniz GeneratedInternalTypeHelper , erişim düzeyini kullanmanız ya da public ilgili sınıfı ayrı bir derlemede çarpanlara katmalıdır ve bu derlemeye bağımlı hale gelmelidir.

Ayrıca bkz.