Ayrıntılı XAML Sözdizimi

Bu konuda, XAML söz dizimi öğelerini tanımlamakta kullanılan terimler tanımlanmaktadır. Bu terimler, hem WPF belgeleri için hem de XAML kullanan diğer çerçeveler veya System. xaml düzeyinde XAML dil desteği tarafından etkinleştirilen temel XAML kavramlarını için bu belgenin geri kalanında sık kullanılır. Bu konu, WPF 'de xamlkonu başlığı altında sunulan temel terminoloji üzerinde genişletilir.

Bu konuda, XAML söz dizimi öğelerini tanımlamakta kullanılan terimler tanımlanmaktadır. Bu terimler, hem WPF belgeleri için hem de XAML kullanan diğer çerçeveler veya System. xaml düzeyinde XAML dil desteği tarafından etkinleştirilen temel XAML kavramlarını için bu belgenin geri kalanında sık kullanılır. Bu konu, xaml genel bakış (WPF)konu başlığında sunulan temel terminoloji üzerinde genişletilir.

XAML dil belirtimi

Burada tanımlanan XAML sözdizimi terimleri XAML dil belirtimi içinde de tanımlanır veya başvurulur. XAML, XML tabanlı bir dildir ve XML yapısal kurallarına göre aşağıdaki veya genişler. Terminolojilerin bazıları, XML dilini veya XML belgesi nesne modelini açıklayarak yaygın olarak kullanılan terimlere göre veya ' dan paylaşılır.

XAML dil belirtimi hakkında daha fazla bilgi için, Microsoft Indirme Merkezi ' nden [ms-xaml] indirin.

XAML ve CLR

XAML bir biçimlendirme dilidir. Ortak dil çalışma zamanı (CLR), adı tarafından belirtildiği gibi, çalışma zamanı yürütmeyi sunar. XAML, CLR çalışma zamanı tarafından doğrudan tüketilen ortak dillerden birine göre değil. Bunun yerine, XAML 'yi kendi tür sistemini destekleyecek şekilde düşünebilirsiniz. WPF tarafından kullanılan belirli XAML ayrıştırma sistemi CLR ve CLR tür sistemi üzerine kurulmuştur. XAML türleri, WPF için XAML ayrıştırıldığında bir çalışma zamanı gösteriminin örneklemesi için CLR türleriyle eşlenir. Bu nedenle, XAML dil belirtiminde denk sözdizimi tartışmaları olmasa dahi, bu belgede söz dizimi tartışması geri kalanı CLR türü sistemine başvurular içerecektir. (XAML dil belirtimi düzeyi için XAML türleri, CLR olmaması gerekmeyen, ancak farklı XAML ayrıştırıcısının oluşturulmasını ve kullanılmasını gerektiren diğer tür sistemleri ile eşleştirilebilir.)

Türlerin üyeleri ve sınıf devralma

Bir WPF türünün XAML üyeleri olarak göründükleri Özellikler ve olaylar genellikle temel türlerden devralınır. Örneğin, şu örneği göz önünde bulundurun: <Button Background="Blue" .../> . BackgroundButton Sınıf tanımına, yansıma sonuçlarına veya belgelere bakadıysanız, özelliği sınıfında anında bildirilmemiş bir özellik değildir. Bunun yerine, Background Taban Control sınıftan devralınır.

WPF XAML öğelerinin sınıf devralma davranışı, XML işaretlemesi için şema tarafından zorlanan bir yorumdan önemli bir kavadır. Sınıf devralma karmaşık olabilir, özellikle ara temel sınıflar soyut olduğunda veya arabirimler dahil edildiğinde karmaşık hale gelebilir. Bu, XAML öğeleri kümesinin ve izin verilen özniteliklerinin, genellikle DTD veya XSD biçimi gibi XML programlama için kullanılan şema türlerini doğru ve tamamen temsil etmesi zor bir nedenidir. Diğer bir nedenden dolayı, XAML dilinin genişletilebilirlik ve tür eşleme özelliklerinin, izin verilen türlerin ve üyelerin herhangi bir sabit gösteriminden daha da karmaşık olmasını sağlamak.

Nesne öğesi sözdizimi

Nesne öğesi sözdizimi , bir XML öğesi BILDIREREK bir clr sınıfı veya yapısını ÖRNEKLEYEN XAML biçimlendirme sözdizimidir. Bu söz dizimi, HTML gibi diğer biçimlendirme dillerinin öğe sözdizimine benzer. Nesne öğesi sözdizimi sol açılı köşeli ayraç () ile başlar < , ardından, örneklendirilmiş sınıf veya yapının tür adı tarafından hemen izlenir. Sıfır veya daha fazla boşluk tür adını izleyebilir ve bir veya daha fazla öznitelik, her öznitelik adı = "Value" çiftini ayıran bir veya daha fazla boşluk ile nesne öğesinde de bildirilemez. Son olarak, aşağıdakilerden biri doğru olmalıdır:

  • Öğe ve etiket bir eğik çizgi (/) ile hemen arkasından sağ açılı ayraç () ile kapatılmalıdır > .

  • Açma etiketi sağ açılı ayraç () ile tamamlanmalıdır > . Diğer nesne öğeleri, özellik öğeleri veya iç metin, açma etiketini izleyebilir. Burada tam olarak hangi içeriklerin dahil olabileceği, genellikle öğenin nesne modeliyle kısıtlanır. Nesne öğesi için eşdeğer kapanış etiketi, doğru iç içe geçme ve diğer açılış ve kapanış etiketi çiftleriyle dengede bulunmalıdır.

