1.1 WPF應用程序的創建
在Windows操作系統中,所有的應用程序都在自己獨立的進程中運行,WPF也不例外。每個進程都有自己獨立的內存地址,進程間的數據是隔離的,進程之間不會相互影響。當應用程序創建進程時,同時創建一個或多個線程。線程在自己的進程空間中運行,在底層,WPF仍然使用Windows的消息驅動機制來實現事務處理。
創建WPF應用程序從創建Application類開始。WPF的主要功能是人機交互,我們可以把當代人機界面(UI)程序歸為兩大類:一類是桌面(desktop)應用程序;一類是互聯網(Web)應用程序。WPF首次實現了對這兩類應用程序的統一編程。
讓我們來創建一個簡單的WPF程序:
using System; using System.Windows; namespace Yingbao.Chapter1 { public class HelloWPF { [STAThread] public static void Main() { Window win = new Window(); win.Title = "WPF application"; win.Content = "Hello WPF!"; win.Show(); Application app = new Application(); app.Run(); } } }
首先,用Yingbao.Chapter1聲明命名空間,并將在本書的所有例程中使用這一慣例。第1章的例程在Yingbao.Chapter1的命名空間中,第2章的例程將在Yingbao. Chapter2的命名空間中等。
然后,引入了.NET中的兩個命名空間: System和System.Windows。 System命名空間提供.NET的基本服務,System.Windows中含有WPF的基本服務。Microsoft把WPF所用的類,都放在System.Windows的命名空間或其下面的命名空間中,如System.Windows.Controls、System.Windows.Input,等等。在Visual Studio的項目下,引入相應的Assembly, 這樣就可以使用這些命名空間中的類了。
Main函數是WPF程序的入口點,它必須是靜態(static)的。所有WPF程序,都必須在單一線程公寓(STA)模型中運行。STA來源于COM,若對此概念不熟悉,可以參考COM的相關著作或文章。在Main函數前加上STAThread屬性,就是滿足WPF的這一要求,即UI不能在多線程的環境中運行。
在這個程序里,創建了一個Window類實例; Window類是管理WPF桌面應用程序的窗口類。其Title屬性就是窗口標題,而Content屬性是窗口中所要顯示的內容。和.NET 1.0中的Form顯示窗口一樣,需要調用Show()方法,最后創建了Application類實例,并調用其Run() 方法。Run() 方法創建了和Win32一樣的消息分配機制,它會接收操作系統發給應用程序的消息,并對相關消息進行響應。這個程序的運行結果如圖1-1所示。

圖1-1 Hello WPF!
你也可以不用調用Window類中的Show方法,而使用更為簡潔的形式:
app.Run(win);
在這種情況下,Run方法將會自動調用win.Show()。