如果你在建立項目的時候細心的檢視一下項目的結構,你會發現裡面有一個App.xaml,一見到App我們知道是應用程式的關鍵了配置了,當然,WPF的啟動窗體也在這裡面設定的。
我們可以在App的中配置啟動頁,如下所示:

當然,我們還可以再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)
強制回收,關閉系統。