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)

    强制回收,关闭系统。

  • 相关阅读:
    HDU4507 吉哥系列故事――恨7不成妻(数位dp)
    UCF Local Programming Contest 2017 G题(dp)
    ICPC Latin American Regional Contests 2019 I题
    UCF Local Programming Contest 2017 H题(区间dp)
    HDU2089 不要62
    AcWing1084 数字游戏II(数位dp)
    UCF Local Programming Contest 2017 F题(最短路)
    Google Code Jam 2019 Round 1A Pylons(爆搜+贪心)
    AcWing1083 Windy数(数位dp)
    Vue
  • 原文地址:https://www.cnblogs.com/fuchongjundream/p/4059217.html
Copyright © 2011-2022 走看看