接上文WPF入門教程系列二——Application介紹,我們繼續來學習Application
三、WPF應用程序的關閉
WPF應用程序的關閉只有在應用程序的 Shutdown 方法被調用時,應用程序才停止運行。 ShutDown 是隱式或顯式發生,可以通過指定 ShutdownMode 的屬性值來進行設置。
ShutdownMode選項 |
|
OnLastWindowClose(默認值): |
應用程序關閉時,或最后一個窗口關閉時關閉,或調用Application對象的Shutdown() 方法時,應用程序關閉。 |
OnMainWindowClose |
啟動窗體關閉或調用Application對象的Shutdown()方法時,應用程序關閉。(和C#的Windows應用程序的關閉模式比較類似) |
OnExplicitShutdown |
只有在調用Application對象的Shutdown()方法時,應用程序才會關閉。 |
- 對ShutdownMode選項的更改,可以直接在App.xaml中更改,如下代碼。
<Application x:Class="WpfApp1.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml" ShutdownMode="OnExplicitShutdown" > <Application.Resources> </Application.Resources> </Application>
2. 在代碼文件(App.xaml.cs)中修改ShutdownMode選項,但必須注意這個設置要寫在app.Run()方法之前 ,如下代碼。
app.ShutdownMode = ShutdownMode.OnExplicitShutdown;
app.Run(win);
Application對象的其他屬性:
名稱 |
說明 |
Current |
獲取當前 AppDomain的 Application 對象。 |
Dispatcher |
獲取與此 DispatcherObject 關聯的 Dispatcher。 (繼承自 DispatcherObject。) |
MainWindow |
獲取或設置應用程序的主窗口。 |
Properties |
獲取應用程序范圍的屬性集合。 |
ResourceAssembly |
獲取或設置對於 WPF 應用程序的資源提供已裝箱統一資源標識符 (URI) 的 Assembly 。 |
Resources |
獲取或設置應用程序范圍資源的集合,例如樣式和畫筆。 |
ShutdownMode |
獲取或設置會導致 Shutdown 方法調用的情況。 |
StartupUri |
獲取或設置自動顯示的 UI ,當應用程序啟動時。 |
Windows |
獲取在應用程序中實例化窗口。 |
四、添加Application對象事件
名稱 |
說明 |
Activated |
當應用程序成為前台應用程序時觸發。 |
Deactivated |
當應用程序不再是前台應用程序時觸發。 |
DispatcherUnhandledException |
如果異常是由應用程序引發,但未處理,觸發。 |
Exit |
在應用程序關閉之前,觸發,而且不能撤消。 |
FragmentNavigation |
發生在應用程序的一個瀏覽器啟動導航到內容片段導航時,會立即發生,如果所需片段在當前目錄,或者,在源 XAML 目錄加載后,如果所需片段在其他內容。 |
LoadCompleted |
在導航到在應用程序中的一個瀏覽器的目錄加載的分析完成並已呈現時觸發。 |
Navigated |
當導航到在應用程序中使用的瀏覽器已找到的內容時觸發,這時它可能還沒有完成加載。 |
Navigating |
在一個新的導航由應用程序,一個瀏覽器請求發生。 |
NavigationFailed |
出現問題,則錯誤,當應用程序的一個瀏覽器導航到所請求的內容時。 |
NavigationProgress |
定期發生在應用程序中使用瀏覽器管理提供導航進度信息的下載過程。 |
NavigationStopped |
發生在一個瀏覽器的 StopLoading 方法在應用程序的調用,或者,如果新的導航由瀏覽器請求,在當前導航正在進行的。 |
SessionEnding |
當用戶在注銷或關閉操作系統關閉 Windows 會話時發生。 |
Startup |
當 Application 對象的 Run 方法調用,發生。 |
在應用程序中添加事件的方式有如下三種。
第一種方式:
1、在App.xaml中做事件的綁定,在App.xaml.cs文件中添加事件的處理方法
在App.xaml文件中,具體添加方法見下圖。
2、添加完事件之后的app.xml文件代碼如下
<Application x:Class="WpfApp1.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml" ShutdownMode="OnExplicitShutdown" Activated="Application_Activated" Exit="Application_Exit"> <Application.Resources> </Application.Resources> </Application>
3、在App.xaml.cs文件的代碼如下:
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Threading.Tasks; using System.Windows; namespace WpfApp1 { /// <summary> /// App.xaml 的交互邏輯 /// </summary> public partial class App : Application { private void Application_Activated(object sender, EventArgs e) { } private void Application_Exit(object sender, ExitEventArgs e) { } } }
4.在使用以上方式添加事件之后,如果在Visual Studio中按F5 執行應用程序時,報以下錯誤“不包含適合於入口點的靜態‘Main’方法”。這個錯誤是由於Visual Studio把項目文件(*.csproj)中原來自動生成的app.xaml相關的定義進行了修改。具體區別如下:
1) 直接新建的WPF項目中的有關App.xaml的定義如下:
<ApplicationDefinition Include="App.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> </ApplicationDefinition>
2) Visual Studio把修改后的App.xaml的配置代碼如下:
<Page Include="App.xaml"> <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> </Page>
第一段代碼中App.xaml在項目文件里面用ApplicationDefinition標簽定義。第二段代碼中App.xaml在項目文件里面用Page標簽定義,這種定義是指App.xaml只是一個頁面而已。
因此,只需要把項目文件中將App.xaml的配置由Page修改成ApplicationDefinition即可。
第二種方式
1、可以像是在WinForm中的Program類中寫Main方法一樣,在WPF中一樣可以自定義一個app類中寫main及其他相關事件。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; namespace WpfApp1 { class App { [STAThread] static void Main() { // 定義Application對象作為整個應用程序入口 Application app = new Application(); MainWindow win = new MainWindow(); app.ShutdownMode = ShutdownMode.OnMainWindowClose; app.MainWindow = win; //是必須的,否則無法顯示窗體 win.Show(); app.Run(); app.Activated += app_Activated; app.Exit += app_Exit; } static void app_Activated(object sender, EventArgs e) { throw new NotImplementedException(); } static void app_Exit(object sender, ExitEventArgs e) { throw new NotImplementedException(); } } }
第三種方式
- 在App.xaml界面中,如下圖位置1處,輸入Exit事件名稱,Visual Studio 2013會彈出一個菜單“新建事件處理程序”,雙擊這個菜單,Visual Studio 2013就會自動創建一個“Application_Exit”事件,如下圖位置2處。
五、WPF應用程序生存周期
WPF應用程序的生命周期與執行順序,用MSDN上的一張圖片進行說明。下圖顯示了窗口的生存期中的主體事件的順序。