XAML'ye genel bakış (WPF .NET)

Bu makalede XAML dilinin özellikleri açıklanmakta ve Windows Presentation Foundation (WPF) uygulamaları yazmak için XAML'yi nasıl kullanabileceğiniz gösterilmektedir. Bu makalede, WPF tarafından uygulanan XAML özel olarak açıklanmaktadır. XAML'nin kendisi WPF'den daha büyük bir dil kavramıdır.

Önemli

.NET 7 ve .NET 6 için Masaüstü Kılavuzu belgeleri yapım aşamasındadır.

XAML nedir?

XAML bildirim temelli bir işaretleme dilidir. .NET programlama modeline uygulandığı gibi, XAML bir .NET uygulaması için kullanıcı arabirimi oluşturmayı kolaylaştırır. Bildirim temelli XAML işaretlemesinde görünür UI öğeleri oluşturabilir ve ardından kısmi sınıf tanımları aracılığıyla işaretlemeye katılmış arka planda kod dosyalarını kullanarak kullanıcı arabirimi tanımını çalışma zamanı mantığından ayırabilirsiniz. XAML, derlemelerde tanımlanan belirli bir yedekleme türü kümesindeki nesnelerin örneğini doğrudan temsil eder. Bu, genellikle bir destek türü sistemine doğrudan bağlı olmayan yorumlanmış bir dil olan diğer işaretleme dillerinin çoğundan farklıdır. XAML, farklı olabilecek araçları kullanarak ayrı tarafların kullanıcı arabirimi ve uygulamanın mantığı üzerinde çalışabileceği bir iş akışı sağlar.

Metin olarak gösterildiğinde, XAML dosyaları genellikle .xaml uzantısına sahip XML dosyalarıdır. Dosyalar herhangi bir XML kodlaması tarafından kodlanabilir, ancak UTF-8 olarak tipik bir kodlamadır.

Aşağıdaki örnekte, kullanıcı arabiriminin bir parçası olarak nasıl düğme oluşturabileceğiniz gösterilmektedir. Bu örnek, XAML'nin yaygın kullanıcı arabirimi programlama metaforlarını nasıl temsil ettiği konusunda size bir çeşit kazandırmaya yöneliktir (tam bir örnek değildir).

<StackPanel>
    <Button Content="Click Me"/>
</StackPanel>

Kısaca XAML söz dizimi

Aşağıdaki bölümlerde XAML söz diziminin temel biçimleri açıklanmaktadır ve kısa bir işaretleme örneği verilmiştir. Bu bölümlerin, her sözdizimi formu hakkında, bunların destek tipi sistemde nasıl temsil edildiği gibi tam bilgi sağlaması amaçlanmamıştır. XAML söz diziminin özellikleri hakkında daha fazla bilgi için, bkz. Ayrıntılı XAML Sözdizimi.

XML dili hakkında daha önceden bilgi sahibiyseniz, sonraki birkaç bölümdeki malzemelerin çoğu sizin için temel olacaktır. Bu, XAML'nin temel tasarım ilkelerinden birinin sonucudur. XAML dili kendi kavramlarını tanımlar, ancak bu kavramlar XML dili ve işaretleme formu içinde çalışır.

XAML nesne öğeleri

Nesne öğesi genellikle bir türün örneğini bildirir. Bu tür, dil olarak XAML kullanan teknoloji tarafından başvurulan derlemelerde tanımlanır.

Nesne öğesi söz dizimi her zaman bir açma açılı ayracı (<) ile başlar. Bunu, örnek oluşturmak istediğiniz türün adı takip eder. (Ad, bir ön ek, daha sonra açıklanacak bir kavram içerebilir.) Bundan sonra, isteğe bağlı olarak nesne öğesinde öznitelikleri bildirebilirsiniz. Nesne öğesi etiketini tamamlamak için bir kapanış açılı ayraç (> ) ile sonlandırın. Bunun yerine, etiketi ardı ardına eğik çizgi ve kapanış köşeli ayracı (/>) ile tamamlayarak, içeriği olmayan bir kendi kendini kapatma formu kullanabilirsiniz. Örneğin, daha önce gösterilen işaretleme kod parçacığına yeniden bakın.

<StackPanel>
    <Button Content="Click Me"/>
</StackPanel>

Bu, iki nesne öğesini belirtir: <StackPanel> (içerikle ve daha sonra bir kapanış etiketiyle) ve <Button .../> (birkaç özniteliği olan kendi kendini kapatma formu). StackPanel ve Button nesne öğelerinin her biri WPF tarafından tanımlanan ve WPF derlemelerinin bir parçası olan bir sınıfın adıyla eşler. Bir nesne öğesi etiketi belirttiğinizde, temel alınan türün yeni bir örneğini oluşturmak için XAML işlemeye yönelik bir yönerge oluşturursunuz. Her örnek, XAML ayrıştırılırken ve yüklenirken temel alınan türün parametresiz oluşturucusu çağrılarak oluşturulur.

Öznitelik söz dizimi (özellikler)

Bir nesnenin özellikleri genellikle nesne öğesinin öznitelikleri olarak ifade edilebilir. Öznitelik söz dizimi, ayarlanan nesne özelliğini ve ardından atama işlecini (=) adlandırmaktadır. Özniteliğin değeri her zaman tırnak içinde yer alan bir dize olarak belirtilir.

