Ayrıntılı XAML Sözdizimi
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. WPF için XAML ayrıştırıldığında bir çalışma zamanı gösterimi örneği oluşturmak için XAML türleri CLR türlerine eşlenir. 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" .../>
. Sınıf tanımına Background , yansıma sonuçlarına Button veya belgelere göz atacaksanız, özelliği sınıfta 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 örneğini oluşturan 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 dik açılı ayraç (> ) ile kapatılmalıdır.
Açma etiketi dik 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 başvuruda bulunan derlemelerde tanımlandığı gibi .NET türlerine eşler ve öznitelikler bu türlerin üyeleriyle eşler. 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 Textayarlamak TextBox için kullanılır.
<TextBox>This is a Text Box</TextBox>
İçerik Modelleri
Sınıf, söz dizimi açısından bir XAML nesne öğesi olarak kullanımı desteklese de, bu öğe yalnızca bir uygulama veya sayfada yalnızca genel con çadır modu l veya öğe ağacının beklenen konumuna yerleştirildiğinde düzgün çalışır. Örneğin, bir MenuItem genellikle yalnızca gibi türetilmiş bir MenuBase sınıfın alt öğesi olarak Menuyerleştirilmelidir. Belirli öğeler için con çadır modu ls, 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. Öznitelik adını bir atama işleci (=) izler. Öznitelik değeri tırnak içine alınmış bir dize olmalıdır.
Dekont
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 içeren bir dizeyi bildirmek için tek tırnakları bir araç olarak 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ı veya öğesinden MarkupExtensiontüretilen bir nesne öğesiyle karşılaşırsa, başvuruda bulunan işaretleme uzantısı değeri dize olarak işlemek yerine önce değerlendirilir ve 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 engelleyen 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.
TypeConverteryoksa, özellik türüne doğrudan dönüştürme denenir. Bu son düzey, XAML dili ilkel türleri arasındaki ayrıştırıcı yerel değerinde doğrudan dönüştürme veya bir numaralandırmadaki adlandırılmış sabitlerin adlarının denetlenmesidir (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.
Şişirmeyen sabit listesi değerleri için yerel davranış, bir öznitelik değerinin dizesini işlemek ve numaralandırma değerlerinden biriyle çözümlemektir. Numaralandırmayı Numaralandırma biçiminde belirtmezseniz.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. Sabit Listesi'nde bir öznitelik belirtirseniz.Değer formu, doğru çö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, bir iltihapsız numaralandırmanın birden çok koşuluna göre hareket 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, böyle bir numaralandırmadır 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ı Başvuruları
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.olay kısmen nitelenmiş ad; bu söz dizimi, işleyicinin alt öğelerden olay yönlendirmeyi işlemeye yönelik olduğu, ancak üst öğenin de üye 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, nitelenmiş bir ada sahip bir olaya başvuruda 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 görsel taslak hedefleri için kullanılır ve sınıfı ve türü dönüştürücüsü tarafından PropertyPath 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 değerini belirten eşdeğer bir kapanış etiketi.propertyName bileşimi, doğru iç içe yerleştirme ve diğer öğe etiketleriyle dengede sağlanmalıdır.
Örneğin, bir özelliğinin özellik öğesi söz dizimi ContextMenu aşağıda verilmiştir Button.
<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 türetilir Array (XAML'deki diziler hakkında daha fazla bilgi için bkz . x:Dizi İşaretlemeyi 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 özelliği, TriggersStyle uygulamasını uygulayan IListözel koleksiyon türünü TriggerCollectionalır. İşaretlemede bir TriggerCollection nesne öğesinin örneğini oluşturmak gerekli değildir. Bunun yerine, bir veya daha fazla Trigger öğeyi özellik öğesi içinde Style.Triggers
öğe olarak 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 üst türün oluşturucu, özelliklerinden biri olan koleksiyon için örnekleme gerçekleştirir ve başlangıçtaki boş koleksiyon nesne ağacının bir parçası olur.
Dekont
Genel liste ve sözlük arabirimleri (IList<T> ve IDictionary<TKey,TValue>) 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 IDictionaryIList bir temel sınıf olarak kullanabilirsinizList<T>.
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 Triggers örnekte açıkça bildirme TriggerCollection 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ılmaz:
<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 Koleksiyon Söz Dizimi Birleşik
İç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ünür con çadır modu l artık içerik olarak atanmış birden fazla alt öğeye sahip olabilir. 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, türünde UIElementCollectionbir değer gerektiren XAML içerik özelliğini olarak Childrenoluşturur.
<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>
İşaretlemeyi ne için Children özellik öğesinin ne de öğesinin UIElementCollection gerekli olmadığını unutmayın. 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 öğelerini zorunlu kılabileceğini ve karıştırılmaması gerektiğ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 öğelerinin iç metinle kesiştiğinde işaretlemede önemli boşluklar algılanması zor olabileceğinden, iç metni bitişik tutmak yine de iyi bir işaretleme stilidir.
XAML Ad Uzayları
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 Example
örneğini örneğini oluşturan nesne öğesi söz dizimidir; burada bu sınıfı içeren CLR ad alanı (ve muhtemelen yedekleme türleri içeren dış derleme bilgileri) önceden ön eke custom
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.
İşaretleme Uzantıları
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. Öznitelik söz dizimi kullanılırken XAML işlemcisinin işaretleme uzantısını tanımlayan karakter, açılış küme ayracı ({) ve ardından kapanış küme ayracı (}) dışında bir karakterdir. Açılış küme ayracından sonraki ilk dize, belirli bir uzantı davranışını sağlayan sınıfa başvurmalıdır. Burada, alt dize gerçek sınıf adının bir parçasıysa, başvuru "Uzantı" alt dizesini atlar. Bundan sonra tek bir boşluk görüntülenebilir ve ardından her bir başarılı karakter, kapanış küme ayracıyla karşılaşılana kadar uzantı uygulaması tarafından giriş olarak kullanılı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 soyut sınıfını kullanır MarkupExtension . 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 içinde ResourceDictionarybir kaynak olarak tanımlanır ve ardından kaynak isteyen iki WPF işaretleme uzantısından biri aracılığıyla başvurulur. İşaretleme uzantısı, özellik değerinin bir kaynak aramasına değerlendirilmesini geçersiz kılar ve aşağıdaki örnekte olduğu gibi öznitelik söz diziminde türü Stylealarak özelliğin Style değerinin sağlanmasını sağlar:
<Button Style="{StaticResource MyStyle}">My button</Button>
Burada, StaticResource
işaretleme uzantısı uygulamasını sağlayan sınıfı tanımlar StaticResourceExtension . Sonraki dize, uzantı dizesinden MyStyle
alınan parametresinin isteneni ResourceKeybildirdiği varsayılan StaticResourceExtension olmayan oluşturucunun girişi olarak kullanılır. MyStyle
kaynak olarak tanımlanan bir Style öğesinin x:Key değeri olması beklenir. StaticResource İşaretlemeyi Uzantısı kullanımı, kaynağın özellik değerini yükleme zamanında statik kaynak arama mantığı aracılığıyla sağlamak Style için kullanılmasını istemektedir.
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ı.
Ekli Ö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, bir typeName de belirttiğinizde, özellik öğesi söz dizimine yüzeysel olarak benzeyen bir söz dizimi kullanır.propertyName bileşimi. İki önemli fark vardır:
typeName kullanabilirsiniz.öznitelik söz dizimi aracılığıyla bir ekli özellik ayarlarken bile propertyName bileşimi. Ö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.
Ekli 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 bir türdür ve bazen bu ekli olaylar hizmeti kullanıma sunan türlerde yönlendirilmiş bir olay diğer adı tarafından kullanıma sunulur. 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 Remove
olay işleyicisi erişimcileri sağlayan Add
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:
Öznitelik | Tanım |
---|---|
<Page |
Kök öğenin nesne öğesi 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 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, öğesinin koleksiyonunu Menu açıkça bir <Menu.Items>
özellik öğesi etiketi olarak bildirmeyi Items ve her <Menu.Items>
MenuItem birini içine yerleştirmeyi seçebilirsiniz. Bunun yerine, bir öğesinin tüm alt öğelerinin Menu bir MenuItem olması ve koleksiyonuna Items yerleştirilmesi gereken örtük XAML işlemci davranışını kullanabilirsiniz. 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ş araması başarılıBackground (Denetimden devralındı) ve Button nesne öğesinin veya temel sınıfın sınıfı olduğundan çalışır. Control.Background
çalışır çünkü Control sınıfı aslında bir Button temel sınıf tanımlar Background ve Control olur.
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> -->
Labelbaşka bir türetilmiş sınıfıdır Controlve bir Label nesne öğesinde belirtmiş Label.Background
olsaydınız, bu kullanım işe yarardı. Ancak, Label sınıfı veya temel sınıfı Buttonolmadığından, belirtilen XAML işlemci davranışı ekli bir özellik olarak işlenir Label.Background
. Label.Background
kullanılabilir bir ekli özellik değildir ve bu kullanım başarısız olur.
baseTypeName.memberName Özellik Öğeleri
typeName'in nasıl olduğuyla benzer bir şekilde.memberName formu, baseTypeName özniteliği söz dizimi için çalışır.memberName söz dizimi özellik öğesi söz diziminde ç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 içinde Button
yer alsa bile özellik öğesi olarak Control.Background
verilmiştir.
Ancak typeName gibi.baseTypeName öznitelikleri için memberName formu.memberName, işaretlemede kötü bir stildir ve bundan kaçınmanız gerekir.
Ayrıca bkz.
.NET Desktop feedback