关于WPF的退出

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

咱们能够在App的中配置启动页,以下所示: 测试

image

固然,咱们还能够再App.cs重写OnStartUp来设置要启动的页面来设置启动的页面,如: this

public partial class App : Application 线程

{ blog

protected override void OnStartup(StartupEventArgs e) 事件

{ ci

new Login().Show(); get

base.OnStartup(e); it

} io

}

程序的退出看着挺简单的,调用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)

强制回收,关闭系统。

相关文章
相关标签/搜索