Windows Phone的應用程式項目會通過Visual Studio完成XAML頁面的編譯,在程式運作時會通過直接連結操作加載和解析XAML,将XAML和過程式代碼自動連接配接起來。如果你不在乎将XAML檔案和過程式代碼融合,那麼隻需要把它添加到Visual Studio的Windows Phone項目中來,并用界面中的Build動作來完成編譯即可,一般公共的樣式資源的XAML檔案都是采用這種方式。但是如果要編譯一個XAML檔案并将它與過程式代碼混合,第一步要做的就是為XAML檔案的根元素指定一個子類,可以用XAML語言命名空間中的Class關鍵字來完成,一般Windows Phone的程式頁面是采用這種方式,通常在Windows Phone項目新增的XAML檔案都會自動地生成一個對應的XAML.CS檔案,并且預設地将兩個檔案關聯起來,例如,添加的XAML檔案如下:
與XAML檔案關聯起來的XAML.CS檔案如下:
通常我們把與XAML檔案關聯的XAML.CS檔案叫作代碼隐藏檔案。如果你引用XAML中的任何一個事件處理程式(通過事件特性,如Button的Click特性),這裡就是我們定義這些事件處理程式的地方。類定義中的partial關鍵字很重要,因為類的實作是分布在多個檔案中的。可能你會覺得奇怪,因為在項目裡面隻看到了MainPage.xaml.cs檔案定義了MainPage類,其實MainPage類還在另外一個地方定義了,隻是在項目工程裡面隐藏了而已。當我們編譯完Windows Phone的項目時,你會在項目的obj\Debug檔案夾下看到Visual Studio建立的以g.cs為擴充名的檔案,對于每一個XAML檔案,你會找到對應有一個g.cs檔案。例如,如果我們項目中有一個MainPage.xaml檔案,你就會在obj\Debug檔案夾下找到MainPage.g.cs檔案。下面來看一下MainPage.g.cs檔案的結構:
從MainPage.g.cs檔案中我們可以看到,MainPage類在這裡還定義了一些控件和相關的方法,并且InitializeComponent()方法裡面加載和解析了MainPage.xaml檔案MainPage.cs檔案裡面的MainPage()方面裡面調用的InitializeComponent()方法就是在MainPage.g.cs檔案裡面定義的。在xaml頁面中聲明的控件,通常會在.g.cs中生成對應控件的内部字段。實際上這取決于控件是否有x:Name屬性,隻要有這個屬性,都會自動調用FindName方法,用于把字段和頁面控件關聯。沒有x:Name屬性,則沒有字段,這種關聯會有一定的性能浪費,因為是在應用載入控件的時候,通過LoadComponents方法關聯的,而xaml也是在這個時候動态解析的。
在項目的obj\Debug檔案夾下,我們還找到了g.i.cs為擴充名的檔案,對于每一個XAML檔案,你也會找到對應有一個g.i.cs檔案,并且這些g.i.cs檔案與對應的g.cs檔案是基本一樣的。那麼這些g.i.cs檔案又有怎樣的含義呢?其實這些g.i.cs檔案并不是在編譯的時候生成的,而是當你建立了XAML檔案的時候就馬上生成,或者你修改了XAML檔案g.i.cs檔案也會跟着改變,而g.cs檔案則是必須要成功編譯了項目之後才會生成的。檔案字尾中的g表示generated産生的意思,i表示intellisense智能感覺的意思,g.i.cs檔案是XAML檔案對應的智能感覺檔案,在vs中利用go to definition功能找InitializeComponent方法的實作的時候,進入的就是g.i.cs檔案的InitializeComponent方法裡面。
動态加載XAML是指在程式運作時通過解析XAML格式的字元串或者檔案來動态生成UI的效果。通常情況下,Windows Phone的界面元素都是通過直接讀取XAML檔案的内容來呈現的,如上一小節講解的那樣通過XAML檔案和XAML.CS檔案關聯起來編譯,這也是預設的UI實作的方式,但是在某些時候你并不能預先設計好所有的XAML元素,而是需要在程式運作的過程中動态地加載XAML對象,那麼這時候就需要使用到動态加載XAML來實作了。
在應用程式裡面動态加載XAML需要使用到XamlReader.Load方法來實作,XamlReader 類是為分析 XAML 和建立相應的 Windows Phone 對象樹提供 XAML 處理器引擎,XamlReader.Load 方法可以分析格式良好的 XAML 片段并建立相應的 Windows Phone對象樹,然後傳回該對象樹的根。大部分可以再XAML頁面上編寫的代碼,我們都可以通過動态加載XAML的形式來實作,不僅僅是普通的UI控件,動畫等其他的XAML代碼我們一樣可以動态加載,如:
使用 XamlReader.Load方法動态加載XAML對XAML的字元串是有一定的要求的,那麼這些“格式良好的 XAML 片段”必須要符合以下要求:
(1)XAML 内容字元串必須定義單個根元素,使用XamlReader.Load建立的内容隻能賦予一個Windows Phone對象,它們是一對一的關系。
(2)内容字元串 XAML 必須是格式良好的 XML,并且必須是可分析 XAML。
(3)所需的根元素還必須指定某一預設的 XML 命名空間值。這通常是命名空間 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"。
下面給出動态加載XAML的示例: 示範了使用XamlReader.Load方法加載XAML字元串生成一個按鈕和加載XAML檔案生成一個矩形。
代碼清單1-1:動态加載XAML(源代碼:第1章\Examples_1_1)

WP8.1技術交流群:372552293
本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1559352