Öznitelik söz dizimi en kolay özellik ayarı söz dizimidir ve geçmişte işaretleme dilleri kullanan geliştiriciler için kullanılacak en sezgisel söz dizimidir. Örneğin, aşağıdaki işaretleme, kırmızı metin ve mavi arka planı olan ve Content görüntü metnine sahip bir düğme oluşturur.

<Button Background="Blue" Foreground="Red" Content="This is a button"/>

Özellik öğesi sözdizimi

Bir nesne öğesinin bazı özellikleri için, özellik değerini sağlamak üzere gereken nesne veya bilgiler öznitelik söz diziminin tırnak işareti ve dize kısıtlamaları içinde yeterince ifade edilemediğinden öznitelik söz dizimi mümkün değildir. Bu durumlarda, özellik öğesi söz dizimi olarak bilinen farklı bir söz dizimi kullanılabilir.

Özellik öğesi başlangıç etiketinin sözdizimi <TypeName.PropertyName> şeklindedir. Genellikle, bu etiketin içeriği, özelliğin değer olarak aldığı türden bir nesne öğesidir. İçeriği belirttikten sonra, özellik öğesini bir bitiş etiketiyle kapatmanız gerekir. Bitiş etiketinin söz dizimi </TypeName.PropertyName> şeklindedir.

Öznitelik söz dizimi mümkünse, öznitelik söz dizimini kullanmak genellikle daha kullanışlı olur ve daha küçük bir işaretleme sağlar, ancak bu genellikle teknik bir sınırlama değil, yalnızca stil meselesidir. Aşağıdaki örnek, önceki öznitelik sözdizimi örneğindekiyle aynı özelliklerin ayarlandığını gösterir, ancak bu sefer Button öğesinin tüm özellikleri için özellik öğesi sözdizimi kullanılır.

<Button>
    <Button.Background>
        <SolidColorBrush Color="Blue"/>
    </Button.Background>
    <Button.Foreground>
        <SolidColorBrush Color="Red"/>
    </Button.Foreground>
    <Button.Content>
        This is a button
    </Button.Content>
</Button>

Koleksiyon söz dizimi

XAML dili, daha fazla insan tarafından okunabilir işaretleme üreten bazı iyileştirmeler içerir. Bu tür iyileştirmelerden biri, belirli bir özelliğin koleksiyon türünü alması durumunda, işaretlemede bu özelliğin değeri içindeki alt öğeler olarak bildirdiğiniz öğelerin koleksiyonun bir parçası olmasıdır. Bu durumda, alt nesne öğeleri koleksiyonu, koleksiyon özelliğine ayarlanan değerdir.

Aşağıdaki örnekte GradientStops özelliğin değerlerini ayarlamak için koleksiyon söz dizimi gösterilmektedir.

<LinearGradientBrush>
    <LinearGradientBrush.GradientStops>
        <!-- no explicit new GradientStopCollection, parser knows how to find or create -->
        <GradientStop Offset="0.0" Color="Red" />
        <GradientStop Offset="1.0" Color="Blue" />
    </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

XAML içerik özellikleri

XAML, bir sınıfın özelliklerinden tam olarak birini XAML içerik özelliği olarak atayabildiği bir dil özelliği belirtir. Bu nesne öğesinin alt öğeleri, bu içerik özelliğinin değerini ayarlamak için kullanılır. Başka bir deyişle, içerik özelliği için benzersiz olarak, XAML işaretlemesinde bu özelliği ayarlarken bir özellik öğesini atlayabilir ve işaretlemede daha görünür bir üst/alt metafor oluşturabilirsiniz.

Örneğin Border, Childöğesinin içerik özelliğini belirtir. Aşağıdaki iki Border öğesi aynı şekilde işlenir. İlki, içerik özelliği söz diziminin avantajlarından yararlanır ve Border.Child özelliği öğesini atlar. İkincisinde Border.Child açıkça gösterilir.

<Border>
    <TextBox Width="300"/>
</Border>
<!--explicit equivalent-->
<Border>
    <Border.Child>
        <TextBox Width="300"/>
    </Border.Child>
</Border>

XAML dilinin kuralı olarak, bir XAML içerik özelliğinin değeri, bu nesne öğesindeki diğer tüm özellik öğelerinden önce veya tamamen sonra verilmelidir. Örneğin, aşağıdaki işaretleme derlenmez.

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

XAML söz diziminin özellikleri hakkında daha fazla bilgi için, bkz. Ayrıntılı XAML Sözdizimi.

Metin içeriği

Az sayıda XAML öğesi, metni doğrudan içeriği olarak işleyebilir. Bunu etkinleştirmek için aşağıdaki durumlardan birinin doğru olması gerekir:

  • Sınıfın bir içerik özelliği bildirmesi ve içerik özelliğinin bir dizeye atanabilir türde olması gerekir (tür Objectolabilir). Örneğin, herhangi bir ContentControl, içerik özelliği olarak Content öğesini kullanır ve Object türüdür ve bu, Button gibi bir ContentControl üzerinde aşağıdaki kullanımı destekler: <Button>Hello</Button>.

  • Türün bir tür dönüştürücü bildirmesi gerekir; bu durumda metin içeriği, bu tür dönüştürücüsü için başlatma metni olarak kullanılır. Örneğin <Brush>Blue</Brush>, Blue öğesinin içerik değerini fırçaya dönüştürür. Bu durum pratikte daha az yaygındır.

  • Türün, bilinen bir XAML dili temel öğesi olması gerekir.

