關於WPF的退出

若是你在建立項目的時候細心的查看一下項目的結構,你會發現裏面有一個App.xaml,一見到App咱們知道是應用程序的關鍵了配置了,固然,WPF的啓動窗體也在這裏面設置的。 ide

咱們能夠在App的中配置啓動頁,以下所示: 測試

image

固然,咱們還能夠再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();

//new MainWindow().Show();

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)

強制回收,關閉系統。

相關文章
相關標籤/搜索