【WPF学习】第二十六章 Application类——应用程序的生命周期

  在WPF中,应用程序会经历简单的生命周期。在应用程序启动后,将当即建立应用程序对象,在应用程序运行时触发各类应用程序事件,你能够选择监视其中的某些事件。最后,当释放应用程序对象时,应用程序将结束。html

1、建立Application对象app

  使用Application类的最简单方式是手动建立它。下面的示例演示了最小的程序:在应用程序入口(Main()方法)处建立名为MainWindow的窗口,并启动一个新的应用程序:ide

  在本质上,Visual Studio为Application类使用的模型与用于窗口的模型相同。起点是XAML模板,默认状况下该模板被命名为App.xaml,它看起来以下所示:学习

<Application x:Class="TestApplication.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
</Application>

  在“【WPF学习】第四章 加载和编译XAML”介绍过,在XAML中使用Class特性建立派生自元素的类。所以,该类建立派生自Application的类,类名为TestApplication.App(TestApplication是项目名称,也是在其中定义类的名称空间,App是Visual Studio为派生自Application的自定义类使用的名称。若是愿意,可将类名该为任何更有趣的内容)。spa

  Application标签不只建立自定义的应用程序类,还设置StartupUri属性来肯定表明主窗口的XAML文档。所以,不须要时候用代码显示地实例化这个窗口——XAML解析器将自动完成这项工做。code

  与窗口同样,应用程序类也在两个独立部分中进行定义,在编译时融合到一块儿。自动生成的部分在项目中是不可见的,但该部分包含Main()入口出以启动应用程序的代码。该部分看起来以下所示:xml

public class App:Application
    {
        [STAThread]
        public static void Main()
        {
            Program app = new Program();
            app.MainWindow = new MainWindow("MainWindow.xaml");
            app.MainWindow.ShowDialog();
        }
    }

  若是确实对查看XAMl模板建立的自定义应用程序类感兴趣,可查找位于项目目录中的obj\Debug文件夹中的App.g.cs文件。htm

  这里给出的自动生成的代码和手工编写的自定义应用程序类代码之间惟一的区别是,自动生成的类使用StartupUri属性,而不是设置MainWindow属性或把住窗体做为参数传递给Run()方法。只要使用相同的URI格式,就能够自由地使用这种方法建立自定义应用程序类。须要建立相对Uri对象,用于命名项目中的XAML文档(该XAML文档是编译过的,并做为BAML资源被嵌入到应用程序的程序集中。该资源的名称就是原来XAML文件的名称。在上面的示例中,应用程序包含名为MainWindow.xaml的资源,该资源包含以编译过的XAML文档)。对象

  自定义应用程序类的第二部分存储在项目中诸如App.xaml.cs的文件中。该部分包含开发人员添加的处理事件的代码,最初是空的:blog

public partial class App : Application
    {
    }

  这个文件经过部分类技术和自动生成的应用程序代码融合到一块儿。

3、应用程序的关闭方式

  一般,只要还有窗口还没有关闭,Application类就保持应用程序处于有效状态。若是这不是指望的行为,可调整Application.ShutdownMode属性。若是手动实例化Application对象,就须要在调用Run()方法以前设置ShutdownMode属性。若是使用App.xaml文件,那么可在XAML文件中简单设置ShutdownMode属性。

  对于关闭模式有三种选择,以下表所示:

表 ShutdownMode枚举值

   例如,若是但愿使用OnMainWindowClose方式,而且正在使用App.xaml文件,那么须要添加以下内容:

<Application x:Class="TestApplication.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml" ShutdownMode="OnMainWindowClose">
</Application>

  无论选择哪一种关闭方法,老是可使用Application.Shutdown()方法当即终止应用程序(固然,当调用Shutdown()方法时,应用程序未必马上中止运行。调用Application.Shutdown()方法会致使Application.Run()方法当即返回,但仍可继续运行Main()方法中的其余带代码或者响应Application.Exit事件)。

4、应用程序事件

  最初,App.xaml.cs文件不包含任何代码。尽管不须要代码,但可添加代码来处理应用程序事件。Application类提供了为数很少的很是有用的事件。下表给出了其中重要的几个。

表 应用程序事件

    处理事件时有两种选择:关联事件处理程序或重写相应的受保护方法。若是选择处理应用程序事件,不须要使用委托代码来关联事件处理程序,而是可使用App.xaml文件中的某个特性来关联事件处理程序。例如,若是有以下事件处理程序:

private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            MessageBox.Show("An unhandled " + e.Exception.GetType().ToString() +
                " exception was caught and ignored.");
            e.Handled = true;
        }

  可以使用下面的XAML来链接上面的事件处理程序:

<Application x:Class="TestApplication.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml" ShutdownMode="OnMainWindowClose" DispatcherUnhandledException="Application_DispatcherUnhandledException">
    <Application.Resources>
         
    </Application.Resources>
</Application>

  对于每一个应用程序事件,可调用相应的方法来引起该事件。这个方法的名称就是事件的名称,只要在前面加上前缀On,所以Startup变成了OnStartup(),Exit变成OnExit(),等等。这种方式在.NET中是十分常见的。惟一的例外是DispatcherExceptionUnhandled事件——该事件没有相应的OnDispatcherExceptionUnhandled()方法,因此始终须要使用事件处理程序。

  下面是一个自定义的应用程序类,它重写了OnSessionEnding()方法, 而且如未设置了相应的标志,该方法会阻止关闭系统和应用程序自身:

public partial class App : Application
    {

        private bool unsavedData = false;
        public bool UnSavedData
        {
            get { return unsavedData; }
            set { unsavedData = value; }
        }
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            unsavedData = true;
        }

        protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
        {
            base.OnSessionEnding(e);
            if (unsavedData)
            {
                e.Cancel = true;
                MessageBox.Show(
                    "The application attempted to be closed as a result of " +
                    e.ReasonSessionEnding.ToString() +
                    ".This is not allowed,as you have unsaved data.");
            }
        }
}

  当重写应用程序方法时,最好首先调用基类的实现。一般,基类的实现知识引起相应的应用程序事件。

  显然,实现这一技术的更精妙的方法是,不使用消息框,而应显示几个确认对话框,让用户选择是继续(退出应用程序和Window系统)仍是取消关闭。

相关文章
相关标签/搜索