Birleştirilmiş içerik özellikleri ve koleksiyon söz dizimi

Bu örneği ele alalım.

<StackPanel>
    <Button>First Button</Button>
    <Button>Second Button</Button>
</StackPanel>

Burada her Button, StackPanel öğesinin alt öğesidir. Bu, iki etiketi iki farklı nedenle atlayan kolaylaştırılmış ve sezgisel bir işaretlemedir.

  • Atlanmış StackPanel.Children özellik öğesi:StackPanelPanel öğesinden türetilir. Panel, Panel.Children öğesini XAML içerik özelliği olarak tanımlar.

  • Atlanmış UIElementCollection nesne öğesi:Panel.Children özelliği, IList uygulayan UIElementCollection türünü alır. Koleksiyonun öğe etiketi, IList gibi koleksiyonları işlemeye yönelik XAML kurallarına göre atlanabilir. (Bu durumda, UIElementCollection parametresiz bir oluşturucuyu kullanıma sunmadığından örnek oluşturulamaz ve bu nedenle UIElementCollection nesne öğesi açıklama satırı olarak gösterilir).

<StackPanel>
    <StackPanel.Children>
        <!--<UIElementCollection>-->
        <Button>First Button</Button>
        <Button>Second Button</Button>
        <!--</UIElementCollection>-->
    </StackPanel.Children>
</StackPanel>

Öznitelik söz dizimi (olaylar)

Öznitelik söz dizimi, özellikler yerine olaylar olan üyeler için de kullanılabilir. Bu durumda, özniteliğin adı olayın adıdır. XAML için olayların WPF uygulamasında, özniteliğin değeri, o olayın temsilcisini uygulayan bir işleyicinin adıdır. Örneğin, aşağıdaki işaretleme, Click olayı için işaretlemede oluşturulan bir Button öğesine bir işleyici atar:

<Button Click="Button_Click" >Click Me!</Button>

WPF'de olaylar ve XAML ile ilgili yalnızca bu öznitelik sözdizimi örneğinden daha fazlası vardır. Örneğin, burada atıfta bulunulan ClickHandler öğesinin neyi temsil ettiğini ve nasıl tanımlandığını merak edebilirsiniz. Bu, bu makalenin sonraki Olaylar ve XAML arka plan kodu bölümünde açıklanacaktır.

XAML'de büyük/küçük harf ve boşluk

Genel olarak, XAML büyük/küçük harfe duyarlıdır. Yedekleme türlerini çözümleme amacıyla WPF XAML, CLR'nin büyük/küçük harfe duyarlı olduğu aynı kurallarla büyük/küçük harfe duyarlıdır. Nesne öğeleri, özellik öğeleri ve öznitelik adlarının tümü, derlemedeki temel türle veya bir türün üyesine göre adla karşılaştırıldığında hassas büyük/küçük harf kullanılarak belirtilmelidir. XAML dili anahtar sözcükleri ve temel öğeler de büyük/küçük harfe duyarlıdır. Değerler her zaman büyük/küçük harfe duyarlı değildir. Değerler için büyük/küçük harf duyarlılığı, değeri alan özelliğiyle ilişkili tür dönüştürücü davranışına veya özellik değeri türüne bağlıdır. Örneğin, Boolean türünü alan özellikler, eşdeğer değerler olarak true veya True alabilir, ancak bunun nedeni yalnızca dizeyi Boolean öğesine dönüştürme için yerel WPF XAML ayrıştırıcı türü dönüştürmesinin bunlara eşdeğer olarak zaten izin vermesidir.

WPF XAML işlemcileri ve serileştiricileri, önemsiz tüm boşlukları yok sayar veya bırakır ve önemli boşlukları normalleştirir. Bu, XAML belirtiminin varsayılan boşluk davranışı önerileriyle tutarlıdır. Bu davranış, yalnızca XAML içerik özellikleri içinde dizeler belirttiğinizde sonuç verir. En basit ifadeyle XAML, boşluk, satır besleme ve sekme karakterlerini boşluklara dönüştürür ve bitişik dizenin herhangi bir ucunda bulunan bir boşluğu korur. XAML boşluk işlemenin tam açıklaması bu makalede ele alınmamıştır. Daha fazla bilgi için, bkz. XAML'de boşluk işleme.

İşaretleme uzantıları

İşaretleme uzantıları bir XAML dil kavramıdır. Küme ayraçları ({ ve }) öznitelik söz diziminin değerini sağlamak için kullanıldığında, işaretleme uzantısı kullanımını gösterir. Bu kullanım, XAML işlemeyi, öznitelik değerlerinin sabit bir dize veya bir dize dönüştürülebilir değer olarak genel olarak ele alınmasından kaçmaya yönlendirir.

WPF uygulama programlamasında kullanılan en yaygın biçimlendirme uzantıları, veri bağlama ifadeleri için kullanılan Binding ile StaticResource ve DynamicResource kaynak başvurularıdır. İşaretleme uzantılarını kullanarak, bu özellik genel olarak bir öznitelik sözdizimini desteklemese bile, özellikler için değerler sağlamak üzere öznitelik sözdizimini kullanabilirsiniz. İşaretleme uzantıları genellikle değerleri erteleme veya yalnızca çalışma zamanında var olan diğer nesnelere başvurma gibi özellikleri etkinleştirmek için ara ifade türlerini kullanır.

