Aracılığıyla paylaş


.NET XAML Hizmetleri ile kullanılmak üzere özel türler tanımlama

İş nesneleri olan veya belirli çerçevelere bağımlılığı olmayan türler olan özel türler tanımladığınızda, XAML için izleyebileceğiniz bazı en iyi yöntemler vardır. Bu uygulamaları izlerseniz, .NET XAML Hizmetleri ve onun XAML okuyucuları ve XAML yazıcıları türünüzün XAML özelliklerini bulabilir ve XAML türü sistemini kullanarak bir XAML düğüm akışında uygun gösterim sağlayabilir. Bu konu, tür tanımları, üye tanımları ve clr türleri veya üyelerin attributing için en iyi yöntemleri açıklar.

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

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

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

  • Özel sınıf iç içe geçmiş bir sınıf olmamalıdır. Tam ad yolundaki ek "nokta", sınıf-ad alanı bölümünü belirsiz hale getirir ve ekli özellikler gibi diğer XAML özellikleriyle çakışır. Bir nesnenin örneği bir nesne öğesi olarak oluşturulabiliyorsa, oluşturulan nesne, nesneyi temel türü olarak alan özelliklerin özellik öğesi formunu doldurabilir.

Değer dönüştürücüsünü etkinleştirirseniz, yine de bu ölçütleri karşılamayan türler için nesne değerleri sağlayabilirsiniz. Daha fazla bilgi için bkz. XAMLiçin Tür Dönüştürücüleri ve biçimlendirme uzantıları.

Yapı

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

Bazı durumlarda, bir yapı için varsayılan yapı davranışı arzu edilmez. Bunun nedeni, yapının değerleri doldurması ve kavramsal olarak birleşim olarak çalışması olabilir. Birleşim olarak, kapsanan değerlerin birbirini dışlayan yorumları olabilir ve bu nedenle özelliklerinin hiçbiri ayarlanamaz. WPF sözlüğünde böyle bir yapıya örnek olarak GridLength. Bu tür yapılar, değerlerin yapı değerlerinin farklı yorumlarını veya modlarını oluşturan dize kuralları kullanılarak öznitelik biçiminde ifade edilebilmesi için bir tür dönüştürücü uygulamalıdır. Yapı, parametresiz bir oluşturucu aracılığıyla kod oluşturma için benzer davranışlar da ortaya çıkarmalıdır.

Arabirim

Arabirimler, temel alınan üye türleri olarak kullanılabilir. XAML türü sistemi atanabilir listeyi denetler ve değer olarak sağlanan nesnenin arabirime atanabilmesini bekler. İlgili atanabilir bir tür XAML oluşturma gereksinimlerini desteklediği sürece arabirimin XAML türü olarak nasıl sunulması gerektiği kavramı yoktur.

Fabrika Yöntemleri

Fabrika yöntemleri bir XAML 2009 özelliğidir. Nesnelerin parametresiz oluşturuculara sahip olması gerektiği XAML ilkesini değiştirir. Fabrika yöntemleri bu makalede belgelenmemiştir. bkz. x:FactoryMethod Yönergesi.

Numaralandırma

Numaralandırmaların XAML yerel tür dönüştürme davranışı vardır. XAML'de belirtilen numaralandırma sabit adları, temel alınan numaralandırma türüne göre çözümlenir ve numaralandırma değerini bir XAML nesne yazıcısına döndürür.

XAML, FlagsAttribute uygulanmış numaralandırmalar için bayrak stili kullanımını destekler. Daha fazla bilgi için bkz. XAML Söz Dizimi Ayrıntılı. ( ayrıntılıXAML Sözdizimi WPF hedef kitlesi için yazılır, ancak bu konudaki bilgilerin çoğu belirli bir uygulama çerçevesine özgü olmayan XAML ile ilgilidir.)

Üye Tanımları

Türler, XAML kullanımı için üyeleri tanımlayabilir. Bu tür XAML kullanılabilir olmasa bile türlerin XAML kullanılabilir üyeleri tanımlaması mümkündür. ClR devralma nedeniyle bu mümkündür. Üyeyi devralan bir tür tür olarak XAML kullanımını desteklediği ve üyenin temel türü için XAML kullanımını desteklediği veya yerel bir XAML söz dizimi kullanılabildiği sürece bu üye XAML tarafından kullanılabilir.

Özellikler

Tipik CLR get ve set erişimci desenlerini ve dile uygun anahtar sözcükleri kullanarak özellikleri genel bir CLR özelliği olarak tanımlarsanız, XAML türü sistemi özelliği IsReadPublic ve IsWritePublicgibi XamlMember özellikleri için sağlanan uygun bilgilerle bir üye olarak bildirebilir.

