XAML

XAML (IPA /ˈzæməl/), (Extensible Application Markup Language) genişletilmiş uygulama biçimlendirme dili. Microsoft'un uygulama arayüzlerinin oluşturulmasını sağlayan tanımlama dili. XAML, geliştiricilere XML kullanarak tüm .NET kullanıcı arayüz elemanlarının (button, textbox … gibi) çizimlerini (İng. layout) kontrol edebilmelerini sağlar. Her XAML etiketi (tag), doğrudan özellikleri XML attributeleriyle kontrol edilen bir .NET Framework sınıfına karşılık gelir.
Örneğin <Button> elemanını ele alalım. <Button> tag’i doğrudan System.Windows.Controls.Button sınıfına karşılık gelir. Read-only olan özellikler (Properties) XAML tarafından erişilemez; sadece public, get ve set methodları olan özellikler XAML ile erişilerbilirdir. Event’ler ve handler'ler de XAML attributeleri ile belirtilebilir ve event’in gerçekleşmesi sonucu çalışacak kod da code behind tarafına C# ya da tercihe göre VB.NET ile yazılabilir. Nasıl ki ASP.NET’te kodu ister codebehind sayfasına ya da aspx sayfasına yazılıyorsa burada da codebehind ya da XAML dosyasına yazılabilir.
XAML sayfasına kodu gömülürse, çalıştırmak için önce uygulama derlenmeli. Fakat XAML sayfasına kod yazılmadıysa XAML dosyasına çift tıklayarak Vista üzerinde HTML'de olduğu gibi doğrudan görülebilir.
Windows XP’de ise sonucu görebilmek ya da tarayıcıya yükleyebilmek için XAML sayfalarının önce derlenmesi gerekir.

XAML ağaç modeli

Nasıl ki HTML nesneleri DOM ağaçını oluşturmak için pars edilirse, XAML elemanları da ElementTree ağaçını oluşturmak için de pars edilir.
XAML’ın nesneye dayalı methodolojiye dayandığını söylenebilir. Bir XAML elemanından türetilen başka bir eleman ebeveyninin özelliklerini alır. XAML’dan tam anlamıyla faydalanabilmek için kalıtımın doğasını anlaşılmalıdır. Custom controller, alt sınıflar oluşturularak kullanıcı arayüzü tasarımında kullanılmak üzere XAML geliştiricilerine sunulabilir.
XAML, WPF tarafında tanımlanan nesnelerin XML görünümü olduğu için, XAML elemenları nesne-tabanlı programlama tekniklerini kullanan geliştiriciler tarafından genişletilebilir.
XAML, bir programlama dili değildir. Uygulamaları çalıştırmak için tasarlanmamıştır. XAML dosyaları uygulamalar için kullanıcı arayüz tanımları içerir. Uygulama mantığı ve event handler’ler, codebehind sayfalarında bulunur.

Uygulama ve sayfa tanımı

Uygulama tanımı (İng. application definition) kendi dosyası içinde tanımlanır. Ayarlanması gereken iki özelliği vardır: aduzay (İng. namespace) ve başlama URİ'si (İng. startup URI). URI, uygulama çalıştığında yüklenmesi gereken ilk sayfayı belirtir. 
XAML eleman tanımında ya her eleman için bir aduzaya ya da Avalon aduzayının kök elemanına referans verilmelidir.

Kökün tanımı

Herhangi bir XAML dosyasında tanımlanan ilk eleman kök (İng. root) elemanıdır. Kök elemanı mutlaka tanımlandığı aduzay referansını içermelidir. Kök elemanlar, diğer XAML elemanları içeren konteynerlerdır. Uygulama tanımı için en yaygın kök (root) eleman NavigationWindow’dur. Window elemanıysa oldukça az kullanılmaktadır.
Sayfa tanımı (İng. page definition) için en yaygın kök eleman Panel ve onun alt sınıfı olan DockPanel ve StackPanel elemanları ve de Page elemanıdır.
İki çeşit XAML uygulaması vardır: doğrudan çalışan (İng. express) ve yerleştirilmiş (İng. installed) uyguluma. Doğrudan çalışan uygulama bir Web tarayıcısında koşar. Yerleştirilmiş uygulamalarsa bilinen geleneksel masaüstü uygulamalarıdır.
Tüm XAML özellikleri (İng. attribute) kod tarafında düzenlenebilir. Zaten bu özellikler, CLR sınıf özelliklerinin XML görünümleridir. Başka bir ifâdeyle geleneksel Windows uygulamalarında olduğu gibi bir düğmenin (İng. button) arka plan rengini, yüksekliğini ya da posizyonunu kod içinden de kolayca değiştirmeyi sağlar.
XAML dosyalarında da <x:Code> elemanını belirterek kod barındırılabilir. Yalnız tüm kod <CDATA[...]]> elemanı(tag) içine yazılmalıdır. <CDATA[...]]> elemanı, derleyici bu eleman içindeki kod satırlarını yorumlamasını engeller.

Örnek

<x:Code>
  <![CDATA      void ButtonClickedHandler(object sender, RoutedEventArgs eventArgs)        {          MyButton.Width = 100 ;          MyButton.Content = "Thank you! ";        }   ]]> 
</x:Code>