接上文WPF入門教程系列二——Application介紹,咱們繼續來學習Applicationhtml
3、WPF應用程序的關閉瀏覽器
WPF應用程序的關閉只有在應用程序的 Shutdown 方法被調用時,應用程序才中止運行。 ShutDown 是隱式或顯式發生,能夠經過指定 ShutdownMode 的屬性值來進行設置。app
ShutdownMode選項post |
|
OnLastWindowClose(默認值):學習 |
應用程序關閉時,或最後一個窗口關閉時關閉,或調用Application對象的Shutdown() 方法時,應用程序關閉。ui |
OnMainWindowCloseurl |
啓動窗體關閉或調用Application對象的Shutdown()方法時,應用程序關閉。(和C#的Windows應用程序的關閉模式比較相似)spa |
OnExplicitShutdown操作系統 |
只有在調用Application對象的Shutdown()方法時,應用程序纔會關閉。code |
<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 |
獲取在應用程序中實例化窗口。 |
4、添加Application對象事件
名稱 |
說明 |
Activated |
當應用程序成爲前臺應用程序時觸發。 |
Deactivated |
當應用程序再也不是前臺應用程序時觸發。 |
DispatcherUnhandledException |
若是異常是由應用程序引起,但未處理,觸發。 |
Exit |
在應用程序關閉以前,觸發,並且不能撤消。 |
FragmentNavigation |
發生在應用程序的一個瀏覽器啓動導航到內容片斷導航時,會當即發生,若是所需片斷在當前目錄,或者,在源 XAML 目錄加載後,若是所需片斷在其餘內容。 |
LoadCompleted |
在導航到在應用程序中的一個瀏覽器的目錄加載的分析完成並已呈現時觸發。 |
Navigated |
當導航到在應用程序中使用的瀏覽器已找到的內容時觸發,這時它可能尚未完成加載。 |
Navigating |
在一個新的導航由應用程序,一個瀏覽器請求發生。 |
NavigationFailed |
出現問題,則錯誤,當應用程序的一個瀏覽器導航到所請求的內容時。 |
NavigationProgress |
按期發生在應用程序中使用瀏覽器管理提供導航進度信息的下載過程。 |
NavigationStopped |
發生在一個瀏覽器的 StopLoading 方法在應用程序的調用,或者,若是新的導航由瀏覽器請求,在當前導航正在進行的。 |
SessionEnding |
當用戶在註銷或關閉操做系統關閉 Windows 會話時發生。 |
Startup |
當 Application 對象的 Run 方法調用,發生。 |
在應用程序中添加事件的方式有以下三種。
第一種方式:
一、在App.xaml中作事件的綁定,在App.xaml.cs文件中添加事件的處理方法
在App.xaml文件中,具體添加方法見下圖。
二、添加完事件以後的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>
三、在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便可。
第二種方式
一、能夠像是在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(); } } }
第三種方式
5、WPF應用程序生存週期
WPF應用程序的生命週期與執行順序,用MSDN上的一張圖片進行說明。下圖顯示了窗口的生存期中的主體事件的順序。