若是你在建立項目的時候細心的查看一下項目的結構,你會發現裏面有一個App.xaml,一見到App咱們知道是應用程序的關鍵了配置了,固然,WPF的啓動窗體也在這裏面設置的。 ide
咱們能夠在App的中配置啓動頁,以下所示: 測試
固然,咱們還能夠再App.cs重寫OnStartUp來設置要啓動的頁面來設置啓動的頁面,如: this
public partial class App : Application 線程
{ blog
protected override void OnStartup(StartupEventArgs e) 事件
{ ci
new Login().Show(); get
base.OnStartup(e); it
} io
}
程序的退出看着挺簡單的,調用App.Current.Shutdown();則程序就退出了,這僅適用於簡單的狀況,接下來用實際的測試來講話:
最簡的請框如上一篇的登陸窗口,咱們給Cancel按鈕添加一個事件(之後會詳細介紹,如今就雙擊OK了),而後再裏面實現。WPF的退出方法以下所示的:
this.Close();// 關閉當前窗口,能夠在OnClosing和 OnClosed中捕獲消息,在OnClosing的時候,能夠取消關閉窗口。
Environment.Exit(0);// 強制退出,即便有其餘的線程沒有結束
Application.Current.Shutdown();// 關閉當前程序,若是有其餘線程沒有結束,不會關閉
App.Current.Shutdown();// 同Application,沒有和App區分出來。
接下來貼出代碼:
測試代碼以下:
public Login()
{
InitializeComponent();
this.Closing += (s, r) =>
{
// 我不是想真的退出,我想保持最小托盤
Debug.WriteLine("I'am running,and change status");
r.Cancel = true;
Debug.WriteLine("I'am backing");
};
this.Closed += (s, r) =>
{
// 退出了啊
Debug.WriteLine("I'am Closed");
};
//new Thread(() => { while (true) { Thread.Sleep(100); Debug.WriteLine("I'am Running"); } }).Start();
}
當咱們沒有啓動新線程的時候,打印的消息以下:
開始的時候,僅僅在Login中調用不一樣的方法,打印的消息以下所示:
//輸出:
//I'am running,and change status
//I'am backing
// 程序沒有退出
//this.Close();
//輸出:
//沒有輸出任何消息,沒有調用Closed和Closing
// 程序強制退出
//Environment.Exit(0);
//輸出:
//I'am running,and change status 執行了方法,可是程序仍是強制退出了
//I'am backing
//I'am Closed
// 程序強制退出
//Application.Current.Shutdown();
//輸出:
//I'am running,and change status 執行了方法,可是程序仍是強制退出了
//I'am backing
//I'am Closed
//force closed
// 程序強制退出
//App.Current.Shutdown();
當咱們啓用新線程的時候,則除Environment.Exit(0),打印幾個I'am Running以後,程序就徹底退出了,可是其餘的都沒有提出系統。
那麼Close在何時會退出程序呢?
如過調用了Close,而在Closing中沒有顯示的取消退出,則系統能夠退出,這種狀況僅僅是在沒有多餘線程,沒有其餘窗口啓動的時候,若是有其餘窗口同時啓動,則要考慮App.Current.ShutdownMode。
若是在App裏面顯示的或者退出系統以前顯示的設置了App.Current.ShutdownMode,此時系統也不會有退出不徹底的狀況,當系統App.Current.ShutdownMode=OnMainWindowClose的時候,此時若是,調用主窗口的Close,則系統會退出(沒有殘餘線程的狀況),即便在主窗口中又彈出了其餘的窗口。若是設置了App.Current.ShutdownMode=OnLastWindowClose,則此時系統不會關閉,何時關閉呢?全部的彈出窗口都關閉的狀況下會退出系統(沒有殘餘線程的狀況)。
當設置App.Current.ShutdownMode=OnExplicitShutdown的時候,此時較複雜,此時不管什麼樣的順序調用Close都不會關閉窗口,必須顯示的調用Application.Current.ShutDown()方法,系統纔會退出。
總結一下退出就是:Close->Application.Current.ShutDow()->Enviroment.Exit(0)
弱-------------------------------------------------> 強
Close->退出系統時候要看App的ShutDownModel設置
若是系統有爲釋放的線程,或者先釋放掉,或者調用Enviroment.Exit(0)
強制回收,關閉系統。