關於WPF的退出


如果你在創建項目的時候細心的查看一下項目的結構,你會發現里面有一個App.xaml,一見到App我們知道是應用程序的關鍵了配置了,當然,WPF的啟動窗體也在這里面設置的。

我們可以在App的中配置啟動頁,如下所示:

image

當然,我們還可以再App.cs重寫OnStartUp來設置要啟動的頁面來設置啟動的頁面,如:

public partial class App : Application

{

protected override void OnStartup(StartupEventArgs e)

{

new Login().Show();

base.OnStartup(e);

}

}

程序的退出看着挺簡單的,調用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)

強制回收,關閉系統。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM