首先,在這里我要說明的是:這里的例子,都是通過控制台程序來創建WPF應用,而非使用現成的WPF模版。因為WPF模版封裝了創建WPF應用所需要的各種基本元素,並不利於我們學習。
創建一個WPF需要引用的最基本的DLL
1、PersentationCore WPF的核心類庫
2、PersentationFramework 封裝了與WPF控件相關類型的類庫
3、System.Xaml XAML解析的類庫
4、WindowBase Window窗體相關的類庫
引入了這四個類庫之后 我們就可以創建自己的WPF App了
Demo:
class SimpleWPF { //與Console、Winform一樣 WPF自身也是單線程模型 [STAThread] static void Main() { //Window 是WPF中標准的窗體呈現方式 Window mainWindow = new Window(); mainWindow.Title = "這是一個簡單的WPF應用"; //Application類型用於創建一個消息循環 使用戶可以接受來自輸入設備的輸入 Application app = new Application(); Console.WriteLine("Simple WPF Running"); app.Run(mainWindow); #region 等效方式 //mainWindow.Show();//顯示窗體
//app.Run();//先建立消息循環
#endregion } }
在這個例子里 大家應該可以看到 在單線程的主入口點中,我聲明了一個Window對象 和一個Application對象。
這兩個對象是做什么的呢?我在這里解釋下
System.Windows.Application對象 是創建一個消息循環,用以接受用戶的各類輸入事件,以及阻止控制台程序的結束
System.Windows.Window對象 是WPF中標准的窗體類型。
這里提供了一個繼承關系的樹形截圖
從此截圖可以看出 Window類型實際是一個ContentControl類型。 對於Control類型的講解,我們會后期的文章中說明
Window類型還有一個孿生兄弟 叫UserControl,位於System.Windows.Controls命名空間下,UserControl與Window不同,Window會被視為窗體,而UserControl顧名思義被視為一個封裝好的用戶控件。
Application在運行的時候,可以創建一個默認Window窗體並直接調用窗體的Show()方法進行顯示,也可以由Window調用自己的Show()並調用Application的Run()方式來完成窗體的顯示以及消息循環的建立。同時Application會將第一個調用了Show()的窗體認作MainWindow 並可以通過Application的MainWindow屬性獲取及設置新的MainWindow
因為程序是通過控制台來創建的GUI,我們在運行時除了會看到Window窗體,還會看到Console控制台。我們可以通過Console.WriteLine()來輸出各類調試信息,因此在程序發布之前 建議使用這種方式來進行調試。如果不希望看到Console,可以修改項目屬性為Windows應用程序,如下圖
以上就是如何創建一個簡單的WPF應用了,很多人可能還會疑惑,這么創建的WPF應用程序跟拿模版創建的差距咋就那么大呢,下面我用一個例子來告訴大家,模版都做了什么,它的好處在哪。
這是一個模版生成的WPF應用程序。
我們來模擬它
MainWindow 我們只關心他的cs文件, MainWindow類型也是繼承自Window類型,在MainWindow類型里 我們可以重寫On[Event]行為來達到對各種Window窗體的事件的處理
App 分為兩部分 一部分為Xaml 其中有個重要的屬性StarupURI 定義了主窗體的類型,另一部分是App.Xaml.cs 繼承自Application類型,讓我們可以使用Application生命周期中產生的各種事件
App生命周期中有三個特別重要的事件
OnStartup 創建消息循環時觸發
OnExit 結束消息循環時觸發
OnSessionEnding 系統進行關機操作時觸發
在這個例子里 我們將對窗口的創建 延遲到了Application 的 Startup事件中,也就是由Application來管理窗體的創建和銷毀
上代碼:
主入口點 負責創建Application消息循環
class Programs { [STAThread] static void Main() { App app = new App(); Console.WriteLine("App.Run()"); app.Run(); } }
Application類,我們在Stratup事件中創建Window實例,並且向控制台中輸出創建信息
public class App : Application { /// <summary> /// 程序運行時觸發的事件 /// </summary> /// <param name="e"></param> protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); WPF_ApplicationAndWindow.NormalWPF.MainWindow mainWindow = new MainWindow(); Console.WriteLine("Application StartUp And Main Window.Show()"); mainWindow.Show(); } //關機時觸發的事件 protected override void OnSessionEnding(SessionEndingCancelEventArgs e) { base.OnSessionEnding(e); Console.WriteLine("Session Ending"); } //退出WPF時觸發的事件 protected override void OnExit(ExitEventArgs e) { base.OnExit(e); Console.WriteLine("Exit Application"); } }
Window 這個就不多說啥了
public class MainWindow : Window { public MainWindow() { this.Title = "MainWindow"; } //獲取鼠標在窗體內的點擊事件 protected override void OnMouseDown(System.Windows.Input.MouseButtonEventArgs e) { base.OnMouseDown(e); //由於此窗體就是接受事件的窗體 所以這里用This string message = string.Format("MouseDown on Point {0}", e.GetPosition(this)); //輸出控制台 Console.WriteLine(message); MessageBox.Show(message, this.Title); } }
Application對象常用屬性
1、MainWindow
獲取當前Application中的主窗體,如果不進行修改,默認獲取到的是第一個調用Show()的窗體對象
2、Windows
獲取當前Application管理的所有窗體實例 集合類型
3、ShutdownModel
這是一個枚舉類型,用以決定何時應該結束這個Application的聲明周期,枚舉值有三個
OnExplicitShutdown 只有在調用Application.Shutdown()方法時 才能結束生命周期
OnLastWindowClose 當Application所管理的所有窗體都關閉時 結束生命周期
OnMainWindowClose 當Application所管理的MainWindow關閉時 結束生命周期
4、Current (Static)
這是一個靜態屬性,直接通過Application.Current獲取,這個屬性獲取了當前使用的Application實例
Window對象的常用屬性
1、Owner
設置當前實例化的窗體隸屬於哪個窗體,當設置此屬性后,當前實例化窗體會受設置的窗體管理,具有相同的生命周期,並且會一直顯示在設置的窗體前面
2、Owners
獲取當前窗體所擁有的所有子窗體列表
3、ShowInTaskBar
這是一個bool類型,決定窗體是否會顯示在Windows任務欄中
4、WindowStartupLocation
枚舉類型,決定了窗體初始顯示位置
5、WindowStyle
枚舉類型,決定了窗體邊框類型 默認為SingleBorderWindow 擁有一個最大化、最小化、關閉按鈕
6、WindowState
枚舉類型,決定了窗體在Show()之后的顯示方式 默認為Normal 最大化 最小化 還是正常顯示
本篇就講到這里,下一篇會講與WPF相關的一個很重要的概念 “設備無關像素/邏輯像素"
Tips:
說句心里話,每次寫Blog都很揪心,很忐忑。生怕自己寫錯了什么,誤導了別人,也給自己挖了坑。這篇文章里的東西不一定完全正確,因為畢竟我也算是一個初學者,如果有誰看到了其中的失誤或者錯誤,請及時提醒我。曾經也做過WPF的項目,拖拽控件、查找源碼,用過MVVM模式,也是一個CCCV CCAV黨,雖然號稱有半年的WPF開發經驗,實際上真正從頭系統了解WPF的時候,才發現了自己曾經一知半解的很多,誤解的知識也很多。希望以后的日子里能跟大家共同進步,擺脫拖拽工人的模式……
這里提供附件下載(.Net 4.0+VS2010開發):
http://files.cnblogs.com/ShadowLoki/WPF_ApplicationAndWindow.rar