俗話說,工欲善其事必先利其器。在開始利用XAML開發WPF程序之前,我們最希望的應該是一個強大的WPF開發工具。在本章中,將介紹創建和運行一個XAML程序所必須的軟件環境,而後對一個XAML工程的基本結構進行詳細的說明,最後就是如何編譯和運行一個WPF程序。
注意,本章需要的知識點雖然不是很復雜,但是仍然需要您具備一些ASP.Net或Html方面的基礎知識,這樣在對XAML的學習和理解方面才不至於太困難。
運行XAML所需的軟件環境
雖然XAML是專門為Vista操作系統設計的,但是我們也可以在Windows XP和Windows Server 2003上使用它。這樣使得就算Vista操作系統還沒有正式發布,開發人員也可以在Windows XP和Windows Server 2003上對XAML和Microsoft Windows SDK進行預先的學習。
下面是各個可以使用XAML的操作系統版本:
1. Windows XP SP2
2. Windows Server 2003 SP1
3. Vista
在Windows XP SP2和Windows Server 2003 SP1的操作系統上,我們首先要安裝.NET Framework 3.0,它在.Net Framework 2.0的基礎上還添加了對WPF、WCF、WF和CardSpace等諸多功能的支持。但是無論是使用的是何種操作系統,您都必須安裝Microsoft Windows SDK,在該軟件開發包中,它包含使用XAML設計用戶界面時所需的類庫、工具以及一系列的開發文檔和代碼示例。
如果你打算使用WinFX Extensions to Visual Studio 2005來開發XAML和WPF程序,那麼你需要在安裝Microsoft Windows SDK前安裝Visual Studio 2005。為此它的正確安裝順序為:
1. .Net Framework 3.0
2. Visual Studio 2005
3. Microsoft Windows SDK
4. WinFX Extensions to Visual Studio 2005
最後在Visual Studio 2005中通過"文件"-"新建項目"命令,在彈出的"新建項目"對話框中有一個項目類型列表,選擇Window(WinFX),這樣我們就可以使用這些模板來開發相應類型的WPF程序了。如下圖所示:
定義一個XAML程序
在這裡我們就先不使用WinFX Extensions to Visual Studio 2005來構建一個包含XAML代碼的WPF程序了,因為它包含了一些自動生成的XAML代碼,為了循序漸進地學習XAML的基礎語法和規則,在本小節中就用記事本來開發一個簡單的包含XAML的WPF程序。
一般來說,我們通常是將一個WPF的代碼分別存放在兩個不同類型的文件中。例如.xaml頁面文件用來保持為該WPF程序構建的用戶界面代碼,而代碼後置文件.xaml.cs則用來保存應用程序邏輯和事件處理代碼。雖然XAML沒有提供一個實現事件處理的機制,但是它可以直接通過執行引擎調用用C#或者VB.Net編寫的事件處理方法。如果您是一個開發人員,或許你專注的只是應用程序邏輯和事件處理程序的開發。但是在該WPF程序中界面代碼和程序邏輯是分離的,所以你必須和其它的設計人員進行良好的溝通,使得你可以確切地知道事件處理方法的名稱和程序所引用的元素名稱(事件處理方法的名稱和元素名稱都是在XAML文件中指定的)。
提示:你可以完全使用C#或VB.Net來定義一個XAML程序,在前面我們講過,所有的XAML元素都是代表一個WPF類,因此你可以通過代碼的方式去實現XAML的界面設計。但是XAML可以將應用程序的呈現層完全和程序邏輯分離開來,為此就使得設計人員和開發人員可以更加專注於自己的領域,而在需要修改界面元素或程序邏輯時互不影響。
XAML頁面文件通常包含兩種類型的元素,一種就是用來構建用戶界面的元素,另外一種則是應用程序元素。而Application就是一個常用的應用程序元素。我們在使用Visual Studio 2005開發一個ASP.Net站點時通常會使用圖1的方式,將某個頁面設置為起始頁。而在一個WPF程序中,我們可以使用Application元素指定在該WPF程序啟動時,首先執行那個XAML頁面文件。為此,在我們手動創建一個WPF程序時,首先要編寫的就是應用程序定義文件。下面是一個名為MyApp的應用程序定義文件,其代碼如下:
MyApp.xaml:
01 <Application
02 XMLns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
03 XMLns:x="http://schemas.microsoft.com/winfx/2006/xaml"
04 StartupUri="Page1.xaml">
05 </Application>
在上述的應用程序定義文件中,我們設置了兩種類型的屬性,分別為命名空間和StartupUri,StartupUri屬性就是用來指定應用程序開始時所要加載的起始XAML文件。
圖1 ASP.Net中設置起始頁的方法
在XAML中,每個元素都是代表一個相應的WPF類,並且元素的各個屬性也是對應類的屬性。惟一的例外就是xmlns和xmlns:x兩個屬性,它們指定了該XAML頁面文件所使用的默認命名空間,而不是某個類的屬性。通常我們在應用程序定義文件中設置好這兩個命名空間作為WPF程序引用的默認命名空間,如果不做這樣設置的話,那麼你必須為應用程序定義文件中的所有XAML每個元素都指定相同的兩個xmlns和xmlns:x屬性,這和我們在C#中使用using關鍵字來引用命名空間是類似的。為了減少重復且冗長的輸入,我們最好是在應用程序定義文件事先設置好這些默認的命名空間。但是有一種情況除外,那就是使用的是自己命名空間中所定義的元素,在這種情況下,可以將自定義元素的xmlns和XMLns:x屬性指定為自身的命名空間。在本文的所有代碼示例中,都將在根元素中引用上述的兩個默認命名空間,當然你也可以對根元素中的所有元素都指定命名空間,但是這種方式是不推薦的,因為這樣不但繁雜,而且使得XAML頁面代碼冗長。
在任何一個XAML頁面文件中首先聲明的元素就是前面我們所提及的根元素,每個根元素最好都引用默認的命名空間,在目前版本的WPF程序中,所以的根元素引用的都是下面的兩個命名空間:
http://schemas.microsoft.com/winfx/2006/xaml/presentation
http://schemas.microsoft.com/winfx/2006/xaml
提示:為什麼說目前的WPF程序引用的是上述的兩個命名空間呢?這是因為到Vista正式發布時,這兩個命名空間的名稱可以會發生變化,在以前的CTP版本中,WPF程序引用的命名空間名稱為http://schemas.microsoft.com/winfx/avalon/2005。
在根元素中可以包含其它的XAML元素。在應用程序定義文件中的最常用的就是Application元素,而且根據你所創建的是Windows應用程序還是Browser應用程序,分別使用特定的Windows和Page作為XAML文件的根元素。
在代碼2-1中,我們在根元素Application指定了該程序執行時首先加載的XAML頁面文件,在上述示例中,StartupUri的屬性值為"Page1.xaml",下面我們就來創建Page1.xaml,該文件包含了用戶界面的實際定義,就像其它的XAML頁面文件一樣,我們需要為該文件使用一個根元素。其完整的XAML頁面代碼如下:
Page1.xaml
01 <Page XMLns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
02 XMLns:x="http://schemas.microsoft.com/winfx/2006/xaml">
03 <StackPanel>
04 <TextBlock>Hello World</TextBlock>
05 <Button Width="100">Click Me</Button>
06 </StackPanel>
07 </Page>
在上述程序代碼中,我們在第1行代碼處設置了XAML頁面文件的根元素為Page,這說明了該WPF程序將使用浏覽器進行呈現。第3行代碼使用了StackPanel元素,它是用來包含其它的XAML元素的一個容器,功能和它類似的還有DockPanel元素,我們將在後續的學習過程中詳細介紹這兩個元素,現在你使要知道的就是它們是一個用來包含其它XAML元素的容器元素即可。第4行代碼中使用的是TextBlock,這個元素和ASP.Net的Label空間非常類似,用來顯示一段文本信息。將這段代碼粘貼到XAMLPad中,其顯示的效果如下:
這是一個及其簡單的XAML頁面文件,除了一些必要的屬性外,我們並沒有進行其它的一些額外設置,例如對該頁面應用樣式、布局等,對於這些信息的使用方法將在後續直接進行介紹。在這一節中我們只需關注如何創建一個最簡單的應用程序定義文件和XAML頁面文件即可。現在我們已經創建了MyApp,xaml和Page1.xaml這兩個XAML文件,那麼通過什麼樣的方法才能編譯這些文件,並執行最終的可執行文件呢?具體的實現過程將在下一節中進行介紹。