XAML(Extensible Application Markup Language的簡寫,發音為“zammel”)是用於實例化.NET對象的標記語言。儘管XAML是一種應用於諸多不同問題領域的技術,但其主要作用是構造WPF用戶界面。換言之,XAML文檔定義了在WPF應用程式中組成視窗的面板、按鈕 ...
XAML(Extensible Application Markup Language的簡寫,發音為“zammel”)是用於實例化.NET對象的標記語言。儘管XAML是一種應用於諸多不同問題領域的技術,但其主要作用是構造WPF用戶界面。換言之,XAML文檔定義了在WPF應用程式中組成視窗的面板、按鈕以及各種空間的佈局。
一、XAML變體
實際上術語“XAML”有多種含義。到目前為止,我們使用XAML標識整個XAML語言,它是一種基於通用XML語法、專門用於表示一顆.NET對象樹的語言(這些對象可以是視窗中的按鈕、文本框,或是已經定義好的自定義類。)
XAML還包含如下幾種:
- WPF XAML包含描述WPF內容的元素,如矢量圖形、控制項以及文檔。目前,它是最重要的XAML應用。
- XPS XAML是WPFXAML的一部分。它為格式化的電子文檔定義了一種XML標識方式。XPS XAML已作為單獨的XML頁面規範(XML Paper Specification ,XPS)標準發佈。
- Silverlight XAML是一個用於Microsoft Silverlight應用程式的WPF XAML子集。Silverlight是一個跨平臺的瀏覽器插件,通過它可創建具有二維圖形、動畫、音頻和視頻的富Web內容。
- WF XAML包含描述WF(work Flow,工作流)內容的元素。
二、XAML基礎
一旦理解了一些基礎規則,XAML標準是非常簡單的:
- XAML 文檔中的每個元素都映射為.NET類的一個實例。元素的名稱也完全對應於類名。例如,元素<Button>指示WPF創建的Button對象。
- 與所有XML文檔一樣,可以在一個元素中嵌套另一個元素。但嵌套通常是一種表示“包含”的方法——換句話說,如果在一個Grid元素中發現一個Button元素,那麼用戶界面可能包括一個在其內部包含的一個Button元素的Grid元素。
- 可通過特性(attribute)設置每個類的屬性(property)。但在某些情況下,特性不足以完成這項工作。對於此類情況,需要通過特殊的語法使用嵌套的標簽(tag)。
使用VS2012創建一個WPF項目。預設生成主窗體的XAML代碼如下所示:
1 <Window x:Class="WpfApplication1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="MainWindow" Height="350" Width="525"> 5 <Grid> 6 7 </Grid> 8 </Window>
該文檔僅包含兩個元素——頂級的Window元素以及一個Grid元素,Window元素代表整個視窗,在Grid元素中可以放置所有控制項。儘管可以使用任何頂級元素,但是WPF應用程式只使用以下幾個元素作為頂級元素:
- Window元素
- Page元素(該元素和Window元素類似,但它用於可導航的應用程式)
- Application元素(該元素定義應用程式資源和啟動設置)
與在所有XML文檔中一樣,在XAML文檔中只能有一個頂級元素。在上例中,意味使用</Window>標簽關閉了Window元素,文檔就結束了。
2.1、XAML名稱空間
XAML解析器需要知道類位於哪個.NET名稱空間。例如,在許多名稱空間中可能都有Window類——Windowm類可能是指System.Windows.Window類,也可能是指位於第三方組件中的Window類。為了弄清實際上希望使用哪個類,XAML解析器會檢查應用於元素的XML名稱空間。
上面顯示的示例文檔定義了兩個名稱空間:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns特性是XML中的一個特殊特性,它專門用來聲明名稱空間,這段標記聲明瞭兩個名稱空間,在創建的所有WPF XAML文檔中都會使用這兩個名稱空間:
- http://schemas.microsoft.com/winfx/2006/xaml/presentation是WPF核心名稱空間。它包含了所有WPF類,包括用來構建用戶界面的控制項。在該例中,該名稱空間的聲明沒有使用名稱空間首碼,所以它成為整個文檔的預設名稱空間。換句話說,除非另外指明,每個元素自動位於這個名稱空間。
- http://schemas.microsoft.com/winfx/2006/xaml 是XAML名稱空間。它包含各種XAML使用特性,這些特性可影響文檔的解釋方式。該名稱空間被映射為首碼x。這意味著可通過在元素名稱之前放置名稱空間首碼x來使用該名稱空間(例如<x:ElementName>)。
2.2 代碼隱藏類
可通過XAML構造用戶界面,但為了使應用程式具有一定的功能,就需要用於連接包含應用程式代碼的事件處理程式的方法。XAML通過使用如下所示的Class特性簡化了這個問題:
<Window x:Class="WpfApplication1.MainWindow">
在XAML名稱空間的Class特性之前放置了名稱空間首碼x,意味著這是XAML語言中更通用的部分。實際上,Class特性告訴XAML解析器用指定的名稱生成一個新類。該類繼承自由XML元素命名的類。換句話說,該實例創建了一個名為MainWindow的新類,該類繼承自Window基類。