.NET tarafından uygulanan XAML, nesne öğelerini türler, öznitelikler veya olaylar ve XAML ad alanları ile CLR ad alanları ve derleme öğelerine eşleyen bir kurallar kümesine sahiptir. WPF ve .NET için XAML nesne öğeleri, başvurulan derlemelerde tanımlanan .NET türleriyle eşlenir ve öznitelikler bu türlerin üyeleriyle eşlenir. XAML 'de bir CLR türüne başvurduğunuzda, bu türdeki devralınan üyelere de erişebilirsiniz.

Örneğin, aşağıdaki örnek, sınıfının yeni bir örneğini örnekleyen Button ve ayrıca bir Name özniteliği ve bu öznitelik için bir değer belirten nesne öğesi sözdizimidir:

<Button Name="CheckoutButton"/>

Aşağıdaki örnek, XAML içerik özelliği sözdizimi de içeren nesne öğesi söz dizimine sahiptir. İçinde yer alan iç metin xaml içerik özelliğini ayarlamak için kullanılacaktır TextBoxText .

<TextBox>This is a Text Box</TextBox>

İçerik modelleri

Bir sınıf, sözdizimi bakımından XAML nesne öğesi olarak kullanımı destekleyebilir, ancak bu öğe, genel içerik modelinin veya öğe ağacının beklenen konumuna yerleştirildiğinde yalnızca bir uygulamada veya sayfada düzgün şekilde çalışır. Örneğin, MenuItem genellikle yalnızca gibi türetilmiş bir sınıfın alt öğesi olarak yerleştirilmelidir MenuBaseMenu . Belirli öğeler için 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ın bir parçası olarak belgelenmiştir.

Nesne öğelerinin özellikleri

XAML 'deki özellikler, çeşitli olası sözdizimleri tarafından ayarlanır. Belirli bir özellik için hangi sözdizimi kullanılabilecek, ayarladığınız özelliğin temel alınan tür sistemi özelliklerine göre değişiklik gösterecektir.

Özelliklerin değerlerini ayarlayarak, nesnelere çalışma zamanı nesne grafiğinde var olan özellikleri veya özellikleri ekleyin. Bir nesne öğesinden oluşturulan nesnenin ilk durumu parametresiz Oluşturucu davranışına göre belirlenir. Genellikle, uygulamanız herhangi bir nesne için tamamen varsayılan bir örnek dışında bir şey kullanacaktır.

Öznitelik sözdizimi (Özellikler)

Öznitelik sözdizimi, varolan bir nesne öğesinde bir özniteliği bildirerek bir özellik için değer ayarlayan XAML biçimlendirme sözdizimidir. Öznitelik adı, ilgili nesne öğesini yedekleyen sınıfın özelliğinin CLR üye adı ile aynı olmalıdır. Öznitelik adının ardından bir atama işleci (=) gelir. Öznitelik değeri tırnak içine alınmış bir dize olmalıdır.

Not

Bir özniteliğe sabit bir tırnak işareti koymak için alternatif tırnakları kullanabilirsiniz. Örneğin, içinde çift tırnak karakteri içeren bir dize bildirmek için tek tırnakları bir yol olarak kullanabilirsiniz. Tek veya çift tırnak işareti kullanıp kullanmayacağınızı, öznitelik değer dizesini açmak ve kapatmak için eşleşen bir çift kullanmanız gerekir. Ayrıca, belirli XAML söz dizimi tarafından uygulanan karakter kısıtlamaları etrafında çalışan kaçış dizileri veya diğer teknikler de mevcuttur. Bkz. XML karakter varlıkları ve xaml.

Öznitelik sözdizimi ile ayarlanbilmek için bir özelliğin ortak olması ve yazılabilir olması gerekir. Yedekleme türü sistemindeki özelliğinin değeri bir değer türü olmalıdır veya ilgili yedekleme türüne erişirken bir XAML işlemcisi tarafından örneklenmiş veya başvurulabilen bir başvuru türü olmalıdır.

WPF XAML olayları için, öznitelik adı olarak başvurulan olayın ortak olması ve genel bir temsilcisi olması gerekir.

Özellik veya olay, kapsayan nesne öğesi tarafından oluşturulan sınıfın veya yapının bir üyesi olmalıdır.

