標籤:目錄 new ram xpl nav images 視窗 space progress
接上文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上的一張圖片進行說明。顯示了視窗的生存期中的主體事件的順序。
WPF入門教程系列三——Application介紹(續)