剖析XAML語言

Charles_Su發表於2021-05-15

  這節剖析一下XAML(讀作:zaml)——這一WPF中的UI設計語言。

XAML

    在wpf中,UI部分使用xaml語言來編寫,xaml語言是由xml語言派生而來的語言,所以在xaml中我們可以看到很多熟悉的特點:它也是使用標籤構建頁面,一個標籤就對應一個物件,標籤與標籤之間或為並列關係,或為包含關係。

    標籤分為非空標籤和空標籤,非空標籤是指標籤中可以包含子標籤,空標籤則不能包含任何子標籤,它們的樣子如下:

    非空標籤:<tag>[<childtag...>]</tag>

    空標籤:<tag/>

    每一個標籤都有其特性,比如我們可以為window標籤設定title,width特性,為Grid標籤設定Background特性等等,也可以為標籤事件設定事件處理器(標籤事件被觸發時要執行的方法),詳情如下圖:

    我為window標籤設定了title為“XAML語言”,及其寬高,還為其設定了Loaded事件(當window被載入的時候觸發)的事件處理器。

 

xmlns

    在C#中有名稱空間的概念,我們可以使用using引入,就可以使用其中的類,在xaml中,也同樣有名稱空間,在window標籤中用xmlns宣告的這幾行,這就是本頁面引入的名稱空間。

    一般的情況下,我們引入名稱空間,都是為了使用其中的控制元件,或者使用一些型別轉換器(TypeConverter,後續章節會講)等工具類,所以為了區分我們使用的是哪個名稱空間下的控制元件或類,我們必須要在引入名稱空間的同時,指定它在本頁面的別名,也就是xmlns冒號後的值,如上圖中的“x”,“d”,"mc"等,我們使用的時候也要在標籤前加上名字:<x:tag/>。

    另外,我們看到上圖中引入的名稱空間是一個個http連結,但這並不是去訪問了某個地址,而是xaml中的硬編碼,當系統遇到這樣的連結,就會去引用一堆名稱空間,用一行引用代替了多行引用。再一個,一個頁面可以有一個預設名稱空間,也就是xmlns後沒有別名,當我們使用的控制元件沒有標明使用哪個名稱空間時,系統會自動去預設名稱空間中尋找,就像window,grid這樣的控制元件,是由xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"都在這一行引入的名稱空間中。

    我們新建一個介面,名稱空間預設就是以上這樣的幾行,但其實它引入了很多,單單http://schemas.microsoft.com/winfx/2006/xaml/presentation這一個宣告就會引入如下一堆名稱空間:

    所以我們基本上不需要考慮引入哪些基本名稱空間,微軟已經幫我們做好了 。

編譯

    當我們執行時,系統會編譯xaml程式碼,會將xaml編譯為一個partial 類,類名就是window 標籤第一行用x:Class指定的名稱,也就是會跟我們的後臺類合併,這一點還是跟WinForm一樣的。

    後臺程式碼中的InitializeComponent()方法就是編譯xaml後的部分類給的,作用是去初始化控制元件。

 

 

 

本節到此結束,我的公眾號:DotNet 致知

 

相關文章