Öznitelik değerlerini iş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ışı temeldeki CLR özelliğinin türüne göre belirlenir.

Öznitelik değeri, bu işleme sırası kullanılarak, aşağıdakilerden biri ile doldurulur:

  1. XAML işlemcisi bir küme ayracı veya öğesinden türetilen bir nesne öğesi ile karşılaştığında, MarkupExtension başvurulan biçimlendirme uzantısı değeri bir dize olarak işlemek yerine önce değerlendirilir ve biçimlendirme uzantısı tarafından döndürülen nesne değer olarak kullanılır. Birçok durumda, bir işaretleme uzantısı tarafından döndürülen nesne varolan bir nesneye ya da çalışma zamanına kadar değerlendirmeyi yapan bir ifadeye veya yeni bir örneklenmiş nesne değil.

  2. Özellik öznitelikli ile bildirilirse TypeConverter veya özelliğin değer türü öznitelikli ile bildirilirse, TypeConverter özniteliğin dize değeri, dönüştürme girişi olarak tür dönüştürücüsüne gönderilir ve dönüştürücü yeni bir nesne örneği döndürür.

  3. Hayır ise TypeConverter , özellik türüne doğrudan dönüştürme denenir. Bu son düzey, XAML dil temel türleri arasındaki ayrıştırıcının yerel değerindeki doğrudan dönüştürmedir veya bir Numaralandırmadaki adlandırılmış sabitlerin adlarını denetler (ayrıştırıcı daha sonra eşleşen değerlere erişir).

Sabit Listesi öznitelik değerleri

XAML 'deki numaralandırmalar XAML Çözümleyicileri tarafından doğası gereği işlenir ve sabit listesinin adlandırılmış sabitlerinden birinin dize adı belirtilerek bir numaralandırma üyeleri belirtilmelidir.

Bayrak olmayan numaralandırma değerleri için, yerel davranış bir öznitelik değerinin dizesini işlemek ve sabit listesi değerlerinden birine çözmadır. Sabit listesini biçim numaralandırmasındabelirtmeyin. Değer, kodda yaptığınız gibi. Bunun yerine, yalnızca değeribelirtirsiniz ve sabit listesi , ayarladığınız özelliğin türü tarafından algılanır. Numaralandırmadabir özniteliği belirtirseniz. Değer formu, doğru çözümlenmeyecektir.

Flagwise Numaralandırmalar için davranış yöntemi temel alır Enum.Parse . Her değeri virgülle ayırarak, bir flagwise numaralandırması için birden fazla değer belirtebilirsiniz. Ancak, flagwise olmayan numaralandırma değerlerini birleştiremezsiniz. Örneğin, Trigger bayrak olmayan bir numaralandırmanın birden çok koşulu üzerinde davranan bir oluşturmak için virgül sözdizimini 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 flagwise numaralandırmalar WPF içinde nadir bir durumdur. Ancak, bu tür bir numaralandırma StyleSimulations . Örneğin, sınıf için açıklamalardır belirtilen örneği değiştirmek için virgülle ayrılmış flagwise öznitelik sözdizimini kullanabilirsiniz GlyphsStyleSimulations = "BoldSimulation"StyleSimulations = "BoldSimulation,ItalicSimulation" . KeyBinding.Modifiers , birden fazla numaralandırma değerinin belirtilebileceği başka bir özelliktir. Ancak, ModifierKeys numaralandırma kendi tür dönüştürücüsünü desteklediğinden, bu özellik özel bir durum gibi olur. Değiştiriciler için tür dönüştürücüsü, virgül (,) yerine sınırlayıcı olarak bir artı işareti (+) kullanır. bu dönüştürme, Microsoft Windows programlamada "Ctrl + Alt" gibi temel birleşimleri temsil etmek için daha geleneksel sözdizimini destekler.

Özellikler ve olay üyesi adı başvuruları

Bir öznitelik belirtirken, içeren nesne öğesi için örnekettiğiniz CLR türünün bir üyesi olarak var olan herhangi bir özelliğe veya olaya başvurabilirsiniz.

Ya da, ekli nesne öğesinden bağımsız olarak iliştirilmiş bir özelliğe veya ekli olaya başvurabilirsiniz. (Ekli Özellikler yaklaşan bölümde ele alınmıştır.)

Ayrıca, bir TypeNamekullanarak, varsayılan ad alanı aracılığıyla erişilebilen herhangi bir nesneden herhangi bir olayı da yazabilirsiniz. olay kısmen nitelenmiş adı; Bu sözdizimi, işleyicinin alt öğelerinden olay yönlendirmeyi işlemeye yönelik olduğu, ancak üst öğenin üye tablosunda da bu olayı içermediği yönlendirilmiş olaylar için işleyicileri eklemeyi destekler. Bu söz dizimi ekli bir olay sözdizimine benzer, ancak buradaki olay, doğru bir ekli olay değildir. Bunun yerine, nitelikli bir ada sahip bir olaya başvuruyorsunuz. Daha fazla bilgi için bkz. yönlendirilmiş olaylara genel bakış.