Örneğin, aşağıdaki işaretleme öznitelik söz dizimini kullanarak Style özelliğinin değerini ayarlar. Style özelliği, varsayılan olarak bir öznitelik söz dizimi dizesiyle örneği oluşturulamayan Style sınıfının bir örneğini alır. Ancak bu durumda, öznitelik belirli bir biçimlendirme uzantısına (StaticResource) başvurur. Bu biçimlendirme uzantısı işlendiğinde, daha önce bir kaynak sözlüğünde anahtarlı bir kaynak olarak örneklenmiş bir stile başvuru döndürür.

<Window x:Class="index.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="100" Width="300">
    <Window.Resources>
        <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
        <Style TargetType="Border" x:Key="PageBackground">
            <Setter Property="BorderBrush" Value="Blue"/>
            <Setter Property="BorderThickness" Value="5" />
        </Style>
    </Window.Resources>
    <Border Style="{StaticResource PageBackground}">
        <StackPanel>
            <TextBlock Text="Hello" />
        </StackPanel>
    </Border>
</Window>

Özellikle WPF'de uygulanan tüm XAML biçimlendirme uzantılarının başvuru listesi için, bkz. WPF XAML Uzantıları. System.Xaml tarafından tanımlanan ve .NET XAML uygulamaları için daha yaygın olarak kullanılabilen işaretleme uzantılarının başvuru listesi için bkz . XAML Ad Alanı (x:) Dil Özellikleri. İşaretleme uzantısı kavramları hakkında daha fazla bilgi için, bkz. İşaretleme Uzantıları ve WPF XAML.

Tür dönüştürücüleri

Kısaca XAML Söz Dizimi bölümünde, öznitelik değerinin bir dize tarafından ayarlanabilmesi gerektiği belirtildi. Dizelerin diğer nesne türlerine veya ilkel değerlere nasıl dönüştürüleceğine ilişkin temel, yerel işleme, String türünün kendisine ve DateTime veya Uri gibi belirli türler için yerel işlemeye dayanır. Ancak birçok WPF türü veya bu türlerin üyeleri, temel dize özniteliği işleme davranışını, daha karmaşık nesne türlerinin örneklerinin dize ve öznitelik olarak belirtilebileceği şekilde genişletir.

Thickness yapısı, XAML kullanımları için etkinleştirilmiş bir tür dönüştürmesi olan bir tür örneğidir. Thickness iç içe dikdörtgen içindeki ölçümleri gösterir ve Margin gibi özellikler için değer olarak kullanılır. Thickness üzerine bir tür dönüştürücü yerleştirerek, Thickness kullanan tüm özelliklerin XAML'de belirtilmesi daha kolaydır çünkü öznitelik olarak belirtilebilirler. Aşağıdaki örnekte, bir Margin için değer sağlamak üzere tür dönüştürmesi ve öznitelik söz dizimi kullanılmaktadır:

<Button Margin="10,20,10,30" Content="Click me"/>

Önceki öznitelik sözdizimi örneği, aşağıdaki daha ayrıntılı sözdizimi örneğine eşdeğerdir; burada Margin, bunun yerine bir Thickness nesne öğesi içeren özellik öğesi sözdizimi aracılığıyla ayarlanır. Thickness öğesinin dört temel özelliği, yeni örnekte öznitelik olarak ayarlanmaktadır:

<Button Content="Click me">
    <Button.Margin>
        <Thickness Left="10" Top="20" Right="10" Bottom="30"/>
    </Button.Margin>
</Button>

Dekont

Ayrıca, türün kendisinin parametresiz bir oluşturucusu olmadığından, tür dönüştürmenin, bir alt sınıf içermeden bu türe bir özelliği ayarlamanın tek genel yolu olduğu sınırlı sayıda nesne vardır. Cursor bunun bir örneğidir.

Tür dönüştürme hakkında daha fazla bilgi için, bkz. TypeConverters ve XAML.

Kök öğeler ve ad alanları

Bir XAML dosyasının hem iyi biçimlendirilmiş bir XML dosyası hem de geçerli bir XAML dosyası olması için yalnızca bir kök öğesi olmalıdır. Tipik WPF senaryoları için WPF uygulama modelinde belirgin bir anlamı olan bir kök öğe kullanırsınız (örneğin, bir sayfa için Window veya Page, bir dış sözlük için ResourceDictionary veya uygulama tanımı için Application). Aşağıdaki örnek, Page için kök öğesiyle birlikte bir WPF sayfası için tipik bir XAML dosyasının kök öğesini gösterir.

<Page x:Class="index.Page1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="Page1">

</Page>

Kök öğesi xmlns ve xmlns:x özniteliklerini de içerir. Bu öznitelikler, bir XAML işlemcisine, hangi XAML ad alanlarının, biçimlendirmenin öğeler olarak başvuracağı yedekleme türleri için tür tanımlarını içerdiğini belirtir. xmlns özniteliği özellikle varsayılan XAML ad alanını gösterir. Varsayılan XAML ad alanında, işaretlemedeki nesne öğeleri ön ek olmadan belirtilebilir. WPF uygulama senaryolarının çoğu için ve SDK'nın WPF bölümlerinde verilen örneklerin neredeyse tümü için varsayılan XAML ad alanı http://schemas.microsoft.com/winfx/2006/xaml/presentation WPF ad alanına eşlenir. xmlns:x özniteliği, XAML dili ad alanını eşleyen ek bir http://schemas.microsoft.com/winfx/2006/xaml XAML ad alanını gösterir.

