Application类-应用程序生命周期

随声附和 提交于 2019-11-26 16:03:54

1、创建Application对象

  • 新建WPF程序后,排除掉WPF自动创建的App.xaml,我们自定义一个类,在该类的Main()方法中,创建Application对象,然后调用创建一个窗口对象,最后在Run()方法中,传递这个窗口对象。便完成了一个简单的应用程序的启动。
class AppStart
{
    [STAThread]
    public static void Main()
    {
        Application application = new Application();
        MainWindow mainWindow = new MainWindow();
        application.Run(mainWindow);
    }
}
  • 当Run()方法中传递一个窗口时,该窗口就被设置为主窗口。我们可以通过Application.MainWidow属性获取到主窗口。
  • 调用Run()方法后会触发Application.Startup事件并显示主窗口。
  • 当然还有另一种方式启动应用程序:
[STAThread]
public static void Main()
{
    Application application = new Application();
    MainWindow mainWindow = new MainWindow();
    application.MainWindow = mainWindow;
    application.Run();
}

2、自定义派生自Application的类

WPF自动会为我们创建一个App.xaml文件,<Applicatin>标签中的Class属性值会为我们创建一个派生自所在标签类型(Application)的类。并且这个类也应该是由两个不可见的partial类型组成。

从反编译结果可以看出自动生成的部分类中带有程序入口方法的Main()。所以该类的结构大致就是:

[STAThread()]
static void Main()
{
    App app = new App();
    app.InitializeComponent();
    app.Run();
}

public void InitializeComponent()
{
    this.StartupUri = new Uri("MainWindow.xaml",System.UriKind.Relative);
}

而第二部分存储在项目的App.xaml.cs类似的文件中。这一部分由我们自己来添加代码:

public partial class App : Application
{
     //添加你的实现
}

3、应用程序的关闭方式

通常只要还有一个窗口没有关闭,Application类就还处于有效状态。

  • 可以通过调整Application.ShutdownMode属性来设置应用程序关闭模式。
  • 如果Application是手动实例化的,则需要在Run()方法调用前设置ShutdownMode属性。

  • 无论使用那种关闭模式,只要调用Application.Shutdown()方法,Application.Run()方法会立即返回,进而终止应用程序。Run()方法返回后,仍然可以在Main()里面处理其它代码或者在Exit事件中处理未完的事情。

4、应用程序事件

虽然,新建的App.xaml.cs中没有任何代码,但是我们仍然可以在其中添加一些代码来响应应用程序事件。下面贴出来一串代码来帮助理解Application类里面的事件。

public App()
{
    this.ShutdownMode = ShutdownMode.OnLastWindowClose;
    this.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
    //this.Run();
    this.Startup += App_Startup;
    this.Exit += App_Exit;
    this.Activated += App_Activated;
    this.Deactivated += App_Deactivated;
    this.DispatcherUnhandledException += App_DispatcherUnhandledException;
}
/// <summary>
/// 捕捉到程序某处发生了为处理的异常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
}
/// <summary>
/// 当应用程序切换到其它Windows程序时发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void App_Deactivated(object sender, System.EventArgs e)
{
}
/// <summary>
/// 当程序从后台切换到前台时发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void App_Activated(object sender, System.EventArgs e)
{
}
/// <summary>
/// 发生在应用程序关闭时,并在Run()方法返回前发生。这是不能取消的关闭。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void App_Exit(object sender, ExitEventArgs e)
{
}

/// <summary>
/// Application.Run()之后,主窗口显示前发生。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void App_Startup(object sender, StartupEventArgs e)
{
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!