Bazı senaryolarda, özellik adları bazen öznitelik adı yerine bir özniteliğin değeri olarak sağlanır. Bu özellik adı, OwnerTypebiçiminde belirtilen özellik gibi niteleyiciler de içerebilir. dependencyPropertyName. Bu senaryo, XAML 'de stil veya şablon yazarken yaygındır. Öznitelik değeri olarak belirtilen özellik adlarına yönelik işleme kuralları farklıdır ve ayarlanan özelliğin türüne veya belirli WPF alt sistemlerinin davranışlarına tabidir. Ayrıntılar için bkz. Stil oluşturma ve şablonoluşturma.

Özellik adları için başka bir kullanım, bir öznitelik değeri özellik özelliği ilişkisini açıkladığı zaman. Bu özellik veri bağlama ve görsel taslak hedefleri için kullanılır ve PropertyPath sınıfı ve tür dönüştürücüsü tarafından etkinleştirilir. Arama semantiğinin daha ayrıntılı bir açıklaması için bkz. PROPERTYPATH XAML sözdizimi.

Özellik öğesi sözdizimi

Özellik öğesi sözdizimi , öğeleri IÇIN temel XML sözdizimi kurallarından biraz ayrılan bir sözdizimidir. XML 'de, bir özniteliğin değeri, tek bir dize kodlama biçiminin kullanıldığı tek bir çeşitle bir dizedir. XAML 'de, diğer nesne öğelerini bir özelliğin değeri olacak şekilde atayabilirsiniz. Bu yetenek, özellik öğesi sözdizimi tarafından etkinleştirilir. Özelliği, öğe etiketi içindeki bir öznitelik olarak belirtilen özellik yerine, elementTypeNameiçindeki bir açýlýþ element etiketi kullanılarak belirtilir. PropertyName formu, özelliğin değeri içinde belirtilir ve sonra Property öğesi kapalıdır.

Özellikle, sözdizimi sol açılı köşeli ayraç () ile başlar < ve ardından özellik öğesi sözdiziminin içinde bulunduğu sınıfın veya yapının tür adı tarafından hemen izlenir. Bu, hemen sonra tek bir nokta (.), ardından bir özelliğin adı ve sağ açılı ayraç () ile izlenir > . Öznitelik sözdiziminde olduğu gibi, bu özellik belirtilen türdeki ortak Üyeler içinde bulunmalıdır. Özelliğe atanacak değer, özellik öğesinin içinde yer alır. Genellikle değer bir veya daha fazla nesne öğesi olarak verilir, çünkü nesneleri değer olarak belirtmek, özellik öğesi sözdiziminin ele hazırlandığı senaryodur. Son olarak, aynı elementTypeNameöğesini belirten eşdeğer bir kapanış etiketi. PropertyName birleşiminin, doğru iç içe geçme ve diğer öğe etiketleriyle dengelenmesi sağlanmalıdır.

Örneğin, aşağıdaki, özelliği için özellik öğesi söz dizimine sahiptir ContextMenuButton .