Belirli özellikler, TypeConverterAttributeuygulayarak metin söz dizimlerini etkinleştirebilir. Daha fazla bilgi için bkz. XAMLiçin Tür Dönüştürücüleri ve biçimlendirme uzantıları.

Metin söz dizimi veya yerel XAML dönüştürmesi olmadığında ve işaretleme uzantısı kullanımı gibi daha fazla dolaylılık olmadığında, bir özelliğin türü (XAML türü sistemindeTargetType) hedef türü CLR türü olarak değerlendirerek bir örneği XAML nesne yazıcısına döndürebilmelidir.

XAML 2009 kullanılıyorsa x:Başvuru İşaretlemesi Uzantısı, önceki önemli noktalar karşılanmazsa değerleri sağlamak için kullanılabilir; ancak bu, tür tanımı sorunundan çok kullanım sorunudur.

Olay

Olayları bir genel CLR olayı olarak tanımlarsanız, XAML türü sistemi olayı trueolarak IsEvent ile bir üye olarak raporlayabilir. Olay işleyicilerini bağlamak .NET XAML Hizmetleri özellikleri kapsamında değildir; kablolar belirli çerçevelere ve uygulamalara bırakılır.

Yöntemler

Yöntemler için satır içi kod, varsayılan bir XAML özelliği değildir. Çoğu durumda, XAML'deki yöntem üyelerine doğrudan başvurmazsınız ve XAML'deki 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ı önerilmez. Statik alanlar için, statik alan değerlerine yalnızca x:Static Markup Extensionaracılığıyla erişebilirsiniz; bu durumda, x:Static kullanımları için bir alanı kullanıma sunma amacıyla CLR tanımında özel bir şey yapmıyorsunuz.

Eklenebilir Üyeler

Eklenebilir üyeler, tanımlama türündeki bir erişimci yöntemi deseni aracılığıyla XAML'ye sunulur. Tanımlama türünün kendisinin nesne olarak XAML kullanılabilir olması gerekmez. Aslında yaygın bir desen, rolü eklenebilir üyeye sahip olmak ve ilgili davranışları uygulamak olan ancak kullanıcı arabirimi gösterimi gibi başka bir işleve hizmet etmeyen bir hizmet sınıfını bildirmektir. Aşağıdaki bölümlerde PropertyName yer tutucusu eklenebilir üyenizin adını temsil eder. Bu ad XamlName Grammariçinde geçerli olmalıdır.

Bu desenler ve bir türün diğer yöntemleri arasındaki ad çakışmalarına dikkat edin. Desenlerden biriyle eşleşen bir üye varsa, amacınız bu olmasa bile XAML işlemcisi tarafından eklenebilir üye kullanım yolu olarak yorumlanabilir.

GetPropertyName Erişimcisi

GetPropertyName erişimcisinin imzası şu şekilde olmalıdır:

public static object GetPropertyName(object target)

  • target nesnesi, uygulamanızda daha belirli bir tür olarak belirtilebilir. Bunu, eklenebilir üyenizin kullanımını kapsamak için kullanabilirsiniz; hedeflenen kapsamınızın dışındaki kullanımlar, daha sonra bir XAML ayrıştırma hatası tarafından ortaya çıkarılmış geçersiz atama özel durumları oluşturur. parametre adı target bir gereksinim değildir, ancak çoğu uygulamada kurala göre target olarak adlandırılır.

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

Eklenebilir üyenin öznitelik kullanımına yönelik TypeConverter etkinleştirilmiş metin söz dizimini desteklemek için GetPropertyName erişimcisine TypeConverterAttribute uygulayın. set yerine get uygulamak sezgisel olmayabilir; ancak bu kural, tasarımcı senaryolarında yararlı olan, serileştirilebilir salt okunur eklenebilir üyeler kavramını destekleyebilir.

SetPropertyName Erişimcisi

SetPropertyName erişimcisinin imzası şu şekilde olmalıdır:

public static void SetPropertyName(object target, object value)

  • target nesnesi, önceki bölümde açıklanan mantık ve sonuçlarla uygulamanızda daha belirli bir tür olarak belirtilebilir.

  • value nesnesi, uygulamanızda daha belirli bir tür olarak belirtilebilir.

Bu yöntemin değerinin genellikle öznitelik biçimindeki XAML kullanımından gelen giriş olduğunu unutmayın. Öznitelik formundan bir metin söz dizimi için değer dönüştürücü desteği olmalı ve GetPropertyNameerişimcisinde özniteliğiniz olmalıdır.

Eklenebilir Üye Mağazaları