Ad kapsamının kullanımı ve eşlemesi için bir kapsam tanımlamak için bu xmlns kullanımı XML 1.0 belirtimi ile tutarlıdır. XAML ad kapsamları, yalnızca XAML ad kapsamının, tür çözümlemesi ve XAML'yi ayrıştırma söz konusu olduğunda ad kapsamı öğelerinin türler tarafından nasıl desteklendiği hakkında bir anlam ifade etmesi açısından XML ad kapsamlarından farklıdır.

xmlns öznitelikleri yalnızca her XAML dosyasının kök öğesinde kesinlikle gereklidir. xmlns tanımları, kök öğenin tüm alt öğelerine uygulanacaktır (bu davranış, yine, xmlns için XML 1.0 belirtimi ile tutarlıdır.) xmlns özniteliklerine, kökün altındaki diğer öğelerde de izin verilir ve tanımlayıcı öğenin herhangi bir alt öğesi için geçerli olacaktır. Ancak, XAML ad alanlarının sık sık tanımlanması veya yeniden tanımlanması, okunması zor bir XAML işaretleme stiline neden olabilir.

XAML işlemcisinin WPF uygulaması, WPF çekirdek derlemeleri konusunda farkındalığı olan bir altyapı içerir. WPF çekirdek derlemelerinin, varsayılan XAML ad alanına WPF eşlemelerini destekleyen türleri içerdiği bilinmektedir. Bu, proje derleme dosyanız ile WPF derleme ve proje sistemlerinin bir parçası olan yapılandırma aracılığıyla etkinleştirilir. Bu nedenle, varsayılan XAML ad alanını varsayılan xmlns olarak bildirmek, WPF derlemelerinden gelen XAML öğelerine başvurmak için gereken tek şeydir.

x: ön eki

Önceki kök öğe örneğinde, XAML dil yapılarını destekleyen ayrılmış XAML ad alanı olan XAML ad alanı http://schemas.microsoft.com/winfx/2006/xaml ile eşlemek için x: öneki kullanılmıştır. Bu x: ön eki, proje şablonlarında, örneklerde ve bu SDK'nın tamamında belgelerde bu XAML ad alanını eşlemek için kullanılır. XAML dili için XAML ad alanı, XAML'nizde sık kullanacağınız çeşitli programlama yapıları içerir. Aşağıda, kullanacağınız en yaygın x: ön eki programlama yapılarının listesi yer alır:

  • x:Anahtar: Bir ResourceDictionary içindeki (veya diğer çerçevelerdeki benzer sözlük kavramlarındaki) her kaynak için benzersiz bir anahtar ayarlar. x:Key büyük olasılıkla tipik bir WPF uygulamasının işaretlemesinde göreceğiniz x: kullanımların %90'ını oluşturur.

  • x:Sınıf: XAML sayfası için arka planda kod sağlayan sınıfın CLR ad alanını ve sınıf adını belirtir. WPF programlama modeli başına arka planda kodu desteklemek için böyle bir sınıfa sahip olmanız gerekir ve bu nedenle kaynak olmasa bile neredeyse her zaman x: öğesini eşlenmiş görürsünüz.

  • x:Ad: Bir nesne öğesi işlendikten sonra çalışma zamanı kodunda bulunan örnek için bir çalışma zamanı nesne adı belirtir. Genel olarak, x:Ad için sık sık WPF tanımlı eşdeğer bir özellik kullanırsınız. Bu tür özellikler özellikle bir CLR yedekleme özelliğiyle eşlenir ve bu nedenle, başlatılan XAML'den adlandırılmış öğeleri bulmak için sık sık çalışma zamanı kodu kullandığınız uygulama programlama için daha kullanışlıdır. Bu tür en yaygın özellik FrameworkElement.Name özelliğidir. Eşdeğer Name WPF çerçeve düzeyi özelliği belirli bir türde desteklenmediğinde x:Ad kullanmaya devam edebilirsiniz. Bu, belirli animasyon senaryolarında oluşur.

  • x:Statik: Aksi halde XAML uyumlu bir özellik olmayan statik bir değer döndüren bir başvuruyu etkinleştirir.

  • x:Tür: Tür adını temel alan bir Type başvurusu oluşturur. Bu, özellik genellikle x:Tür işaretleme uzantısı kullanımı isteğe bağlı olacak şekilde yerel dizeden Type öğesine dönüştürmesine sahip olsa da Style.TargetType gibi, Type alan öznitelikleri belirtmek için kullanılır.

x: ön eki/XAML ad alanında yaygın olmayan ek programlama yapıları vardır. Ayrıntılar için, bkz. XAML Ad Alanı (x:) Dil Özellikleri.

Özel ön ekler ve özel türler

Kendi özel derlemeleriniz için veya PresentationCore, PresentationFramework ve WindowsBase’in WPF çekirdeği dışındaki derlemeler için, derlemeyi özel xmlns eşlemesinin bir parçası olarak belirtebilirsiniz. Daha sonra, denediğiniz XAML kullanımlarını desteklemek için bu tür doğru bir şekilde uygulandığı sürece, XAML'nizde bu derlemeden türlere başvurabilirsiniz.

