zoukankan      html  css  js  c++  java
  • 应用程序管理(Application)

         Application类是构建WPF应用程序过程中最常见和最重要的对象之一,其核心功能是封装整个WPF应用程序。换句话说,每个WPF应用程序都是一个Application对象,其支持各种核心应用程序服务。

         对操作系统而言,Application对象表示应用程序,并且允许系统与应用程序通信。Application 对象支持属性、方法和事件,这些属性、方法和事件使您可以将一个可扩展应用程序标记语言 (XAML) 页的集合转换为一个连贯的应用程序。
    1. Application对象的功能 
        System.Windows.Application是构建WPF应用程序过程中最为重要和常用的类,其继承自DispatcherObject类。Application类的实例是Application对象。每个WPF应用程序都是通过Application对象来展现自己。Application对象功能众多,主要包括以下功能: 
        创建和管理常见应用程序架构;
        跟踪应用程序生命周期,并与实现与之交互;
        获取和处理命令行参数;
        共享应用程序范围的属性和资源;
        检测和响应未处理异常;
        返回退出代码(exit code);
        管理独立应用程序(standalone application)中的窗口;
        跟踪和管理导航;
        由以上介绍的功能可知,Application类功能非常强大。
    2. 创建和访问Application对象 
        通常创建Application对象的方法有三种:(1)使用XAML中的<Application>元素定义;(2)使用C#等代码定义;(3)使用<Application>元素和C#代码共同定义Application对象。
    (1)使用<Application>元素定义 
        这种方法的核心是使用XAML中的<Application>元素,如下代码所示:

    <Application 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" />


        以上代码仅设置了Application元素的命名空间属性(xmlns和xmlns:x)。由于没有设置启动时所要显示的内容,因此在启动应用程序后将看不到任何信息。这样实现的意义显然不是很大。应用程序启动的内容可通过在<Application>元素中设置StartupUri属性来实现。例如,设置StartupUri ="MyWpf.xaml"。接下来,开发人员可创建一个名为MyWpf.xaml的文件,并在其中定义根元素,子元素以及业务逻辑等。需要注意的是,在其中定义的根元素应该是上一篇系列文章中介绍的根元素,例如Window、Page等元素。

     (2)使用C#等代码定义 
        这种方法的核心是使用C#代码,在类中应用Application类的构造函数,如“Application app = new Application();”。请看如下代码,当运行代码时,将显示一个空白窗口。

    using System; 
    using System.Windows;

    namespace WpfAppObj
    {
    class AppObj
    {
    [STAThread]
    static void Main(string[] args)
    {
    //创建Application对象
    Application app = new Application();
    //创建Window对象,并设置属性
    Window win = new Window();
    win.Title = "创建Application对象";
    //调用Application对象的Run方法,显示主窗口
    app.Run(win);
    }
    }
    }

        以上代码列举了一个标准的主入口Main静态方法。读者需要重点关注Main方法中的代码逻辑。在代码中,首先使用Application类构造函数,创建一个Application对象。然后,创建Window对象,并设置其Title属性。最后,调用刚刚创建的Application对象的Run方法。Run方法的功能是启动WPF应用程序。
    (3)使用<Application>元素和C#代码共同定义 
       这种方法比较常用,其灵活性比较强。首先,使用<Application>元素定义Application对象并设置相关属性,尤其是设置x:Application属性,以便将该XAML与接下来要实现的C#代码关联起来。最后,使用C#代码编写类文件。 
        XAML文件代码如下所示:

    <Application 
    x:Class="AppObj"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" />

    C#代码如下:

    using System; 
    using System.Windows;
    public partial class AppObj : Application
    {
    public AppObj()
    {
    InitializeComponent();
    }
    }

        以上代码实现了一个局部类AppObj,该类继承自基类Application。同时,代码中还实现了AppObj的构造函数。开发人员可在InitializeComponent方法中设置一些初始化内容,例如设置属性等。InitializeComponent 方法来注册事件并设置在标记中实现的属性。 
       需要读者注意的是,在使用方法(1)和方法(3)时,并不需要如方法(2)那样编写Main方法,编译器可自动完成该工作。 
       当开发人员使用以上方法,通过Application对象创建应用程序之后,很自然的需要访问当前的应用程序。这是通过Application类的Current属性来实现。 
       举例而言,当开发人员使用上一节中的方法(2)创建一个包含窗口的应用程序之后,为了实现访问当前应用程序窗口的Title属性,可使用如下代码:

    Window main = Application.Current.MainWindow; 
    MessageBox.Show("窗口的Title属性值是" + main.Title);

       Current是一个静态属性,其用于获取当前应用程序域(System.AppDomain)的Application对象。Application对象的MainWindow属性可获取应用程序的主窗口。 
        当然,在有效获取表示当前应用程序的Application对象之后,不仅可以访问应用程序的各种属性,而且还可以访问其他任何方法等成员,甚至是为主窗口添加的事件等。

    3. 应用程序的事件

       WPF应用程序的生命周期中包括多个事件,这些事件与Application对象之间关系非常紧密。这些事件包括Startup、Exit、SessionEnding、Activated、Deactivated、DispatcherUnhandledException等。如图1所示,显示了独立应用程序中的事件发生过程。

    图1所示的过程简单而清晰,但是需要注意的是,图中箭头所指的方向以及连接情况。很可能部分读者会认为在Startup事件之后,触发Activated事件;在触发Deactivated事件之后,触发DispatcherUnhandledException事件,这些类似的想法都是不正确的,都是由于没有认真查看图中箭头而产生的。 
       下面简单说明一下图1所包含的6个事件,它们是WPF应用程序生命周期中的主要事件。
    Startup事件 
        在调用Application.Run()方法之后,主窗口显示之前,触发该事件。在该事件的处理程序中,开发人员可检测多个命令行参数。这些参数以数组形式存在,通过StartupEventArgs.Args属性即可访问参数数组。另外,可在Startup事件处理程序中添加显示用户界面,显示窗口等代码逻辑。例如,以下代码实现处理命令参数的功能:

    void App_Startup(object sender, StartupEventArgs e) 
    {
    for (int i = 0; i != e.Args.Length; ++i)
    {
    // 处理命令参数逻辑
    ...
    }
    }

      命令参数保存在e.Args数组中,当访问第一个命令参数时,使用的是e.Args[0]。
    Activated事件和Deactivated事件 
       当应用程序的窗口之一被激活时,触发该事件。激活是指加载应用程序并显示出窗口,或者从其他应用程序切换到当前应用程序。当应用程序被释放(deactivated)时,触发该事件。释放是指关闭应用程序的情况,或者从当前应用程序切换到其他应用程序。请看以下示例代码:

    public partial class App : Application 
    {
    bool isApplicationActive;

    void App_Activated(object sender, EventArgs e)
    {
    // 设置变量值
    this.isApplicationActive = true;
    }

    void App_Deactivated(object sender, EventArgs e)
    {
    // 设置变量值
    this.isApplicationActive = false;
    }
    }

       当触发Activated事件时,布尔类型变量isApplicationActive的值为true;当触发Deactivated事件时,该变量值被设置为false。
    SessionEnding事件 
        当用户试图注销或者关闭电脑时,触发该事件(为了辨别是何种情况,可使用   SessionEndingCancelEventArgs.ReasonSessionEnding属性)。在该事件处理程序中,可实现如询问和显示有关信息,结束Windows会话等功能。请看以下示例代码:

    void App_SessionEnding(object sender, SessionEndingCancelEventArgs e) 
    {
    // 询问用户是否允许关闭会话
    string msg = string.Format("{0}. End session?", e.ReasonSessionEnding);
    MessageBoxResult result = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo);

    // 根据选择确定是否终止会话
    if (result == MessageBoxResult.No)
    {
    e.Cancel = true;
    }
    }

       SessionEndingCancelEventArgs事件参数的ReasonSessionEnding属性值是ReasonSessionEnding枚举值。如果Cancel属性为true,那么不要终止会话。

    msdn:http://msdn.microsoft.com/zh-cn/library/ms743714.aspx

  • 相关阅读:
    02 Hibernate错题分析
    08章 分组查询、子查询、原生SQL
    NHibernate的基本使用
    NHibernate与IbatisNet的简单比较
    NHibernate从入门到精通系列(3)——第一个NHibernate应用程序
    NHibernate从入门到精通系列(2)——NHibernate环境与结构体系
    NHibernate从入门到精通系列(1)——NHibernate概括
    SQL字符串操作汇总
    SVN (TortioseSVN) 版本控制之忽略路径(如bin、obj、gen)
    SVN服务器搭建和使用(三)
  • 原文地址:https://www.cnblogs.com/jyz/p/1293319.html
Copyright © 2011-2022 走看看