<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ğeri iç metin olarak da verilebilir, çünkü belirtilen özellik türünün, veya gibi bir temel değer türü olduğu durumlarda, String veya bir adın belirtildiği bir sabit listesi. Bu iki kullanım çok nadir bir durumdur, çünkü bu durumların her biri daha basit bir öznitelik sözdizimi de kullanabilir. Bir dize ile bir özellik öğesinin doldurulmasıyla ilgili bir senaryo XAML içerik özelliği olmayan, ancak UI metninin temsili için hala kullanılan özellikler içindir ve bu kullanıcı arabirimi metninde satır akışları gibi belirli boşluk öğelerinin görünmesi gerekir. Öznitelik sözdizimi, satır beslemelerini koruyamaz, ancak özellik öğesi söz dizimi, önemli beyaz alan koruması etkin olduğu sürece (Ayrıntılar için bkz. xaml 'de beyaz boşluk işleme). Başka bir senaryo ise, X:Uid yönergesinin Özellik öğesine uygulanabilmesi ve bu sayede değeri WPF çıkış BAML 'de veya başka teknikler için yerelleştirilmesi gereken bir değer olarak işaretlemenize olanak sağlar.

Bir özellik öğesi WPF mantıksal ağacında temsil edilmez. Özellik öğesi, bir özelliği ayarlamaya yönelik yalnızca belirli bir sözdizimidir ve bir örnek veya nesne çalıştıran bir öğe değildir. (Mantıksal ağaç kavramıyla ilgili ayrıntılar için bkz. WPF 'de ağaçlar.)

Hem öznitelik hem de Özellik öğesi sözdiziminin desteklendiği özellikler için, iki sözdizimi genellikle aynı sonuca sahiptir, ancak beyaz boşluk işleme gibi alt tlelikler sözdizimleri arasında biraz farklılık gösterebilir.

Koleksiyon sözdizimi

XAML belirtimi, XAML işlemci uygulamalarının değer türünün bir koleksiyon olduğu özellikleri belirlemesini gerektirir. .NET 'teki Genel XAML işlemci uygulamaları, 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üretiliyor Array (XAML 'deki diziler hakkında daha fazla bilgi için bkz. Array.)

Bir özelliğin türü bir koleksiyon ise, gösterilen koleksiyon türünün bir nesne öğesi olarak İşaretlemede belirtilmesi gerekmez. Bunun yerine, koleksiyonda öğeler haline gelmesi amaçlanan öğeler, Property öğesinin bir veya daha fazla alt öğesi olarak belirtilir. Bu tür öğeler, yükleme sırasında bir nesne olarak değerlendirilir ve Add Kapsanan koleksiyonun yöntemi çağırarak koleksiyona eklenir. Örneğin, Triggers öğesinin özelliği, Style uygulayan özel koleksiyon türünü alır TriggerCollectionIList . İşaretlemede bir nesne öğesi örneği oluşturmak gerekli değildir TriggerCollection . Bunun yerine, bir veya daha fazla öğeyi bir veya daha fazla Trigger öğe olarak belirtirsiniz Style.Triggers , burada Trigger (veya türetilmiş bir sınıf) türü kesin belirlenmiş ve örtük olarak öğe türü olarak beklenen türdür TriggerCollection .

<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>

Bir özellik, bu konunun sonraki bölümünde ele alınan bu tür ve türetilmiş türler için hem koleksiyon türü hem de XAML içerik özelliği olabilir.

Örtük bir koleksiyon öğesi, İşaretlemede bir öğe olarak görünmese de, mantıksal ağaç gösteriminde bir üye oluşturur. Genellikle üst türün Oluşturucusu, özelliklerinden biri olan koleksiyon için örnek oluşturmayı gerçekleştirir ve başlangıçta boş koleksiyon, nesne ağacının bir parçası haline gelir.

Not

Genel liste ve sözlük arabirimleri ( IList<T> ve IDictionary<TKey,TValue> ), koleksiyon algılama için desteklenmez. Ancak doğrudan uyguladığından List<T>IList veya Dictionary<TKey,TValue> bir temel sınıf olarak, doğrudan uyguladığı için sınıfını temel sınıf olarak kullanabilirsiniz IDictionary .

Koleksiyon türleri için .NET başvuru sayfalarında, bir koleksiyon için nesne öğesinin bilinçli atlanmasına sahip bu sözdizimi zaman zaman örtük koleksiyon sözdizimi olarak XAML sözdizimi bölümlerinde belirtilmiştir.

Kök öğe hariç, başka bir öğenin alt öğesi olarak iç içe yerleştirilmiş bir XAML dosyasındaki her nesne öğesi gerçekten aşağıdaki durumlardan biri veya her ikisi olan bir öğedir: üst öğesinin örtük bir koleksiyon özelliğinin üyesi veya üst öğe için XAML içerik özelliğinin değerini belirten bir öğe (XAML içerik özellikleri yaklaşan bir bölümde ele alınacaktır). Diğer bir deyişle, bir biçimlendirme sayfasındaki üst öğe ve alt öğe öğelerinin ilişkisi aslında tek bir nesnedir ve kök altındaki her nesne öğesi, üst öğenin bir özellik değerini sağlayan tek bir örnek ya da üst öğenin koleksiyon türü özellik değeri olan bir koleksiyondaki öğelerden biridir. Bu tek köklü kavram XML ile ortaktır ve, gibi XAML yükleyen API 'lerin davranışında genellikle yeniden zorlanır Load .

Aşağıdaki örnek, açıkça belirtilen bir koleksiyonun () nesne öğesi ile bir sözdizimidir GradientStopCollection .

<LinearGradientBrush>
  <LinearGradientBrush.GradientStops>
    <GradientStopCollection>
      <GradientStop Offset="0.0" Color="Red" />
      <GradientStop Offset="1.0" Color="Blue" />
    </GradientStopCollection>
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

Koleksiyonu açıkça bildirmek için her zaman mümkün olmadığına unutmayın. Örneğin, TriggerCollection daha önce gösterilen örnekte açıkça bildirilmesini denemek Triggers başarısız olur. Koleksiyonu açıkça bildirmek için koleksiyon sınıfının parametresiz bir oluşturucuyu desteklemesi ve TriggerCollection parametresiz oluşturucusu olmaması gerekir.

XAML Içerik özellikleri

XAML içerik sözdizimi, yalnızca ContentPropertyAttribute kendi sınıf bildiriminin parçası olarak belirten sınıflarda etkinleştirilen bir sözdizimidir. , ContentPropertyAttribute Bu öğe türünün (türetilmiş sınıflar dahil) içerik özelliği olan özellik adına başvurur. Bir XAML işlemcisi tarafından işlendiğinde, nesne öğesinin açılış ve kapanış etiketleri arasında bulunan herhangi bir alt öğe veya iç metin, bu nesne için 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 genellikle .NET başvurusunun XAML söz dizimi bölümlerinde gösterilmez. Açık/ayrıntılı teknikte, biçimlendirme netliği için zaman zaman değeri veya biçimlendirme stili olması gerekir, ancak genellikle bir içerik özelliğinin amacı, üst-alt öğe ile ilgili olan öğelerin doğrudan iç içe yerleştirilebilmesi için biçimlendirmeyi kolaylaştırmaktır. Bir öğedeki diğer özellikler için özellik öğesi etiketleri, katı bir XAML dil tanımı başına "içerik" olarak atanmaz; daha önce XAML ayrıştırıcısının işleme sırasında işlenir ve "içerik" olarak kabul edilmez.

XAML Içerik özelliği değerleri bitişik olmalıdır

XAML içerik özelliğinin değeri, nesne öğesindeki diğer herhangi bir özellik öğesinden tamamen önce veya tamamen bir değere verilmelidir. Bu, XAML içerik özelliği değerinin bir dize olarak mı yoksa bir veya daha fazla nesne olarak mı belirtilmeliyse geçerlidir. Örneğin, aşağıdaki biçimlendirme ayrıştırılmadı:

<Button>I am a
  <Button.Background>Blue</Button.Background>  
  blue button</Button>  

Bu geçersizdir çünkü bu sözdizimi, içerik özelliği için özellik öğesi söz dizimi kullanılarak açık hale getirilmiş olduğundan, içerik özelliği iki kez ayarlanabilir:

<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 birlikte nasıl karışılyadır.

<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özdizimi birleştirildi

İçerik olarak birden fazla nesne öğesini 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ürleri olan türleri tanımmalıdır. Bir öğenin XAML içerik özelliği varsa ve XAML içerik özelliğinin türü bir koleksiyon ise, kapsanan koleksiyon türünün bir nesne öğesi olarak biçimlendirmesinde belirtilmesi gerekmez ve XAML içerik özelliğinin bir özellik öğesi olarak belirtilmesi gerekmez. Bu nedenle, biçimlendirmede görünen içerik modeli artık içerik olarak atanmış birden fazla alt öğe içerebilir. Aşağıdaki, türetilmiş bir sınıfın içerik sözdizimidir Panel . Tüm Panel türetilmiş sınıflar Children , türünde bir değer gerektiren xaml içerik özelliğini sağlar UIElementCollection .

<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>

Biçimlendirme içinde öğesinin için özellik öğesi ne Children de öğesi için gerekli olduğunu unutmayın UIElementCollection . Bu, XAML 'in bir tasarım özelliğidir. bu sayede, bir kullanıcı arabirimini tanımlayan öğeler, doğrudan üst-alt öğe ilişkilerle, iç içe geçmiş öğelerin ağaç olarak temsil edildiği, özellik öğesi etiketleri veya koleksiyon nesneleri dahil değildir. Aslında, UIElementCollection tasarıma göre bir nesne öğesi olarak biçimlendirme içinde açıkça belirtilemez. Yalnızca amaçlanan kullanım örtük bir koleksiyon olduğundan, UIElementCollection Ortak parametresiz bir Oluşturucu sunmaz ve bu nedenle bir nesne öğesi olarak başlatılamaz.

Içerik özelliği ile nesne içindeki özellik öğelerini ve nesne öğelerini karıştırma

XAML belirtimi, bir XAML işlemcisinin bir nesne öğesi içindeki XAML içerik özelliğini doldurmakta kullanılan nesne öğelerinin bitişik olması ve karışık olmaması gerektiğini bildirir. Özellik öğelerini ve içeriği karıştırmaya yönelik bu kısıtlama WPF XAML işlemcileri tarafından zorlanır.

Bir nesne öğesi içindeki ilk anında biçimlendirme olarak bir alt nesne öğesi olabilir. Daha sonra özellik öğeleri ekleyebilirsiniz. Ya da bir veya daha fazla özellik öğesi, içerik ve daha fazla özellik öğesi de belirtebilirsiniz. Ancak, bir özellik öğesi içeriğe ulaştıktan sonra, başka bir içerik getiremezsiniz, ancak özellik öğeleri ekleyebilirsiniz.

Bu içerik/özellik öğesi sırası gereksinimi içerik olarak kullanılan iç metin için uygulanabilir değil. Ancak, iç metni sürekli tutmak için iyi bir biçimlendirme stilidir, çünkü özellik öğeleri iç metinle birlikte ayarlandığında, biçimlendirme içinde görsel olarak algılanmaları zor olur.

XAML Ad Uzayları

Önceki söz dizimi örneklerinden hiçbiri varsayılan XAML ad alanı dışında bir XAML ad alanı belirtbelirtti. Tipik WPF uygulamalarında, varsayılan XAML ad alanı WPF ad alanı olarak belirtilir. Varsayılan XAML ad alanı dışında XAML ad alanları belirtebilirsiniz ve yine de benzer söz dizimi kullanabilirsiniz. Ancak, varsayılan XAML ad alanı içinde erişilebilir olmayan bir sınıfın adlandır olduğu her yerde, bu sınıf adının önüne karşılık gelen CLR ad alanıyla eşlenmiş XAML ad alanının ön ekini ekini ataymalıdır. Örneğin, bu sınıfı içeren CLR ad alanının (ve muhtemelen backing türlerini içeren dış derleme bilgileri) daha önce ön ekle eşlenmiş olduğu sınıfın bir örneğini örneği için nesne öğesi söz <custom:Example/>Examplecustom dizimidir.

XAML ad alanları hakkında daha fazla bilgi için bkz. WPF XAML için XAMLAd Alanları ve Ad Alanı Eşlemesi.

İşaretleme Uzantıları

XAML, dize özniteliği değerlerinin veya nesne öğelerinin normal XAML işlemcisi işlemesinin kaçışını sağlayan ve işlemeyi bir destek sınıfına karşı belirleyen bir işaretleme uzantısı programlama varlığı tanımlar. Öznitelik söz dizimi kullanılırken XAML işlemcisi için işaretleme uzantısını tanımlayan karakter, açılış küme ayracı ({), ardından kapanış küme ayracı (}) dışında herhangi bir karakterdir. Açma küme ayracı'nın ardından gelen ilk dize, belirli bir uzantı davranışını sağlayan sınıfa başvurarak, bu alt dize gerçek sınıf adının parçasıysa başvuru "Uzantı" alt dizesini atlar. Bundan sonra, tek bir boşluk görünebilir ve ardından her başarılı karakter, kapanış küme ayracı 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 ve diğer çerçevelerin veya teknolojilerin temeli olarak soyut MarkupExtension sınıfı kullanır. WPF'nin özel olarak uygulayan işaretleme uzantıları genellikle diğer mevcut nesnelere başvuru yapmak veya çalışma zamanında değerlendirilecek nesnelere ertelenen başvurular yapmak için bir araç sağlamak üzere tasarlanmıştır. Örneğin, basit bir WPF veri bağlaması, belirli bir özelliğin normalde sahip olduğu değerin yerine işaretleme uzantısı {Binding} belirterek kolaydır. WPF işaretleme uzantılarının çoğu, öznitelik söz dizimlerinin başka türlü mümkün olmayacak özellikler için öznitelik söz dizimlerini etkinleştirir. Örneğin, bir Style nesne, iç içe geçmiş bir nesne ve özellik serisi içeren görece karmaşık bir tür olabilir. WPF'deki stiller genellikle içinde bir kaynak olarak tanımlanır ve ardından kaynak isteğinde bulunduran ResourceDictionary iki WPF işaretleme uzantısı aracılığıyla başvurur. Işaretleme uzantısı, özellik değerinin değerlendirilmesini kaynak aramayla karşılar ve özellik değerinin sağlanmasını sağlar ve aşağıdaki örnekte olduğu gibi öznitelik söz dizimsinde StyleStyle türü alarak özelliğinin değerini sağlar:

<Button Style="{StaticResource MyStyle}">My button</Button>

Burada, StaticResource işaretleme uzantısı uygulamasını sağlayan sınıfı StaticResourceExtension tanımlar. Sonraki dize, uzantı dizesinde alınan parametresinin istenen 'i bildir olduğu varsayılan olmayan oluşturucu için MyStyleStaticResourceExtension giriş olarak ResourceKey kullanılır. MyStyle , kaynak olarak tanımlanan MyStyleStyle değeri olması beklenir. StaticResource Biçimlendirme Uzantısı kullanımı, yükleme zamanında statik kaynak arama mantığı aracılığıyla özellik değerini sağlamak için kaynağın kullanımını talep ediyor.

İşaretleme uzantıları hakkında daha fazla bilgi için bkz. İşaretleme Uzantıları ve WPF XAML. Işaretleme uzantılarının ve genel .NET XAML uygulamasında etkinleştirilmiş diğer XAML programlama özelliklerinin başvurusu 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, XAML'de tanıtilen ve özellikleri belirli bir türe göre tanımlandığı, ancak herhangi bir öğede öznitelik veya özellik öğeleri olarak ayarlandığı bir programlama kavramıdır. Ekli özelliklerin amaçlanan birincil senaryo, tüm öğelerde kapsamlı olarak paylaşılan bir nesne modeline gerek kalmadan bilgileri bir üst öğeye rapor etmek için bir işaretleme yapısında alt öğeleri etkinleştirmektir. Buna karşılık, ekli özellikler üst öğeler tarafından bilgileri alt öğelere rapor etmek 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, içinde typeName de belirttiğiniz özellik öğesi sözdizimine benzer bir söz dizimi kullanır.propertyName birleşimi. İki önemli fark vardır:

  • typeName kullanabilirsiniz.öznitelik söz dizimi aracılığıyla ekli bir özellik ayarlarken bile propertyName bileşimi. Özellik adının uygun olması, öznitelik söz dizimsinde bir gereksinim olduğu tek durum ekli özelliklerdir.

  • Ekli özellikler için özellik öğesi sözdizimini de kullanabilirsiniz. Ancak, tipik özellik öğesi söz dizimi için belirttiğiniz typeName, özellik öğesini içeren nesne öğesidir. Ekli bir özele başvurursanız typeName, içeren nesne öğesini değil, ekli özelliği tanımlayan sınıftır.

İliştirilmiş Olaylar

Ekli olaylar, XAML'de olaylar belirli bir tür tarafından tanımlansa da işleyicilerin herhangi bir nesne öğesine ekli olduğu başka bir programlama kavramıdır. WOF uygulamasında, ekli bir olayı tanımlayan tür genellikle bir hizmeti tanımlayan statik bir tür olur ve bazen bu ekli olaylar hizmeti ortaya çıkaran türlerde yönlendirilmiş bir olay diğer adı tarafından ortaya çıkar. Ekli olaylar için işleyiciler öznitelik söz dizimi aracılığıyla belirtilir. Ekli olaylarda olduğu gibi, öznitelik söz dizimi ekli olaylar için typeName değerine izin verecek şekilde genişletilir.eventName kullanımı; burada typeName ekli olay altyapısı için ve olay işleyicisi erişimcileri sağlayan 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, tipik bir XAML kök öğesinin bozuk olduğu gösteriliyor:

<Page Kök öğenin nesne öğesini açma
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ımlanmış herhangi bir arka koda bağlayan kısmi sınıf bildirimi
> Kök için nesne öğesinin sonu. Öğesi alt öğeler içerdiği için nesne henüz kapatlanmadı

İsteğe Bağlı ve Yorumlandırılmamış XAML Kullanımları

Aşağıdaki bölümlerde, XAML işlemcileri tarafından teknik olarak desteklenen, ancak XAML kaynaklarını içeren uygulamalar geliştirirken XAML dosyalarını müdahale eden ayrıntılı 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ülü olarak değerlendiren öğe içeriği özelliklerini açıkça yazmayı içerir. Örneğin, bir öğesinin içeriğini bildirerek, öğesinin koleksiyonunu bir özellik öğesi etiketi olarak açıkça bildirerek ve öğesinin tüm alt öğelerinin bir olması gereken ve koleksiyonuna yerleştirilen örtülü MenuItemsMenu<Menu.Items>MenuItem<Menu.Items> XAML MenuMenuItem işlemci davranışını Items kullanmak yerine her birini içine yerleştirebilirsiniz. Bazen isteğe bağlı kullanımlar, işaretlemede temsil edilen nesne yapısını görsel olarak netleştirmeye yardımcı olabilir. Veya bazen belirtik bir özellik öğesi kullanımı, bir öznitelik değeri içinde iç içe geçmiş işaretleme uzantıları gibi teknik açıdan işlevsel ancak görsel olarak kafa karıştırıcı olan işaretlemeyi önleyebilirsiniz.

Tam typeName.memberName Tam Öznitelikler

typeName. Bir öznitelik için memberName formu aslında yalnızca yönlendirilen olay durumundan daha evrensel olarak çalışır. Ancak, bu formun gereksiz olduğu diğer durumlarda, yalnızca işaretleme stili ve okunabilirlik nedenleriyle bu durumdan kaçınmalısınız. Aşağıdaki örnekte, özniteliğine yapılan üç başvurudan her Background 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 bu özellik için tam arama başarılı olduğundan (Denetimden devralınır) ve nesne öğesinin sınıfı veya bir temel ButtonBackground sınıf olduğu için Button çalışır. Control.Background sınıfı aslında ve Control bir temel sınıf BackgroundControl tanımladığı için Button çalışı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 başka bir türetilmiş Control sınıfıdır ve bir nesne öğesi Label.Background içinde belirt Label olsaydı, bu kullanım işe yaramış olurdu. Ancak, Label sınıfı veya temel sınıfı Button olduğundan, belirtilen XAML işlemci davranışı ekli bir özellik Label.Background olarak işlemeye yöneliktir. Label.Background kullanılabilir bir ekli özellik değildir ve bu kullanım başarısız olur.

baseTypeName.memberName Özellik Öğeleri

typeName türüne benzer bir şekilde.memberName formu, baseTypeName özniteliği söz dizimi için çalışır.memberName söz dizimi, özellik öğesi söz dizimi için ç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, property öğesi içinde Control.Background yer alsa bile özellik öğesi verilmiştir. Button

Ancak typeName gibi.öznitelikler için memberName formu, baseTypeName. memberName, işaretlemede zayıf bir stildir ve bunu önlemeniz gerekir.

Ayrıca bkz.