zoukankan      html  css  js  c++  java
  • 关于WPF的退出

    如果你在创建项目的时候细心的查看一下项目的结构,你会发现里面有一个App.xaml,一见到App我们知道是应用程序的关键了配置了,当然,WPF的启动窗体也在这里面设置的。

    我们可以在App的中配置启动页,如下所示:

    image

    当然,我们还可以再App.cs重写OnStartUp来设置要启动的页面来设置启动的页面,如:

    public partial class App : Application

    {

    protected override void OnStartup(StartupEventArgs e)

    {

    new Login().Show();

    base.OnStartup(e);

    }

    }

    程序的退出看着挺简单的,调用App.Current.Shutdown();则程序就退出了,这仅适用于简单的情况,接下来用实际的测试来说话:

    最简的请框如上一篇的登录窗口,我们给Cancel按钮添加一个事件(以后会详细介绍,现在就双击OK了),然后再里面实现。WPF的退出方法如下所示的:

    this.Close();// 关闭当前窗口,可以在OnClosing和 OnClosed中捕获消息,在OnClosing的时候,可以取消关闭窗口。

    Environment.Exit(0);// 强制退出,即使有其他的线程没有结束

    Application.Current.Shutdown();// 关闭当前程序,如果有其他线程没有结束,不会关闭

    App.Current.Shutdown();// 同Application,没有和App区分出来。

    接下来贴出代码:

    测试代码如下:

    public Login()

    {

    InitializeComponent();

    //new MainWindow().Show();

    this.Closing += (s, r) =>

    {

    // 我不是想真的退出,我想保持最小托盘

    Debug.WriteLine("I'am running,and change status");

    r.Cancel = true;

    Debug.WriteLine("I'am backing");

    };

    this.Closed += (s, r) =>

    {

    // 退出了啊

    Debug.WriteLine("I'am Closed");

    };

    //new Thread(() => { while (true) { Thread.Sleep(100); Debug.WriteLine("I'am Running"); } }).Start();

    }

    当我们没有启动新线程的时候,打印的消息如下:

    开始的时候,仅仅在Login中调用不同的方法,打印的消息如下所示:

    //输出:

    //I'am running,and change status

    //I'am backing

    // 程序没有退出

    //this.Close();

    //输出:

    //没有输出任何消息,没有调用Closed和Closing

    // 程序强制退出

    //Environment.Exit(0);

    //输出:

    //I'am running,and change status 执行了方法,但是程序还是强制退出了

    //I'am backing

    //I'am Closed

    // 程序强制退出

    //Application.Current.Shutdown();

    //输出:

    //I'am running,and change status 执行了方法,但是程序还是强制退出了

    //I'am backing

    //I'am Closed

    //force closed

    // 程序强制退出

    //App.Current.Shutdown();

    当我们启用新线程的时候,则除Environment.Exit(0),打印几个I'am Running之后,程序就完全退出了,但是其他的都没有提出系统。

    那么Close在什么时候会退出程序呢?

    如过调用了Close,而在Closing中没有显示的取消退出,则系统可以退出,这种情况仅仅是在没有多余线程,没有其他窗口启动的时候,如果有其他窗口同时启动,则要考虑App.Current.ShutdownMode。

    如果在App里面显示的或者退出系统之前显示的设置了App.Current.ShutdownMode,此时系统也不会有退出不完全的情况,当系统App.Current.ShutdownMode=OnMainWindowClose的时候,此时如果,调用主窗口的Close,则系统会退出(没有残余线程的情况),即使在主窗口中又弹出了其他的窗口。如果设置了App.Current.ShutdownMode=OnLastWindowClose,则此时系统不会关闭,什么时候关闭呢?所有的弹出窗口都关闭的情况下会退出系统(没有残余线程的情况)。

    当设置App.Current.ShutdownMode=OnExplicitShutdown的时候,此时较复杂,此时无论什么样的顺序调用Close都不会关闭窗口,必须显示的调用Application.Current.ShutDown()方法,系统才会退出。

    总结一下退出就是:Close->Application.Current.ShutDow()->Enviroment.Exit(0)

    弱-------------------------------------------------> 强

    Close->退出系统时候要看App的ShutDownModel设置

    如果系统有为释放的线程,或者先释放掉,或者调用Enviroment.Exit(0)

    强制回收,关闭系统。

  • 相关阅读:
    css 写一个三角形
    vue 知识汇总,中级阶段的。
    获取url参数封装的
    vue 知识点
    不换行css
    微信小程序的横向滚动
    git提交本地分支到远程分支
    linux shell head tail 用法简介
    PHP服务重启
    MongoDB用户创建
  • 原文地址:https://www.cnblogs.com/fuchongjundream/p/4059217.html
Copyright © 2011-2022 走看看