Erişimci yöntemleri genellikle eklenebilir üye değerlerini bir nesne grafiğine yerleştirmek veya nesne grafı dışından değer alıp bunları düzgün bir şekilde serileştirmek için bir araç sağlamak için yeterli değildir. Bu işlevselliği sağlamak için, önceki erişimci imzalarındaki target nesnelerin değerleri depolayabilmesi gerekir. Depolama mekanizması, üyenin, eklenebilir üyenin üye listesinde olmadığı hedeflere eklenebilir olduğu eklenebilir üye ilkesiyle tutarlı olmalıdır. .NET XAML Hizmetleri, API'ler IAttachedPropertyStore ve AttachablePropertyServicesaracılığıyla eklenebilir üye depoları için bir uygulama tekniği sağlar. IAttachedPropertyStore, depolama uygulamasını keşfetmek için XAML yazıcıları tarafından kullanılır ve erişimcilerin target türüne uygulanmalıdır. Statik AttachablePropertyServices API'leri, erişimcilerin gövdesinde kullanılır ve AttachableMemberIdentifiereklenebilir üyeye başvurur.

XAML türü sistem bilgilerini .NET XAML Hizmetlerine raporlamak için türlerinizin, üyelerinizin ve derlemelerinizin doğru şekilde dağıtılması önemlidir. Aşağıdaki durumlardan biri geçerliyse raporlama XAML türü sistem bilgileri uygundur:

  • Türlerinizi doğrudan .NET XAML Hizmetleri XAML okuyucularını ve XAML yazıcılarını temel alan XAML sistemleriyle kullanmak istiyorsunuz.
  • Bu XAML okuyucularını 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 XAML ile ilgili her özniteliğin listesi için bkz.Özel Türler ve Kitaplıklar için CLR Öznitelikleri XAML-Related.

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 ek eşlemesi gerekir. Bu yordam bu konuda belgelenmemiştir.

Erişim Düzeyi

XAML, internal erişim düzeyine sahip türleri yüklemek ve örneklemek için bir araç sağlar. Bu özellik, kullanıcı kodunun kendi türlerini tanımlayabilmesi ve aynı kullanıcı kodu kapsamının parçası olan işaretlemeden bu sınıfların örneğini oluşturabilmesi için sağlanır.

Kullanıcı kodu, kullanıcı arabirimi davranışını yeniden düzenlemenin bir yolu olarak amaçlanan ancak public erişim düzeyine sahip destekleyici sınıfı bildirerek ima edilebilecek herhangi bir olası uzantı mekanizmasının parçası olmayan bir UserControl tanımlaması WPF'den örnektir. Bu tür bir UserControl, yedekleme kodu XAML türü olarak başvurulan aynı derlemede derleniyorsa internal erişimle bildirilebilir.

Tam güven altında XAML yükleyen ve XamlObjectWriterkullanan bir uygulama için, internal erişim düzeyine sahip sınıfların yüklenmesi her zaman etkindir.

Kısmi güven altında XAML yükleyen bir uygulama için XamlAccessLevel API'sini kullanarak erişim düzeyi özelliklerini denetleyebilirsiniz. Ayrıca, erteleme mekanizmalarının (WPF şablon sistemi gibi) tüm erişim düzeyi izinlerini yayabilmesi ve bunları son çalışma zamanı değerlendirmeleri için koruyabilmesi gerekir; bu, XamlAccessLevel bilgileri geçirilerek dahili olarak işlenir.

WPF Uygulaması

WPF XAML, BAML kısmi güven altında yüklenirse erişimin BAML kaynağı olan derleme için AssemblyAccessTo kısıtlandığı kısmi güven erişim modeli kullanır. Erteleme için WPF, erişim düzeyi bilgilerini geçirmek için bir mekanizma olarak IXamlObjectWriterFactory.GetParentSettings kullanır.

WPF XAML terminolojisinde iç tür, başvuran XAML'yi de içeren aynı derleme tarafından tanımlanan bir türdür. Böyle bir tür, eşlemenin assembly= bölümünü kasıtlı olarak atlayan bir XAML ad alanıyla eşlenebilir, örneğin, xmlns:local="clr-namespace:WPFApplication1". BAML bir iç türe başvurursa ve bu tür internal erişim düzeyine sahipse, bu derleme için bir GeneratedInternalTypeHelper sınıfı oluşturur. GeneratedInternalTypeHelperönlemek istiyorsanız, public erişim düzeyini kullanmanız veya ilgili sınıfı ayrı bir derlemeye ayırmanız ve bu derlemeyi bağımlı hale getirmeniz gerekir.

Ayrıca bkz.

  • Özel Türler ve Kitaplıklar için CLR Özniteliklerini XAML-Related
  • XAML Hizmetleri