就如同其它的基於XML的標記語言一樣,XAML大體上也遵循XML的語法規則。例如每個XAML元素包含一個名稱以及一個或多個屬性。在XAML中,每個屬性都是和某個WPF類的屬性相對應的,而且所有的元素名稱都和WPF中定義的類名稱相匹配。
例如<Button>元素就和System.Windows.Controls.Button類對應。
XAML是一個純粹的標記語言,這也就意味著某個元素要實現一個事件的處理時,需要在該元素中通過特定的屬性來指定相應的事件處理方法名,而真正的事件處理邏輯你可以通過C#或者VB.NET語言進行實現,我們是沒有辦法通過XAML來編寫相應的事件處理邏輯的。如果你對ASP.NET技術比較了解的話,那麼應該對代碼後置這個概念不會陌生。對於一個WPF程序來說,我們也可以像ASP.Net那樣采用代碼後置模型,將頁面和相應的邏輯代碼分別存放在不同的文件中,也可以以一種內聯的方式將頁面和邏輯代碼都存放在同一個文件中。一般來說,我們是不推薦采用後面這種方式的,但是如果你要堅持這種實現方式亦無不可,但是最好是采用代碼後置的方式將呈現層和應用程序邏輯層分離開來。
下面我們通過一個具體的示例來講解WPF程序中代碼後置方式和內聯方式的實現機制,在這個示例中依然是使用Button元素來說明這兩種方式的區別和實現過程。下面我們通過如下的XAML代碼來聲明一個Button元素:
35 <Button
36 OnClick="ButtonClickedHandler"
37 Name="MyButton"
38 Width="50"
39 Content="Click Me!" />
而後我們在單擊這個Button按鈕時,將觸發相應的事件,使得該按鈕的寬度和其顯示的內容信息將發生改變。對應的事件處理程序代碼如下:
40 void ButtonClickedHandler(object sender, RoutedEventArgs eventArgs)
41 {
42 MyButton.Width = 100;
43 MyButton.Content = "Thank you!";
44 }
我們通過上面的程序清單可以看出,一旦點擊了該按鈕,就將使得按鈕的寬度從50延展到100,而其顯示的文本也由"Click Me!"變為"Thank you!"。同時也可以發現我們可以使用C#或者VB.Net自己對XAML元素的各個屬性進行操作,這是因為所有XAML元素的屬性都是和WPF類的屬性戚戚相關的。為此,你不單單可以使用C#來改變Button的背景顏色、高度等屬性,甚至還可以像以前的Windows窗體程序那樣通過代碼來調整Button元素的位置坐標。
如果要以內聯的方式進行上述的實現,我們可以為在XAML文件中使用<x:code>元素,並將所有的內聯代碼都封裝在<![CDATA[...]]>標簽中,以確保分析器不會對其中的代碼進行解析。下面就是上述示例的內聯實現方式的代碼:
01 <x:Code>
02 <![CDATA[
03 void ButtonClickedHandler(object sender, RoutedEventArgs eventArgs)
04 {
05 MyButton.Width = 100 ;
06 MyButton.Content = "Thank you! ";
07 }
08 ]]>
09 </x:Code>
XAML開發人員要注意的一點就是每次聲明一個XAML元素時,最好用Name屬性為該元素指定一個名稱,這樣應用程序邏輯開發人員才可以通過代碼來訪問此元素。
這是因為某種類型的元素可能在XAML頁面上聲明多次,但是如果你不顯式地指明各個元素的Name屬性,那麼我們是無法區分那個是我們想要操作的元素,也就無法通過C#或VB.Net來操作該元素和其中的屬性了。
下面是聲明一個XAML元素必須遵循的四大原則:
·XAML是大小寫區分的,元素和屬性的名稱必須一個嚴格區分大小寫。例如對於Button元素來說,其在XAML中的聲明應該為<Button>,而不是<button>。
·所有的屬性值,無論它是什麼數據類型,都必須包含在雙引號中。
·所有的元素都必須封閉的,也就是說,一個元素必須是自我封閉的,<Button .../>,或者是有一個起始標記和一個結束標記,例如<Button>...</Button>。
·最終的XAML文件也必須是合適的XML文檔。
聲明一個元素及其相應屬性的基本格式如下:<元素名 屬性名="值" 屬性名="值" ... />
下面是一個簡單的用戶登陸窗口界面,其對應的代碼見程序清單,我們來這驗證選這段代碼是否遵循了上述的四大原則。請你仔細查看元素聲明的大小寫是否對應、所有的屬性值是否都包含在雙引號中、所有的元素標記是否是封閉的以及該XAML文件是否是一個組織良好的XML文檔。
01 <StackPanel
02 XMLns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
03 XMLns:x="http://schemas.microsoft.com/winfx/2006/xaml"
04 HorizontalAlignment="Left"
05 Margin="10">
06 <Label
07 Margin="5"
08 Content="Username" />
09 <TextBox
10 Margin="5"
11 BorderBrush="Blue"
12 BorderThickness="1"
13 Background="AliceBlue"
14 Foreground="Black"
15 Width="200"/>
16 <Label
17 Margin="5"
18 Content="PassWord" />
19 <PassWordBox
20 Margin="5"
21 BorderBrush="Blue"
22 BorderThickness="1"
23 Background="AliceBlue"
24 Foreground="Black"
25 Width="200" />
26 <Button
27 Margin="10"
28 Background="AliceBlue"
29 Foreground="Black"
30 Width="100"
31 Height="20"
32 Content="Submit" />
33 </StackPanel>
為了增加XAML代碼的可讀性,本章中的所有XAML代碼都采用了如上述程序清單所示的格式化風格,這樣就算是那些包含嵌套元素的復雜標簽,我們也可以一目了然地知道其組織結構。當然上述的格式化風格不是請求的,你可以將一個元素聲明代碼放在一行中,也可以將它分成多行進行放置,一切都取決於你的喜好。因為XAML在部署前是編譯為BAML文件的,所以那些多余的空格對編譯器的編譯過程沒有任何的影響,也就是說不會因為空格的多少而影響編譯的性能。但是最好還是采用本章采用的格式化風格,畢竟清晰的代碼可讀性對於後續的維護和修改來說是非常重要的