在正文開始之前需要介紹一個人:Sean Sexton. 來自明尼蘇達雙城的軟件工程師。最為出色的是他維護了兩個博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF 。他以類似微博式的150字簡短語言來每天更新一條WPF和C#重要又容易被遺忘的知識。Follow他的博客也有一段日子了,很希望能夠分享給大家。
本系列我不僅會翻譯他的每一個tip,也會加入自己開發之中的看法和見解。本系列我希望自己也能和他一樣堅持下來,每天的進步才能促成偉大。
在這里鄭重說明.該系列是基於Sean Sexton先生的英文博客, Sean Sexton擁有全部版權和撤銷權利。
前文:<1-7> , <8-14>,<15-21>,<22-27>
[小九的學堂,致力於以平凡的語言描述不平凡的技術。如要轉載,請注明來源:小九的學堂。cnblogs.com/xfuture]
#28 WPF入口
對於使用VS新項目創建方式創建的WPF獨立應用程序,該程序的入口是定義在App.g.cs(自動生成的代碼)的Main方法。在默認的項目配置里,是 public static void App.Main(), 是一個靜態方法。
一般來說,一個.net程序的入口是在在其入口類的Main函數,如果一個項目中擁有多個靜態的Main方法,則需要在項目屬性中配置入口的類。在啟動對象下拉框,選擇包含Main函數的類,作為啟動時調用的類。
#29 在WPF Main()中發生的故事
當你使用VS創建了一個WPF獨立程序的時候,VS會自動生成一個繼承自System.Windows.Application的App類,里面包含了入口的Main()靜態函數。這是定義:public
partial
class
App : Application
在Main()函數中,應用程序通過以下三步來進行啟動:
1. 創建一個Application的實例
2. 調用Application.InitializeComponent方法來構建整個應用。
3. 調用Application.Run方法來啟動應用。
代碼如下:
public static void Main() { WpfApplication.App app = new WpfApplication.App(); app.InitializeComponent(); app.Run(); }
#30 單例
System.Application類是單例,意味着你最多在一個WPF Application中創建一個Application的實例,如果你創建了第二個Application的實例,程序就會拋出InvalidOperationException異常。
你可以通過靜態屬性Application.Current來訪問當前的Application類。或者使用派生的App類,App.Current
#31 兩種創建WPF控件的方式
在WPF中你可以通過以下兩種方式來創建控件:
1. 編程的方式:使用C# code
2. 聲明式:使用XAML來聲明控件
舉個例子: 程序啟動需要指定起始的Window。
代碼方式:
private void Application_Startup(object sender, StartupEventArgs e) { MainWindow win = new MainWindow(); win.Show(); }
Xaml:
<Application x:Class="WpfApplication.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> <Application.Resources> </Application.Resources> </Application>
兩種最終實現的效果相同,打開了MainWindow。
#32 WPF生命周期
WPF Startup Event處理的函數中可以得到傳遞來的命令行參數並且進行處理。
命令行的參數可以在StartupEventArgs.Args找到。args是傳入的命令行參數的string 數組。
代碼如下:
private void Application_Startup(object sender, StartupEventArgs e) { foreach (string s in e.Args) { MessageBox.Show(string.Format("Arg: {0}", s)); } }
其實一般做法是重寫其OnStartup方法來代替其startupevent handler
protected override void OnStart(string[] args) { }
#33 監聽Windows會話
當一個用戶關閉Windows或者機器的時候,WPF可以監聽到其事件並可以發出警告。事件名稱為Application.SessionEnding,在用戶注銷和關機時觸發。
通過設置SessionEndingCancelEventArgs.Cancel 為true,可以阻止其注銷/關機行為:
private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e) { MessageBoxResult res = MessageBox.Show("Exiting Windows will terminate this app. Are you sure?", "End Session", MessageBoxButton.YesNo); if (res == MessageBoxResult.No) { e.Cancel = true; }
需要注意的是,這個事件是windows停止時觸發,並不是該WPF應用程序關閉時觸發。
在Win7以上系統,如果你的應用取消了SessionEnding的事件,Windows會通知你你的應用程序阻止了其關機:
后篇會對WPF內部機制繼續做探索,敬請關注!
如果覺得有幫助,右下角贊一下吧~ (* *)