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);//由于此窗體就是接受事件的窗體 所以這里用Thisstring 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的時候,才發現了自己曾經一知半解的很多,誤解的知識也很多。希望以后的日子里能跟大家共同進步,擺脫拖拽工人的模式……
總結
以上是生活随笔為你收集整理的WPF框架剖析,从头开始自己写WPF框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 430单片机实现三人投票表决器_基于单片
- 下一篇: altium designer 常用元件