Aşağıda, özel ön eklerin XAML işaretlemesinde nasıl çalıştığına ilişkin temel bir örnek verilmiştir. custom ön eki, kök öğe etiketinde tanımlanır, paketlenmiş ve uygulamayla kullanılabilen belirli bir derlemeyle eşlenir. Bu derleme, genel XAML kullanımını desteklemek ve bir WPF XAML içerik modelinde bu belirli noktaya eklenmesine izin veren bir sınıf devralma kullanmak için uygulanan bir NumericUpDown türü içerir. Bu NumericUpDown denetimin bir örneği, bir XAML ayrıştırıcısının hangi XAML ad alanının türü içerdiğini ve dolayısıyla tür tanımını içeren destek derlemesinin nerede olduğunu bilmesi için önek kullanılarak bir nesne öğesi olarak bildirilir.

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:custom="clr-namespace:NumericUpDownCustomControl;assembly=CustomLibrary"
    >
  <StackPanel Name="LayoutRoot">
    <custom:NumericUpDown Name="numericCtrl1" Width="100" Height="60"/>
...
  </StackPanel>
</Page>

XAML'deki özel türler hakkında daha fazla bilgi için, bkz. WPF için XAML ve Özel Sınıflar.

Derlemelerdeki XML ad alanları ve kod ad alanlarının nasıl ilişkili olduğu hakkında daha fazla bilgi için, bkz. WPF XAML için XAML Ad Alanları ve Ad Alanı Eşlemesi.

Olaylar ve arka planda XAML kodu

Çoğu WPF uygulaması hem XAML işaretlemeden hem de arka planda koddan oluşur. Bir proje içinde, XAML bir .xaml dosyası olarak yazılır ve arka plan kod dosyası yazmak için Microsoft Visual Basic veya C# gibi bir CLR dili kullanılır. Bir XAML dosyası, WPF programlama ve uygulama modellerinin bir parçası olarak işaretleme derlendiğinde, bir XAML dosyası için XAML arka plan kod dosyasının konumu, XAML'nin kök öğesinin x:Class özniteliği olarak bir ad alanı ve sınıf belirtilerek tanımlanır.

Şimdiye kadarki örneklerde birkaç düğme gördünüz, ancak bu düğmelerin hiçbirinin henüz bunlarla ilişkili mantıksal bir davranışı yoktu. Nesne öğesi için davranış eklemeye yönelik birincil uygulama düzeyi mekanizması, öğe sınıfının mevcut bir olayını kullanmak ve bu olay çalışma zamanında tetiklendiğinde çağrılan olay için belirli bir işleyici yazmaktır. Olay adı ve kullanılacak işleyicinin adı işaretlemede belirtilirken, işleyicinizi uygulayan kod arka planda tanımlanır.

<Page x:Class="ExampleNamespace.ExamplePage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <Button Click="Button_Click">Click me</Button>
    </StackPanel>
</Page>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace ExampleNamespace;

public partial class ExamplePage : Page
{
    public ExamplePage() =>
        InitializeComponent();

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var buttonControl = (Button)e.Source;
        buttonControl.Foreground = Brushes.Red;
    }
}
Class ExamplePage
    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Dim buttonControl = DirectCast(e.Source, Button)
        buttonControl.Foreground = Brushes.Red
    End Sub
End Class

