Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konu, XAML söz diziminin öğelerini açıklamak için kullanılan terimleri tanımlar. Bu terimler, hem WPF belgeleri hem de XAML kullanan diğer çerçeveler veya System.Xaml düzeyinde XAML dil desteği tarafından etkinleştirilen temel XAML kavramları için bu belgelerin geri kalanında sık sık kullanılır. Bu konu , WPF'deki XAML konusunda tanıtılan temel terminolojiyi genişletir.
XAML Dil Belirtimi
Burada tanımlanan XAML söz dizimi terminolojisi de XAML dil belirtimi içinde tanımlanır veya başvurulur. XAML, XML tabanlı bir dildir ve XML yapısal kurallarını izler veya genişletir. Terminolojinin bazıları, XML dilini veya XML belgesi nesne modelini açıklarken yaygın olarak kullanılan terminolojiden paylaşılır veya temel alınır.
XAML dil belirtimi hakkında daha fazla bilgi için Microsoft İndirme Merkezi'nden [MS-XAML] dosyasını indirin.
XAML ve CLR
XAML bir işaretleme dilidir. Ortak dil çalışma zamanı (CLR), adından da anlaşılacağı gibi çalışma zamanı yürütmeyi etkinleştirir. XAML, CLR çalışma zamanı tarafından doğrudan kullanılan ortak dillerden biri değildir. Bunun yerine, XAML'yi kendi tür sistemini desteklemek olarak düşünebilirsiniz. WPF tarafından kullanılan belirli XAML ayrıştırma sistemi CLR ve CLR tür sistemi üzerinde oluşturulur. XAML türleri, WPF için XAML ayrıştırıldığında çalışma zamanı temsili oluşturmak amacıyla CLR türlerine dönüştürülür. Bu nedenle, XAML dil belirtimindeki eşdeğer söz dizimi tartışmaları olmasa da, bu belgedeki söz dizimi tartışmalarının geri kalanında CLR tür sistemine başvurular yer alır. (XAML dil belirtimi düzeyine göre XAML türleri, CLR olması gerekmeyen ancak farklı bir XAML ayrıştırıcısının oluşturulmasını ve kullanılmasını gerektiren başka bir tür sisteme eşlenebilir.)
Türlerin Üyeleri ve Sınıf Devralma
Bir WPF türünün XAML üyeleri olarak görünen özellikler ve olaylar genellikle temel türlerden devralınır. Örneğin, şu örneği göz önünde bulundurun: <Button Background="Blue" .../>. Özellik, sınıf tanımına, yansıma sonuçlarına ya da belgelere bakıldığında Background sınıfında hemen bildirilen bir özellik değildir. Bunun yerine, Background temel Control sınıftan devralınır.
WPF XAML öğelerinin sınıf devralma davranışı, XML işaretlemesinin şema tarafından zorlanan yorumlanmasından önemli bir ayrılmadır. Sınıf devralma, özellikle ara temel sınıflar soyut olduğunda veya arabirimler söz konusu olduğunda karmaşık hale gelebilir. Bu, XAML öğeleri kümesinin ve izin verilen özniteliklerinin, genellikle DTD veya XSD biçimi gibi XML programlaması için kullanılan şema türlerini doğru ve tamamen kullanarak gösterilmesinin zor olmasının bir nedenidir. Bir diğer neden de XAML dilinin genişletilebilirlik ve tür eşleme özelliklerinin izin verilen türlerin ve üyelerin herhangi bir sabit gösteriminin tamlığının önüne geçmiş olmasıdır.
Nesne Öğesi Söz Dizimi
Nesne öğesi söz dizimi, bir XML öğesi bildirerek bir CLR sınıfı veya yapısının oluşturulduğu XAML işaretleme söz dizimidir. Bu söz dizimi, HTML gibi diğer işaretleme dillerinin öğe söz dizimine benzer. Nesne öğesi söz dizimi bir sol açılı köşeli ayraç ()< ile başlar ve hemen ardından örneklenen sınıfın veya yapının tür adı gelir. Sıfır veya daha fazla boşluk tür adını izleyebilir ve nesne öğesinde sıfır veya daha fazla öznitelik de bildirilebilir ve her öznitelik name="value" çifti birbirinden ayrılan bir veya daha fazla boşluk olabilir. Son olarak, aşağıdakilerden biri doğru olmalıdır:
Öğe ve etiket eğik çizgi (/) ve ardından hemen bir sağ açılı parantez (>) ile kapatılmalıdır.
Açılış etiketi sağ açılı ayraç (>) ile tamamlanmalıdır. Diğer nesne öğeleri, özellik öğeleri veya iç metin, açılış etiketini izleyebilir. Tam olarak burada bulunabilecek içerik genellikle öğesinin nesne modeli tarafından kısıtlanır. Nesne öğesinin eşdeğer kapanış etiketi de, uygun iç içe yerleştirmede ve diğer açma ve kapatma etiket çiftleriyle dengede bulunmalıdır.
.NET tarafından uygulanan XAML, nesne öğelerini türlere, öznitelikleri özelliklere veya olaylara ve XAML ad alanlarını CLR ad alanlarıyla ve derlemeyle eşleyen bir dizi kurala sahiptir. WPF ve .NET için, XAML nesne öğeleri belirtilmiş derlemelerde tanımlandığı gibi .NET türlerine eşlenir ve özellikler bu türlerin üyeleriyle ilişkilendirilir. XAML'de bir CLR türüne başvurduğunuzda, bu türün devralınan üyelerine de erişiminiz vardır.
Örneğin, aşağıdaki örnek, sınıfın yeni bir örneğini Button oluşturan ve ayrıca bu öznitelik için bir Name öznitelik ve değer belirten nesne öğesi söz dizimidir:
<Button Name="CheckoutButton"/>
Aşağıdaki örnek, XAML içerik özelliği söz dizimini de içeren nesne öğesi söz dizimidir. içinde yer alan iç metin, XAML içerik özelliğini TextBoxayarlamak Text için kullanılır.
<TextBox>This is a Text Box</TextBox>
İçerik Modelleri
Bir sınıf, söz dizimi açısından bir XAML nesne öğesi olarak kullanımı desteklese de, bu öğe yalnızca genel içerik modelinin veya öğe ağacının beklenen konumuna yerleştirildiğinde bir uygulamada veya sayfada düzgün çalışır. Örneğin, bir MenuItem, genellikle yalnızca MenuBase gibi bir Menu türetilmiş sınıfın alt öğesi olarak yerleştirilmelidir. Belirli öğelere yönelik içerik modelleri, XAML öğeleri olarak kullanılabilecek denetimler ve diğer WPF sınıfları için sınıf sayfalarında açıklamaların bir parçası olarak belgelenir.
Nesne Öğelerinin Özellikleri
XAML'deki özellikler çeşitli olası söz dizimleri tarafından ayarlanır. Belirli bir özellik için hangi söz dizimi kullanılabilecek, ayarladığınız özelliğin temel tür sistem özelliklerine göre değişir.
Özelliklerin değerlerini ayarlayarak, nesnelere çalışma zamanı nesne grafında mevcut oldukları gibi özellikler veya özellikler eklersiniz. Bir nesne öğesinden oluşturulan nesnenin ilk durumu parametresiz oluşturucu davranışını temel alır. Uygulamanız genellikle herhangi bir nesnenin tamamen varsayılan örneğinden başka bir şey kullanır.
Öznitelik Sözdizimi (Özellikler)
Öznitelik söz dizimi, var olan bir nesne öğesinde bir öznitelik bildirerek bir özellik için değer ayarlayan XAML işaretleme söz dizimidir. Öznitelik adı, ilgili nesne öğesini destekleyen sınıfın özelliğinin CLR üye adıyla eşleşmelidir. Bir atama operatörü (=) öznitelik adını takip eder. Öznitelik değeri tırnak içine alınmış bir dize olmalıdır.
Uyarı
Bir özniteliğin içine değişmez tırnak işareti yerleştirmek için alternatif tırnak işaretlerini kullanabilirsiniz. Örneğin, içinde çift tırnak karakteri bulunan bir dizeyi ifade etmek için tek tırnakları kullanabilirsiniz. İster tek ister çift tırnak kullanın, öznitelik değeri dizesini açmak ve kapatmak için eşleşen bir çift kullanmalısınız. Ayrıca, belirli bir XAML söz diziminde uygulanan karakter kısıtlamalarına geçici bir çözüm olarak kullanılabilen kaçış dizileri veya başka teknikler de vardır. Bkz. XML Karakter Varlıkları ve XAML.
Öznitelik söz dizimi aracılığıyla ayarlanabilmesi için bir özelliğin genel ve yazılabilir olması gerekir. Yedekleme türü sistemindeki özelliğin değeri bir değer türü veya ilgili yedekleme türüne erişirken bir XAML işlemcisi tarafından örneği oluşturulabilen veya başvurulabilen bir başvuru türü olmalıdır.
WPF XAML olayları için öznitelik adı olarak başvuruda bulunılan olayın genel olması ve bir genel temsilciye sahip olması gerekir.
Özellik veya olay, içeren nesne öğesi tarafından örneği oluşturulmuş olan sınıfın veya yapının bir üyesi olmalıdır.
Öznitelik Değerlerini İşleme
Açma ve kapatma tırnak işaretlerinin içinde yer alan dize değeri bir XAML işlemcisi tarafından işlenir. Özellikler için varsayılan işleme davranışı, temel alınan CLR özelliğinin türüne göre belirlenir.
Öznitelik değeri şu işlem sırası kullanılarak aşağıdakilerden biriyle doldurulur:
XAML işlemcisi bir küme ayracıyla veya MarkupExtension'den türeyen bir nesne öğesiyle karşılaşırsa, işaretleme uzantısı önce değerlendirilir ve değeri dize olarak işlemekte kullanmak yerine, işaretleme uzantısı tarafından döndürülen nesne değer olarak kullanılır. Çoğu durumda, işaretleme uzantısı tarafından döndürülen nesne, var olan bir nesneye başvuru veya çalışma zamanına kadar değerlendirmeyi erteleyen ve yeni örneklendirilen bir nesne olmayan bir ifade olacaktır.
Özellik öznitelikli TypeConverterbir ile bildirilirse veya bu özelliğin değer türü özniteliğiyle TypeConverterbildirilirse, özniteliğin dize değeri tür dönüştürücüye dönüştürme girişi olarak gönderilir ve dönüştürücü yeni bir nesne örneği döndürür.
Eğer TypeConverter yoksa, özellik türüne doğrudan bir dönüşüm denenir. Bu son düzey, XAML dilinin ilkel türleri arasında ayrıştırıcı-özgü değerde doğrudan dönüştürmeyi veya bir numaralandırmadaki adlandırılmış sabitlerin adlarının kontrol edilmesini içerir (ayrıştırıcı eşleşen değerlere erişir).
Numaralandırma Öznitelik Değerleri
XAML'deki numaralandırmalar, XAML ayrıştırıcıları tarafından içsel olarak işlenir ve sabit listesi üyeleri, sabit listesi adlandırılmış sabitlerinden birinin dize adı belirtilerek belirtilmelidir.
Bayrak olmayan numaralandırma değerleri için doğal davranış, bir öznitelik değerinin dizesini işlemek ve bunu numaralandırma değerlerinden biriyle eşleştirmektir. Belirttiğiniz sırada Numaralandırma biçiminde belirtmezsiniz. Kodda yaptığınız gibi Değer. Bunun yerine, yalnızca Değer belirtirsiniz ve Numaralandırma , ayarladığınız özelliğin türüne göre çıkarılır. Eğer Enumeration.Value biçiminde bir öznitelik belirtirseniz, doğru biçimde çözümlenmez.
Bayrak tabanlı numaralandırmalar için davranış yöntemine Enum.Parse dayanır. Her değeri virgülle ayırarak bayrak yönünde numaralandırma için birden çok değer belirtebilirsiniz. Ancak, bayrak yönünde olmayan numaralandırma değerlerini birleştiremezsiniz. Örneğin, bayraksız bir enum üzerinde birden fazla koşula etki eden bir Trigger oluşturmak için virgül söz dizimini kullanamazsınız.
<!--This will not compile, because Visibility is not a flagwise enumeration.-->
...
<Trigger Property="Visibility" Value="Collapsed,Hidden">
<Setter ... />
</Trigger>
...
XAML'de ayarlanabilir öznitelikleri destekleyen bayrak düzeyinde numaralandırmalar WPF'de nadirdir. Ancak bu tür bir numaralandırma şudur StyleSimulations. Örneğin, sınıfı için Açıklamalar bölümünde sağlanan örneği değiştirmek için virgülle ayrılmış bayrak düzeyinde öznitelik söz dizimini Glyphs kullanabilirsiniz; StyleSimulations = "BoldSimulation" olabilir StyleSimulations = "BoldSimulation,ItalicSimulation".
KeyBinding.Modifiers , birden fazla numaralandırma değerinin belirtilebildiği başka bir özelliktir. Ancak, numaralandırma kendi tür dönüştürücüsünü desteklediğinden ModifierKeys bu özellik özel bir durum olur. Değiştiriciler için tür dönüştürücüsü virgül (,) yerine sınırlayıcı olarak artı işareti (+) kullanır. Bu dönüştürme, Microsoft Windows programlamasında "Ctrl+Alt" gibi tuş bileşimlerini temsil eden daha geleneksel söz dizimini destekler.
Özellikler ve Olay Üyesi Adı Referansları
Bir öznitelik belirtirken, içeren nesne öğesi için örneklediğiniz CLR türünün üyesi olarak var olan herhangi bir özelliğe veya olaya başvurabilirsiniz.
İsterseniz, içeren nesne öğesinden bağımsız olarak ekli bir özelliğe veya ekli olaya başvurabilirsiniz. (Eklenen özellikler yaklaşan bir bölümde ele alınıyor.)
Ayrıca, typeName kullanarak varsayılan ad alanı üzerinden erişilebilen herhangi bir nesneden herhangi bir olayı adlandırabilirsiniz. kısmen nitelenmiş olay adı; Bu söz dizimi, işleyicinin alt öğelerden olay yönlendirmeyi işlemeye yönelik olduğu, ancak üst öğenin de üyeler tablosunda bu olaya sahip olmadığı yönlendirilmiş olaylar için işleyiciler eklemeyi destekler. Bu söz dizimi ekli bir olay söz dizimine benzer, ancak buradaki olay gerçek bir ekli olay değildir. Bunun yerine, tanımlı bir isimle bir olaya atıfta bulunursunuz. Daha fazla bilgi için bkz. Yönlendirilmiş Olaylara Genel Bakış.
Bazı senaryolarda özellik adları bazen öznitelik adı yerine özniteliğin değeri olarak sağlanır. Bu özellik adı, ownerType formunda belirtilen özellik gibi niteleyicileri de içerebilir. dependencyPropertyName. Bu senaryo, XAML'de stil veya şablon yazarken yaygındır. Öznitelik değeri olarak sağlanan özellik adlarının işleme kuralları farklıdır ve ayarlanan özelliğin türüne veya belirli WPF alt sistemlerinin davranışlarına göre yönetilir. Ayrıntılar için bkz. Stil oluşturma ve Şablon Oluşturma.
Özellik adları için başka bir kullanım, bir öznitelik değerinin özellik-özellik ilişkisini tanımlamasıdır. Bu özellik, veri bağlama ve hikaye panosu hedefleri için kullanılır ve PropertyPath sınıfı ile tür dönüştürücüsü tarafından etkinleştirilir. Arama semantiğinin daha eksiksiz bir açıklaması için bkz. PropertyPath XAML Sözdizimi.
Özellik Öğesi Sözdizimi
Özellik öğesi söz dizimi , öğeler için temel XML söz dizimi kurallarından biraz ayrılan bir söz dizimidir. XML'de, bir özniteliğin değeri fiili bir dizedir ve tek olası varyasyon hangi dize kodlama biçiminin kullanıldığıdır. XAML'de, diğer nesne öğelerini bir özelliğin değeri olacak şekilde atayabilirsiniz. Bu özellik, özellik öğesi söz dizimi tarafından etkinleştirilir. özelliği, öğe etiketinde bir öznitelik olarak belirtilmekte yerine, elementTypeName içinde bir açılış öğesi etiketi kullanılarak belirtilir. propertyName formu, özelliğin değeri içinde belirtilir ve ardından özellik öğesi kapatılır.
Özellikle, söz dizimi sol açılı ayraç ()< ile başlar ve hemen ardından özellik öğesi söz diziminin içinde bulunduğu sınıfın veya yapının tür adı gelir. Bunu hemen tek bir nokta (.) ve ardından bir özelliğin adı ve ardından dik açılı ayraç (> ) izler. Öznitelik söz diziminde olduğu gibi, bu özelliğin belirtilen türün bildirilen ortak üyeleri içinde mevcut olması gerekir. Özelliğine atanacak değer, özellik öğesinde yer alır. Genellikle, değer bir veya daha fazla nesne öğesi olarak verilir, çünkü nesneleri değer olarak belirtmek, özellik öğesi söz diziminin ele almak üzere tasarlandığı senaryodur. Son olarak, aynı elementTypeName ve propertyName birleşimini belirten eşdeğer bir kapanış etiketi sağlanmalı, diğer öğe etiketleriyle doğru iç içe yerleştirme ve denge içinde olmalıdır.
Örneğin, ContextMenu'in Button özelliği için özellik öğesi söz dizimi aşağıdaki gibidir.
<Button>
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="1">First item</MenuItem>
<MenuItem Header="2">Second item</MenuItem>
</ContextMenu>
</Button.ContextMenu>
Right-click me!</Button>
Bir özellik öğesi içindeki değer, belirtilen özellik türünün gibi ilkel bir değer türü Stringveya bir adın belirtildiği bir numaralandırma olduğu durumlarda iç metin olarak da verilebilir. Bu iki kullanım biraz nadirdir, çünkü bu durumların her biri daha basit bir öznitelik söz dizimi de kullanabilir. Bir özellik öğesini dizeyle doldurmak için bir senaryo, XAML içerik özelliği olmayan ancak ui metninin gösterimi için hala kullanılan özelliklere yöneliktir ve satır beslemeleri gibi belirli boşluk öğelerinin bu kullanıcı arabirimi metninde görünmesi gerekir. Öznitelik söz dizimi satır akışlarını koruyamaz, ancak önemli boşluk koruması etkin olduğu sürece özellik öğesi söz dizimi koruyabilir (ayrıntılar için bkz. XAML'de boşluk işleme). Başka bir senaryo, x:Uid Yönergesinin özellik öğesine uygulanabilmesi ve bu nedenle içindeki değeri WPF çıkış BAML'sinde veya diğer tekniklerde yerelleştirilmesi gereken bir değer olarak işaretlemektir.
Bir özellik öğesi WPF mantıksal ağacında temsil edilmemektedir. Özellik öğesi, bir özelliği ayarlamak için yalnızca belirli bir söz dizimidir ve bunu destekleyen bir örneği veya nesnesi olan bir öğe değildir. (Mantıksal ağaç kavramıyla ilgili ayrıntılar için bkz . WPF'deki Ağaçlar.)
Hem öznitelik hem de özellik öğesi söz diziminin desteklendiği özellikler için iki söz dizimi genellikle aynı sonuca sahiptir, ancak boşluk işleme gibi incelikler söz dizimleri arasında biraz farklılık gösterebilir.
Koleksiyon Söz Dizimi
XAML belirtimi, değer türünün bir koleksiyon olduğu özellikleri tanımlamak için XAML işlemcisi uygulamalarını gerektirir. .NET'teki genel XAML işlemci uygulaması yönetilen kodu ve CLR'yi temel alır ve koleksiyon türlerini aşağıdakilerden biri aracılığıyla tanımlar:
Tür uygular IList.
Tür uygular IDictionary.
Tür Array türetilmiştir (XAML'deki diziler hakkında daha fazla bilgi için bkz. x:Array Biçimlendirmesi Uzantısı.)
Bir özelliğin türü bir koleksiyonsa, çıkarsanan koleksiyon türünün işaretlemede bir nesne öğesi olarak belirtilmesi gerekmez. Bunun yerine, koleksiyondaki öğeler haline gelmesi amaçlanan öğeler özellik öğesinin bir veya daha fazla alt öğesi olarak belirtilir. Bu tür her öğe, yükleme sırasında bir nesneye değerlendirilir ve örtük koleksiyonun Add yöntemi çağrılarak koleksiyona eklenir. Örneğin, Triggers'in özelliği, Style uygulamasını gerçekleştiren TriggerCollection özel koleksiyon türünü alır. İşaretlemede bir TriggerCollection nesne öğesinin örneğini oluşturmak gerekli değildir. Bunun yerine, Trigger özelliği öğesi içinde eleman olarak bir veya daha fazla Style.Triggers öğe belirtirsiniz; burada Trigger (veya türetilmiş bir sınıf), kesin olarak yazılan ve örtük TriggerCollection öğe türü olarak beklenen türdür.
<Style x:Key="SpecialButton" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="Button.IsMouseOver" Value="true">
<Setter Property = "Background" Value="Red"/>
</Trigger>
<Trigger Property="Button.IsPressed" Value="true">
<Setter Property = "Foreground" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
Özellik hem koleksiyon türü hem de bu tür ve türetilmiş türler için XAML içerik özelliği olabilir ve bu konu başlığının sonraki bölümünde ele alınmıştır.
Örtük koleksiyon öğesi, işaretlemede bir öğe olarak görünmese bile mantıksal ağaç gösteriminde bir üye oluşturur. Genellikle ebeveyn türün kurucusu, özelliklerinden biri olan koleksiyonun örneklemesini gerçekleştirir ve başlangıçta boş olan koleksiyon nesne ağacının bir parçası olur.
Uyarı
Genel liste ve sözlük arabirimleri (IList<T> ve IDictionary<TKey,TValue>) koleksiyon algılama için desteklenmez. Ancak, List<T> sınıfını doğrudan IList adlı sınıfı uyguladığı için bir temel sınıf olarak veya Dictionary<TKey,TValue> sınıfını doğrudan IDictionary adlı sınıfı uyguladığı için bir temel sınıf olarak kullanabilirsiniz.
Koleksiyon türleri için .NET Başvuru sayfalarında, bir koleksiyon için nesne öğesinin kasıtlı olarak atlandığı bu söz dizimi, XAML söz dizimi bölümlerinde zaman zaman Örtük Koleksiyon Söz Dizimi olarak belirtilir.
Kök öğe dışında, başka bir öğenin alt öğesi olarak iç içe yerleştirilmiş bir XAML dosyasındaki her nesne öğesi, şu durumlardan biri veya her ikisi de olan bir öğedir: üst öğesinin örtük koleksiyon özelliğinin üyesi veya üst öğe için XAML içerik özelliğinin değerini belirten bir öğedir (XAML içerik özellikleri sonraki bölümde ele alınacaktır). Başka bir deyişle, bir işaretleme sayfasındaki üst öğelerin ve alt öğelerin ilişkisi kökte gerçekten tek bir nesnedir ve kökün altındaki her nesne öğesi, üst öğenin özellik değerini sağlayan tek bir örnek ya da aynı zamanda üst öğenin koleksiyon türü özellik değeri olan bir koleksiyon içindeki öğelerden biridir. Bu tek kök kavram XML ile ortaktır ve gibi LoadXAML yükleyen API'lerin davranışında sıklıkla güçlendirilir.
Aşağıdaki örnek, bir koleksiyonun (GradientStopCollection) nesne öğesinin açıkça belirtildiği bir söz dizimidir.
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
Koleksiyonu açıkça bildirmenin her zaman mümkün olmadığını unutmayın. Örneğin, daha önce gösterilen TriggerCollection örnekte açıkça bildirme Triggers girişimi başarısız olur. Koleksiyonu açıkça bildirmek için koleksiyon sınıfının parametresiz bir oluşturucuyu desteklemesi gerekir ve TriggerCollection parametresiz oluşturucu yoktur.
XAML İçerik Özellikleri
XAML içerik söz dizimi, yalnızca sınıf bildiriminin bir parçası olarak öğesini belirten ContentPropertyAttribute sınıflarda etkinleştirilen bir söz dizimidir. , ContentPropertyAttribute bu öğe türü (türetilmiş sınıflar dahil) için içerik özelliği olan özellik adına başvurur. Bir XAML işlemcisi tarafından işlendiğinde, nesne öğesinin açma ve kapatma etiketleri arasında bulunan tüm alt öğeler veya iç metin, bu nesnenin XAML içerik özelliğinin değeri olacak şekilde atanır. İçerik özelliği için açık özellik öğeleri belirtmenize izin verilir, ancak bu kullanım genel olarak .NET başvurusunun XAML söz dizimi bölümlerinde gösterilmez. Açık/ayrıntılı teknik, işaretleme netliği veya işaretleme stili açısından ara sıra değere sahiptir, ancak genellikle içerik özelliğinin amacı işaretlemeyi kolaylaştırarak üst-alt öğe olarak sezgisel olarak ilişkili öğelerin doğrudan iç içe yerleştirilebilmesini sağlamaktır. Bir öğedeki diğer özellikler için özellik öğesi etiketleri, katı bir XAML dil tanımı başına "içerik" olarak atanmamış; bunlar daha önce XAML ayrıştırıcısının işlem sırasında işlenir ve "içerik" olarak kabul edilmez.
XAML İçerik Özelliği Değerleri Bitişik Olmalıdır
Bir XAML içerik özelliğinin değeri, bu nesne öğesindeki diğer özellik öğelerinden önce veya tamamen sonra verilmelidir. Bir XAML içerik özelliğinin değerinin dize olarak mı yoksa bir veya daha fazla nesne olarak mı belirtildiği doğrudur. Örneğin, aşağıdaki işaretleme ayrıştırılamaz.
<Button>I am a
<Button.Background>Blue</Button.Background>
blue button</Button>
Bu temelde geçersizdir, çünkü bu söz dizimi içerik özelliği için özellik öğesi söz dizimi kullanılarak açık hale getirilseydi, içerik özelliği iki kez ayarlanırdı:
<Button>
<Button.Content>I am a </Button.Content>
<Button.Background>Blue</Button.Background>
<Button.Content> blue button</Button.Content>
</Button>
Benzer şekilde geçersiz bir örnek, içerik özelliğinin bir koleksiyon olması ve alt öğelerin özellik öğeleriyle kesiştiği durumdur:
<StackPanel>
<Button>This example</Button>
<StackPanel.Resources>
<SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
</StackPanel.Resources>
<Button>... is illegal XAML</Button>
</StackPanel>
İçerik Özellikleri ve Derleme Söz Dizimi Birleşimi
İçerik olarak tek bir nesne öğesinden fazlasını kabul etmek için içerik özelliğinin türü özel olarak bir koleksiyon türü olmalıdır. Koleksiyon türleri için özellik öğesi söz dizimine benzer şekilde, bir XAML işlemcisi koleksiyon türü olan türleri tanımlamalıdır. Bir öğenin XAML içerik özelliği varsa ve XAML içerik özelliğinin türü bir koleksiyonsa, örtük koleksiyon türünün işaretlemede bir nesne öğesi olarak belirtilmesi gerekmez ve XAML içerik özelliğinin özellik öğesi olarak belirtilmesi gerekmez. Bu nedenle, işaretlemedeki görünen içerik modelinde artık içerik olarak birden fazla alt öğe atanabilir. Türetilmiş bir Panel sınıf için içerik söz dizimi aşağıdadır. Tüm Panel türetilmiş sınıflar, XAML içerik özelliğini Children olarak belirler ve türünde UIElementCollection bir değer gerektirir.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<StackPanel>
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>Button 3</Button>
</StackPanel>
</Page>
İşaretlemede ne Children öğesi için özellik ne de UIElementCollection öğesi gereklidir. Bu, XAML'nin bir tasarım özelliğidir, böylece kullanıcı arabirimini tanımlayan özyinelemeli olarak bulunan öğeler, özellik öğesi etiketlerine veya koleksiyon nesnelerine müdahale etmeden hemen üst-alt öğe ilişkilerine sahip iç içe öğeler ağacı olarak daha sezgisel bir şekilde temsil edilir. Aslında, UIElementCollection işaretlemede tasarım gereği nesne öğesi olarak açıkça belirtilemez. Tek amaçlanan kullanımı örtük bir koleksiyon olduğundan, UIElementCollection genel parametresiz bir oluşturucuyu kullanıma sunmaz ve bu nedenle nesne öğesi olarak örneği oluşturulamaz.
Bir Nesnedeki Özellik Öğelerini ve Nesne Öğelerini İçerik Özelliğiyle Karıştırma
XAML belirtimi, bir XAML işlemcisinin bir nesne öğesi içindeki XAML içerik özelliğini doldurmak için kullanılan nesne öğelerinin ardışık olmasını ve karıştırılmamasını zorunlu kılabileceğini bildirir. Özellik öğelerinin ve içeriğin karıştırılmasıyla ilgili bu kısıtlama WPF XAML işlemcileri tarafından uygulanır.
Bir nesne öğesi içinde ilk anında işaretleme olarak bir alt nesne öğesine sahip olabilirsiniz. Ardından özellik öğelerini tanıtabilirsiniz. Alternatif olarak, bir veya daha fazla özellik öğesi, sonra içerik ve daha fazla özellik öğesi belirtebilirsiniz. Ancak bir özellik öğesi içeriği takip ettikten sonra başka içerik ekleyemezsiniz, yalnızca özellik öğeleri ekleyebilirsiniz.
Bu içerik / özellik öğesi sırası gereksinimi, içerik olarak kullanılan iç metne uygulanmaz. Ancak, özellik öğeleri iç metinle iç içe geçtiğinde, işaretlemedeki önemli boşlukların algılanması zor olabileceğinden, iç metni bitişik tutmak yine de iyi bir işaretleme stilidir.
XAML Ad Alanları
Yukarıdaki söz dizimi örneklerinden hiçbiri varsayılan XAML ad alanı dışında bir XAML ad alanı belirtmedi. Tipik WPF uygulamalarında, varsayılan XAML ad alanı WPF ad alanı olarak belirtilir. Varsayılan XAML ad alanı dışında XAML ad alanları belirtebilir ve yine de benzer söz dizimini kullanabilirsiniz. Ancak, varsayılan XAML ad alanında erişilmeyen bir sınıfın adlandırıldığı her yerde, bu sınıf adının önüne ilgili CLR ad alanına eşlenen XAML ad alanının ön eki eklenmelidir. Örneğin, <custom:Example/> sınıfının Example örneğini oluşturmak için nesne öğesi söz dizimidir; burada bu sınıfı içeren CLR ad alanı (ve muhtemelen destekleyici türleri içeren dış derleme bilgileri) daha önce custom ön ekine eşlenmiştir.
XAML ad alanları hakkında daha fazla bilgi için bkz. WPF XAML için XAML Ad Alanları ve Ad Alanı Eşlemesi.
İşaretlemeyi Genişletme
XAML, dize öznitelik değerlerinin veya nesne öğelerinin normal XAML işlemci işlemesinden kaçış sağlayan ve işlemeyi bir yedekleme sınıfına saptıran bir işaretleme uzantısı programlama varlığı tanımlar. XAML işlemcisinin öznitelik söz dizimi kullanarak bir işaretleme uzantısını tanıması için kullanılan karakter, açılış küme ayracıdır ({) ve bu, kapanış küme ayracı (}) dışında herhangi bir karakterle takip edilmelidir. Açılış küme parantezinden sonraki ilk dize, belirli uzantı davranışını sağlayan sınıfa referans vermelidir. Bu referansın, "Extension" alt dizesi gerçek sınıf adının bir parçasıysa, bu alt dizeyi atlayabileceği belirtilmelidir. Bundan sonra tek bir boşluk oluşabilir ve ardından ardışık her bir karakter, kapanış küme ayracıyla karşılaşılana kadar uzantı uygulaması tarafından girdiye alınır.
.NET XAML uygulaması, WPF tarafından desteklenen tüm işaretleme uzantılarının yanı sıra diğer çerçeveler veya teknolojiler için temel olarak MarkupExtension soyut sınıfını kullanır. WPF'nin özel olarak uyguladığı işaretleme uzantıları genellikle var olan diğer nesnelere başvurmak veya çalışma zamanında değerlendirilecek nesnelere ertelenmiş başvurular yapmak için bir araç sağlamaya yöneliktir. Örneğin, basit bir WPF veri bağlaması, belirli bir özelliğin {Binding} normalde alacağı değerin yerine işaretleme uzantısı belirtilerek gerçekleştirilir. WPF işaretleme uzantılarının çoğu, öznitelik söz diziminin mümkün olmadığı özellikler için öznitelik söz dizimini etkinleştirir. Örneğin, bir Style nesne, iç içe yerleştirilmiş bir dizi nesne ve özellik içeren nispeten karmaşık bir türdür. WPF'deki stiller genellikle ResourceDictionary içinde bir kaynak olarak tanımlanır ve ardından kaynağa ihtiyaç duyan iki WPF işaretleme uzantısından biri aracılığıyla başvurulur. İşaretleme uzantısı, özellik değerinin değerlendirilmesini bir kaynak araması ile erteleme işlevi görür ve aşağıdaki örnekte gösterildiği gibi türü Style olan Style özelliğinin değerinin öznitelik söz diziminde belirtilmesine olanak tanır.
<Button Style="{StaticResource MyStyle}">My button</Button>
Burada, StaticResource işaretleme uzantısı uygulamasını sağlayan sınıfı tanımlar StaticResourceExtension . Sonraki MyStyle dizesi, StaticResourceExtension varsayılan olmayan oluşturucunun girişi olarak kullanılır, burada uzantı dizesinden alınan parametre istenen ResourceKey'yi belirtir.
MyStylekaynak olarak tanımlanan bir öğesinin Style değeri olması beklenir.
StaticResource İşaretleme Uzantısı kullanımı, kaynağın yükleme zamanında statik kaynak arama mantığı ile Style özellik değerini sağlaması için kullanılmasını talep eder.
biçimlendirme uzantıları hakkında daha fazla bilgi için bkz . İşaretlemeyi Genişletmeler ve WPF XAML. Genel .NET XAML uygulamasında etkinleştirilen işaretleme uzantılarına ve diğer XAML programlama özelliklerine başvuru için bkz. XAML Ad Alanı (x:) Dil Özellikleri. WPF'ye özgü işaretleme uzantıları için bkz. WPF XAML Uzantıları.
İliştirilmiş Özellikler
Ekli özellikler, özelliklerin belirli bir türe ait olabileceği ve tanımlanabildiği ancak herhangi bir öğede öznitelik veya özellik öğeleri olarak ayarlandığı XAML'de tanıtılan bir programlama kavramıdır. Ekli özelliklerin amaçlandığı birincil senaryo, tüm öğeler arasında kapsamlı bir paylaşılan nesne modeli gerektirmeden bir üst öğeye bilgi raporlamak için işaretleme yapısındaki alt öğelerin etkinleştirilmesini sağlamaktır. Buna karşılık, ekli özellikler üst öğeler tarafından bilgileri alt öğelere bildirmek için kullanılabilir. Ekli özelliklerin amacı ve kendi ekli özelliklerinizi oluşturma hakkında daha fazla bilgi için bkz. Ekli Özelliklere Genel Bakış.
Ekli özellikler, özellik öğesi söz dizimine yüzeysel olarak benzeyen bir typeName.propertyName bileşimi kullanan bir söz dizimi kullanır. İki önemli fark vardır:
typeName.propertyName bileşimini, öznitelik söz dizimi aracılığıyla bir ekli özellik ayarlarken de kullanabilirsiniz. Özellik adını nitelemenin öznitelik söz diziminde bir gereksinim olduğu tek durum ekli özelliklerdir.
Ekli özellikler için özellik öğesi söz dizimlerini de kullanabilirsiniz. Ancak, tipik özellik öğesi söz dizimi için, belirttiğiniz typeName , özellik öğesini içeren nesne öğesidir. Ekli bir özelliğe başvuruda bulunursanız typeName , ekli özelliği tanımlayan sınıftır, içeren nesne öğesini değil.
İliştirilmiş Olaylar
Ekli olaylar, olayların belirli bir tür tarafından tanımlanabildiği ancak işleyicilerin herhangi bir nesne öğesine eklenebildiği XAML'de sunulan başka bir programlama kavramıdır. WOF uygulamasında, genellikle ekli olayı tanımlayan tür, bir hizmeti tanımlayan statik türdür ve bazen bu ekli olaylar, hizmeti sağlayan türlerde yönlendirilmiş bir olay takma adı ile yayılır. Ekli olayların işleyicileri öznitelik söz dizimi aracılığıyla belirtilir. Ekli olaylarda olduğu gibi, öznitelik söz dizimi, bir typeName'e izin vermek üzere ekli olaylar için genişletilir. eventName kullanımı, burada typeName ekli olay altyapısı için ve Add olay işleyicisi erişimcileri sağlayan Remove sınıftır ve eventName olay adıdır.
XAML Kök Öğesinin Anatomisi
Aşağıdaki tabloda, bir kök öğenin belirli özniteliklerini gösteren, ayrılmış tipik bir XAML kök öğesi gösterilmektedir:
| Özellik | Açıklama |
|---|---|
<Page |
Kök öğenin nesne elemanı açılıyor |
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
Varsayılan (WPF) XAML ad alanı |
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
XAML dili ve XAML ad alanı |
x:Class="ExampleNamespace.ExampleCode" |
İşaretlemeyi kısmi sınıf için tanımlanan herhangi bir arka planda koda bağlayan kısmi sınıf bildirimi |
> |
Kök için nesne öğesinin sonu. Öğe alt öğeler içerdiğinden nesne henüz kapatılmadı |
İsteğe Bağlı ve Yaygın Olmayan XAML Kullanımları
Aşağıdaki bölümlerde, XAML işlemcileri tarafından teknik olarak desteklenen, ancak XAML kaynakları içeren uygulamalar geliştirirken XAML dosyalarının insan tarafından okunabilir kalmasını engelleyen ayrıntı veya diğer estetik sorunlar üreten XAML kullanımları açıklanmaktadır.
İsteğe Bağlı Özellik Öğesi Kullanımları
İsteğe bağlı özellik öğesi kullanımları, XAML işlemcisinin örtük olarak değerlendirdiğini açıkça öğe içerik özelliklerini yazmayı içerir. Örneğin, bir Menu öğesinin içeriğini bildirdiğinizde, Items koleksiyonunu açıkça bir Menu özellik öğesi etiketi olarak bildirmeyi ve her bir <Menu.Items> öğesini MenuItem içine yerleştirmeyi seçebilirsiniz. Bu, tüm alt öğelerin <Menu.Items> bir Menu olması ve MenuItem koleksiyonuna yerleştirilmesi gereken örtük XAML işlemci davranışını kullanmanın yerine geçer. Bazen isteğe bağlı kullanımlar, işaretlemede gösterildiği gibi nesne yapısını görsel olarak netleştirmeye yardımcı olabilir. Ya da bazen açık özellik öğesi kullanımı teknik olarak işlevsel ancak görsel açıdan kafa karıştırıcı olan, bir öznitelik değeri içindeki iç içe işaretleme uzantıları gibi işaretlemeleri önleyebilir.
Tam typeName.memberName Nitelenmiş Öznitelikler
typeName. bir özniteliğin memberName formu aslında yalnızca yönlendirilen olay durumundan daha evrensel çalışır. Ancak diğer durumlarda bu form gereksizdir ve yalnızca işaretleme stili ve okunabilirlik nedeniyle bu durumdan kaçınmalısınız. Aşağıdaki örnekte, özniteliğine yapılan üç başvurunun Background her biri tamamen eşdeğerdir:
<Button Background="Blue">Background</Button>
<Button Button.Background="Blue">Button.Background</Button>
<Button Control.Background="Blue">Control.Background</Button>
Button.Background üzerinde ilgili özelliğin Button nitelenmiş aramanın başarılı olmasıBackground (Denetimden devralındı) ve Button nesne öğesinin ya da onun temel sınıfının bir sınıfı olması sebebiyle çalışır. Control.Background çalışır çünkü Control sınıfı aslında Background ve Control tanımlar ve Control bir temel sınıftır.
Ancak, aşağıdaki typeName. memberName form örneği çalışmıyor ve bu nedenle açıklamalı olarak gösteriliyor:
<!--<Button Label.Background="Blue">Does not work</Button> -->
Label, Control olan başka bir türetilmiş sınıftır ve bir Label.Background nesne öğesi içinde Label belirtmiş olsaydınız, bu kullanım işe yarardı. Ancak, Label sınıfı veya temel sınıfı Button olmadığından, belirtilen XAML işlemci davranışı gereği Label.Background ekli bir özellik olarak işlenir.
Label.Background kullanılabilir bir ekli özellik değildir ve bu kullanım başarısız olur.
baseTypeName.memberName Özellik Öğeleri
typeName.memberName formunun öznitelik söz diziminde nasıl çalıştığına benzer şekilde, baseTypeName.memberName sözdizimi, özellik öğesi sözdiziminde çalışır. Örneğin, aşağıdaki söz dizimi çalışır:
<Button>Control.Background PE
<Control.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="LimeGreen" Offset="1.0" />
</LinearGradientBrush>
</Control.Background>
</Button>
Burada, özellik öğesi Control.Background içinde yer almasına rağmen, Button olarak verilmiştir.
Ancak öznitelikler için typeName.memberName formu gibi, baseTypeName.memberName işaretlemede kötü bir stildir ve bundan kaçınmalısınız.
Ayrıca bakınız
.NET Desktop feedback