1. 程式人生 > >WPF與Prism一併學習(二)

WPF與Prism一併學習(二)

深度理解XAML本質

XAML到底是個啥玩意?從表面看,它是XML的子集,沒錯!那有人說,HTML也是啊!沒錯!他們都是!只不過HTML解析是由瀏覽器完成(HTML解析原理),XAML是由CLR完成.但解析以後的產物則完全不同,HTML解析純粹是瀏覽器為了渲染出頁面做的工作,XAML確是為了生成一個類,來取代原來Winform窗體類的desinger分部類檔案,這一點可以通過觀察反編譯生成的IL知道。

XAML的本質應該是微軟為了使用XML檔案來動態生成介面類的一種對XML的擴充套件,然後微軟定義了一系列XAML所獨有的標籤元素,用微軟自己寫好的解析器去解析XAML,從而生成C#類,網上已經有人舉了很好的例子,這與Spring.net中用XML配置物件有曲藝同工之妙!

所以淺顯的認為,XAML與HTML一樣,是為了渲染介面而生的,那就大錯特錯了.我們只是用類似開發網頁介面的方式在開發桌面程式的介面,而編譯器,CLR幫我們解析XAML從而生成與介面有關的類(xxxxx.designer.cs),嚴格的說,一個WPF程式,可以一個XAML檔案都沒有,照樣可以開發,而XAML的目的只是為了將桌面程式的介面設計工作,與後臺編碼工作完全隔離開來,並解耦.這點從它定義的標記也看的出來(x:Class)

表2-1.x:名稱空間的特性

特性描述
x:Class將各個部分類組合在一起。驗證語法:x:Class="namespace.classname"和x:Class="namespace.classname;assembly=assemblyname"。XAML頁面會生成類的部分程式碼,再由後臺程式碼進行組合。
x:Key在XAML中提供了被資源定義的唯一識別符號,通過標記擴充套件來引用資源極其重要。識別符號必須以字母、下劃線開頭並且只能包含字母、數字和下劃線。
x:Name在XAML中為物件元素提供了唯一識別符號用來通過後臺程式碼來訪問這些物件元素。在資原始檔中此方式不適用(在資原始檔中應該使用x:Key來代替x:Name)。許多元素都有Name屬性,當Name和x:Name都可使用時,只能設定其中一個。識別符號必須以字母開頭或者下劃線,並且只能包含字母、數字和下劃線。
x:Null和C#中的null類似(在VB.NET中則是Nothing)。可以通過標記擴充套件({x:Null})或者通過屬性元素(<x:Null/>)。

XAML的樹形結構

與傳統的winform不同的是,XAML使用樹狀的層次結構來描述UI,你可以很直觀的知道,一個按鈕位於哪個控制元件內部,這與winform的desinger檔案截然不同,類似於panel.add(button)這樣的程式碼,你才知道按鈕位於一個panel之內,這樣的表現方式很不直觀。
  1. <Windowx:Class="WpfApplication2.Window2"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         Title="Window2"Height="331"Width="454">
  5.     <StackPanelHeight="279"Name="stackPanel1"Width="402"Margin="5"
    Background="AliceBlue">
  6.         <TextBoxHeight="23"Name="textBox1"Width="260"Margin="5"/>
  7.         <TextBoxHeight="23"Name="textBox2"Width="259"/>
  8.         <StackPanelHeight="100"Name="stackPanel2"Width="273"
    Orientation="Horizontal">
  9.             <TextBoxHeight="23"Name="textBox3"Width="120"Margin="5"/>
  10.             <TextBoxHeight="23"Name="textBox4"Width="120"Margin="5"/>
  11.         </StackPanel>
  12.         <ButtonHeight="33"Name="button1"Width="99"Margin="10">
  13.             <ImageSource="/WpfApplication2;component/Images/track.png"/>
  14.         </Button>
  15.     </StackPanel>
  16. </Window>