Arka planda kod dosyasının CLR ad alanını ExampleNamespace kullandığına (ad alanı Visual Basic'te görünmez) ve bu ad alanında kısmi bir sınıf olarak bildirdiğine ExamplePage dikkat edin. Bu, ExampleNamespace öğesinin x:Class öznitelik değerine paraleldir.ExamplePage işaretleme kökünde sağlanmıştır. WPF işaretleme derleyicisi, kök öğe türünden bir sınıf türeterek derlenmiş herhangi bir XAML dosyası için kısmi bir sınıf oluşturur. Aynı kısmi sınıfı da tanımlayan arka plan kodunu sağladığınızda, elde edilen kod, derlenmiş uygulamanın aynı ad alanı ve sınıfı içinde birleştirilir.

Önemli

Visual Basic'te kök ad alanı hem XAML hem de arka plan kodu için örtülüdür. Yalnızca iç içe yerleştirilmiş ad alanları görünür. Bu makalede C# projesinin XAML'si gösterilmektedir.

WPF'de arka planda kod programlama gereksinimleri hakkında daha fazla bilgi için, bkz. WPF'de arka planda kod, Olay İşleyicisi ve Kısmi Sınıf Gereksinimleri.

Ayrı bir arka planda kod dosyası oluşturmak istemiyorsanız, kodunuzu bir XAML dosyasında satır içi olarak da yapabilirsiniz. Ancak satır içi kod, önemli sınırlamaları olan daha az çok yönlü bir tekniktir. Daha fazla bilgi için, bkz. WPF'de Arka Planda Kod ve XAML.

Yönlendirilmiş olaylar

WPF için temel olan belirli bir olay özelliği, yönlendirilmiş bir olaydır. Yönlendirilmiş olaylar, öğeler bir ağaç ilişkisi aracılığıyla bağlı olduğu sürece, bir öğenin farklı bir öğe tarafından tetiklenen bir olayı işlemesini sağlar. Bir XAML özniteliğiyle olay işleme belirtilirken, yönlendirilmiş olay, sınıf üyeleri tablosunda söz konusu olayı listelemeyen öğeler de dahil olmak üzere herhangi bir öğede dinlenebilir ve işlenebilir. Bu, olay adı özniteliğini, sahip olan sınıf adıyla niteleyerek gerçekleştirilir. Örneğin, devam eden StackPanel / Button örneğindeki ana StackPanel, öznitelik değeri olarak işleyici adınızla birlikte StackPanel nesne öğesinde Button.Click özniteliğini belirterek alt öğe düğmesinin Click olayı için bir işleyici kaydedebilir. Daha fazla bilgi için, bkz. Yönlendirilmiş Olaylara Genel Bakış.

Adlandırılmış öğeler

Varsayılan olarak, bir nesne grafiğinde bir XAML nesne öğesi işlenerek oluşturulan nesne örneğinin benzersiz bir tanımlayıcısı veya nesne başvurusu yoktur. Buna karşılık, kodda bir oluşturucu çağırırsanız, oluşturulan örneğe bir değişken ayarlamak için hemen hemen her zaman yapıcı sonucunu kullanırsınız, böylece örneğe daha sonra kodunuzda başvurabilirsiniz. XAML, işaretleme tanımı aracılığıyla oluşturulan nesnelere standartlaştırılmış erişim sağlamak için x:Ad özniteliğini tanımlar. x:Name özniteliğin değerini herhangi bir nesne öğesinde ayarlayabilirsiniz. Arka planınızdaki kodda, seçtiğiniz tanımlayıcı, yapılı örneğe başvuran bir örnek değişkenine eşdeğerdir. Her açıdan, adlandırılmış öğeler nesne örnekleriymiş gibi çalışır (bu örneğe başvuruda bulunan addır) ve arka planınızdaki kod, uygulama içindeki çalışma zamanı etkileşimlerini işlemek için adlandırılmış öğelere başvurabilir. Örnekler ve değişkenler arasındaki bu bağlantı WPF XAML işaretleme derleyicisi tarafından gerçekleştirilir ve özellikle bu makalede ayrıntılı olarak ele alınmayan InitializeComponent gibi özellikler ve desenler içerir.

WPF çerçeve düzeyi XAML öğeleri, XAML tanımlı x:Name özniteliğine eşdeğer olan bir Name özelliği devralır. Bazı diğer sınıflar da genellikle bir Name özelliği olarak tanımlanan x:Name için özellik düzeyinde eşdeğerler sağlar. Genel olarak, seçtiğiniz öğe/tür için üyeler tablosunda bir Name özelliği bulamazsanız, bunun yerine x:Name kullanın. x:Name değerleri, belirli alt sistemler veya FindName gibi yardımcı program yöntemleri tarafından çalışma zamanında kullanılabilecek bir XAML öğesine tanımlayıcı sağlar.

Aşağıdaki örnek bir StackPanel öğesinde Name ayarlar. Ardından, bu StackPanel içindeki bir Button üzerindeki bir işleyici, Name tarafından ayarlanan örnek başvurusu buttonContainer aracılığıyla StackPanel öğesine başvurur.

<StackPanel Name="buttonContainer">
    <Button Click="RemoveThis_Click">Click to remove this button</Button>
</StackPanel>
private void RemoveThis_Click(object sender, RoutedEventArgs e)
{
    var element = (FrameworkElement)e.Source;
    
    if (buttonContainer.Children.Contains(element))
        buttonContainer.Children.Remove(element);
}
Private Sub RemoveThis_Click(sender As Object, e As RoutedEventArgs)
    Dim element = DirectCast(e.Source, FrameworkElement)

    If buttonContainer.Children.Contains(element) Then
        buttonContainer.Children.Remove(element)
    End If
End Sub

Bir değişkende olduğu gibi, bir örneğin XAML adı da bir kapsam kavramına tabidir, böylece adların tahmin edilebilir olan belirli bir kapsamda benzersiz olması zorunlu kılınabilir. Bir sayfayı tanımlayan birincil işaretleme, benzersiz bir XAML ad kapsamını belirtir ve XAML ad kapsamı sınırı bu sayfanın kök öğesi olur. Bununla birlikte, stiller veya stiller içindeki şablonlar gibi diğer işaretleme kaynakları çalışma zamanında bir sayfayla etkileşime girebilir ve bu tür işaretleme kaynaklarının genellikle, sayfanın XAML ad kapsamıyla mutlaka bağlantısı olmayan kendi XAML ad kapsamları vardır. x:Name ve XAML ad kapsamları hakkında daha fazla bilgi için, bkz. Name, x:Ad Yönergesi veya WPF XAML Ad Kapsamları.

Ekli özellikler ve ekli olaylar

XAML, belirli özelliklerin veya olayların ayarlandığı öğenin türü tanımlarında mevcut olmasa bile herhangi bir öğede belirtilmesine olanak tanıyan bir dil özelliği belirtir. Bu özelliğin özellikler sürümüne ekli özellik, olay sürümüne ekli olay adı verilir. Kavramsal olarak, ekli özellikleri ve ekli olayları herhangi bir XAML öğesi/nesne örneğinde ayarlanabilen genel üyeler olarak düşünebilirsiniz. Ancak, bu öğe/sınıf veya daha büyük bir altyapı ekli değerler için bir yedekleme özellik deposunu desteklemelidir.

XAML'deki ekli özellikler genellikle öznitelik söz dizimi aracılığıyla kullanılır. Öznitelik söz diziminde, ownerType.propertyName biçiminde ekli bir özellik belirtirsiniz.

Yüzeysel olarak, bu bir özellik öğesi kullanımına benzer, ancak bu durumda belirttiğiniz ownerType, her zaman ekli özelliğin ayarlandığı nesne öğesinden farklı bir türdür. ownerType, ekli özellik değerini almak veya ayarlamak için bir XAML işlemcisinin gerektirdiği erişimci yöntemlerini sağlayan türdür.

Ekli özellikler için en yaygın senaryo, alt öğelerin üst öğelerine bir özellik değeri raporlamasını sağlamaktır.

Aşağıdaki örnekte DockPanel.Dock ekli özelliği gösterilmektedir. DockPanel sınıfı, DockPanel.Dock için ekli özelliğin erişimcilerini tanımlar ve bu özelliğin sahibidir. DockPanel sınıfı ayrıca alt öğelerini yineleyen ve her öğeyi DockPanel.Dock öğesinin belirli bir değeri için denetlenen mantığı da içerir. Bir değer bulunursa, alt öğeleri konumlandırmak için düzen sırasında bu değer kullanılır. DockPanel.Dock ekli özelliğin ve bu konumlandırma özelliğinin kullanımı aslında DockPanel sınıfının motivasyon senaryosudur.

<DockPanel>
    <Button DockPanel.Dock="Left" Width="100" Height="20">I am on the left</Button>
    <Button DockPanel.Dock="Right" Width="100" Height="20">I am on the right</Button>
</DockPanel>

WPF'de, ekli özelliklerin çoğu veya tümü bağımlılık özellikleri olarak da uygulanır. Daha fazla bilgi için, bkz. Ekli Özelliklere Genel Bakış.

Ekli olaylar, benzer bir ownerType.eventName özniteliği sözdizimi biçimini kullanır. Ekli olmayan olaylar gibi, XAML'deki ekli bir olayın öznitelik değeri, öğesinde olay işlendiğinde çağrılan işleyici yönteminin adını belirtir. WPF XAML'de ekli olay kullanımları daha az yaygındır. Daha fazla bilgi için, bkz. Ekli Olaylara Genel Bakış.

Taban türleri

Temel alınan WPF XAML ve XAML ad alanı, XAML için CLR nesnelerine ve işaretleme öğelerine karşılık gelen türlerden oluşan bir koleksiyondur. Ancak, tüm sınıflar öğelere eşlenemez. ButtonBase gibi soyut sınıflar ve soyut olmayan bazı temel sınıflar CLR nesne modelinde devralma için kullanılır. Somut XAML öğelerinin her biri hiyerarşisindeki bazı temel sınıftan üyeleri devraldığından, soyut sınıflar da dahil olmak üzere temel sınıflar XAML geliştirme için hala önemlidir. Bu üyeler genellikle öğesinde öznitelik olarak ayarlanabilen özellikleri veya işlenebilen olayları içerir. FrameworkElement, WPF çerçeve düzeyinde WPF'nin somut temel kullanıcı arabirimi sınıfıdır. Kullanıcı arabirimini tasarlarken, tümü FrameworkElement öğesinden türetilen çeşitli şekil, panel, dekoratör veya denetim sınıflarını kullanacaksınız. İlgili temel sınıf, FrameworkContentElement, FrameworkElement içindeki API'leri kasıtlı olarak yansıtan API'leri kullanarak akış düzeni sunusu için iyi çalışan belge odaklı öğeleri destekler. Öğe düzeyindeki özniteliklerin ve CLR nesne modelinin birleşimi, belirli XAML öğesinden ve temel alınan türünden bağımsız olarak çoğu somut XAML öğesinde ayarlanabilen bir ortak özellikler kümesi sağlar.

Güvenlik

XAML, nesne örnekleme ve yürütmeyi doğrudan temsil eden bir işaretleme dilidir. Bu nedenle XAML'de oluşturulan öğeler, sistem kaynaklarıyla (örneğin ağ erişimi, dosya sistemi GÇ) uygulama kodunuzla aynı etkileşime sahip olur. XAML ayrıca barındırma uygulamasıyla aynı sistem kaynaklarına erişime sahiptir.

WPF’de Kod Erişimi Güvenliği (CAS)

.NET Framework'ün aksine, .NET için WPF CAS'yi desteklemez. Daha fazla bilgi için, bkz. Kod Erişim Güvenliği farklılıkları.

Koddan XAML yükleme

XAML, tüm kullanıcı arabirimini tanımlamak için kullanılabilir, ancak bazen XAML'de kullanıcı arabiriminin yalnızca bir parçasını tanımlamak da uygundur. Bu özellik aşağıdakiler için kullanılabilir:

  • Kısmi özelleştirmeyi etkinleştirme.
  • Kullanıcı arabirimi bilgilerini yerel olarak depolama.
  • Bir iş nesnesi modelleme.

Bu senaryoların anahtarı, XamlReader sınıfı ve Load yöntemidir. Giriş bir XAML dosyasıdır ve çıkış, bu işaretlemeden oluşturulan nesnelerin tüm çalışma zamanı ağacını temsil eden bir nesnedir. Daha sonra, uygulamada zaten var olan başka bir nesnenin özelliği olacak şekilde nesnesini ekleyebilirsiniz. Özellik içerik modelinde olduğu ve yürütme altyapısına uygulamaya yeni içerik eklendiğini bildiren görüntüleme özelliklerine sahip olduğu sürece, XAML'de dinamik olarak yükleyerek çalışan bir uygulamanın içeriğini kolayca değiştirebilirsiniz.

Ayrıca bkz.