部落格園WPF Application類

來源:互聯網
上載者:User

標籤:write   font   使用者   選項   主線程   令行   table   cti   完全   

所有的WPF程式,都是由Application類執行個體建立,該類負責開啟當前應用程式和表單,並且決定如何關閉應用程式等。Application類的主要功能可以簡單總結以下幾點:

1、保持主線程

使用Application後,只要有表單沒有退出,則應用程式不會退出,他會重新定義出新的主表單,只有所有的表單都關閉,Appliction才決定是否退出應用程式。Application起到管理所有表單的作用。看如下代碼:

class Program{     [STAThread()]     static void Main(string[] args)     {         Application app = new Application();         Window win = new Window();         app.Run(win);     }}

效果會開啟一個應用程式,假如我們不使用Application ,代碼如下:

class Program{     [STAThread()]     static void Main(string[] args)     {        Window win = new Window();         win.ShowDialog();     }}

感覺效果上,沒有任何差別,但實際上,兩個完全不一樣,假如我們定義一個MainWindow的類,在這個類中放一個按鈕,彈出另外一個表單,效果會怎麼樣呢,看如下代碼:

class Program   {       [STAThread()]       static void Main(string[] args)       {           Application app = new Application();           Window win = new Window();           win.MouseDown += Win_MouseDown;           win.ShowDialog();           app.Run();       }      private static void Win_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)       {           Window win = new Window();           win.Show();       }   }

當我們關閉父表單,應用程式並沒有退出。如果將Application去掉,編寫以下代碼:

class Program    {        [STAThread()]        static void Main(string[] args)        {            Window win = new Window();            win.MouseDown += Win_MouseDown;            win.ShowDialog();               }       private static void Win_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)        {            Window win = new Window();            win.Show();        }    }

我們關閉父表單,則整個應用程式退出。

這說明Applicationn在有任何一個表單存在的情況下,能保證軟體的持續運行,保證主線程不退出。

2、啟動xaml表單

我們可以通過指定StartupUri ,來告訴Appliction如何啟動表單,其代碼如下:

class Program{     [STAThread()]     static void Main(string[] args)     {         Application app = new Application();         app.StartupUri = new Uri("MainWindow.xaml",System.UriKind.Relative);         app.Run();     }}

所以,我們在編寫wpf應用程式的時候,會有一個App.xaml的檔案,其就是Appliction的定義,看看其代碼如下:

<Application x:Class="Ani.App"              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"              xmlns:local="clr-namespace:Ani"              StartupUri="MainWindow.xaml"></Application>

也是通過指定StartupUri屬性,啟動表單,那Application是如何啟動的呢,我們可以在當前程式的obj目錄下面,可以看到App.g.cs檔案,開啟裡面的代碼,可以看到如下代碼:

public partial class App : System.Windows.Application {     /// <summary>     /// InitializeComponent     /// </summary>     [System.Diagnostics.DebuggerNonUserCodeAttribute()]     [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]     public void InitializeComponent() {                  #line 5 "..\..\App.xaml"         this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);                  #line default         #line hidden     }     /// <summary>     /// Application Entry Point.     /// </summary>     [System.STAThreadAttribute()]     [System.Diagnostics.DebuggerNonUserCodeAttribute()]     [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]     public static void Main() {         Ani.App app = new Ani.App();         app.InitializeComponent();         app.Run();     }}

所以WPF應用程式會主動給我們建立一個主程式App.cs和一個App.xaml檔案,但App.cs並沒有對編輯器放開,我們只需要編輯App.xaml檔案即可

3、應用程式的關閉方式

Application裡面有一個ShudonwModel屬性,這個屬性是一個枚舉對象,用於指定當前應用程式的關閉方式,其有三個選項。

OnLastWindowClos e 預設行為,只要至少一個表單存在,應用程式就保持運行狀態,應用程式會根據表單的開啟循序,自動指定主表單。
OnMainWindowClose 這個是指,只要主表單(最新開啟)存在,應用程式才保持運行狀態
OnExplicaitShutdown 除非調用Appliction.Shutdown()方法,否則應用程式不會結束。

代碼如下:

<Application x:Class="Ani.App"              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"              xmlns:local="clr-namespace:Ani"              StartupUri="MainWindow.xaml" ShutdownMode="OnLastWindowClose"></Application>

4、應用程式的事件

Application提供了為數不多幾個事件,但這幾個事件非常有用。

4.1 Startup

這個事件在調用Appliction.Run()方法之前,並且在主表單顯示之前發生,可以使用這個事件讀取當前應用程式的命令列參數,而且還示意使用該事件指定StartupUri 屬性

4.2 Exit

事件發生在應用程式關閉時(不管是什麼原因關閉),並在Run()方法返回之前發生,但此時已經不能取消關閉,但是可以通過Run()方法重新啟動程式。

4.3 SessionEnding

該事件在window對話結束時發生,例如,當使用者關閉或者登出電腦時,我們來確定是否關閉應用程式,我們可以設定SessionEndingEventArgsCancel屬性設定為true來取消關閉應用程式。否則,當事件處理結束後,WPF會調用Application.Shutdown()方法關閉事件。

4.4 Activated

啟用當前應用程式的時候調用,當從另外一個應用程式切換到當前應用程式的時候調用,當第一次顯示表單的時候調用

4.5 Deactived

當取消啟用應用程式中的表單的時候,觸發該事件。當切換到另外一個應用程式時,調用該事件。

4.6 DispatcherUnhandledException

當應用程式中的任何位置,只要發生未處理的異常,就會發生該事件,使用該事件來記錄重要錯誤。

5、處理命令列參數

為了處理命令列參數,需要響應Application.Startup事件。命令列參數以參數通過StartupEventArgs.Args屬性作為字串數組提供。

public partial class App : Application{     private void Application_Startup(object sender, StartupEventArgs e)     {         if (e.Args.Length > 0) {            foreach (var arg in e.Args) {                Console.WriteLine(arg);             }         }     }}

6、負責表單之間的互動

我們可以通過Application的current屬性,擷取當前的Appliction,也可以通過Application的MainWindow屬性,擷取當前的主表單,所以,可以通過Application訪問當前的Application裡面的資料,同時可以訪問主表單的資料。我們可以將一些全域資訊,定義在Application中,那麼應用程式在任意位置都可以訪問,實現所有表單互相互動,如下代碼:

public partial class App : Application{     public List<string> Globals = new List<string>();         private void Application_Startup(object sender, StartupEventArgs e)     {         ((App)Application.Current).Globals.Add("hello");     }}

部落格園WPF Application類

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.