关于WPF的退出

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

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

当然,我们还可以再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)

强制回收,关闭系统。

时间: 2024-10-08 20:54:50

关于WPF的退出的相关文章

WPF的退出

很多时候,会自己写退出程序的代码. 比如,先显示登录框(LogIn),成功后隐藏它,并显示一个主窗体(MainWin),或者外部还调用了其他App,当你关闭MainWin不一定会直接退出整个程序的. 我们可以直接终止相关进程: System.Environment.Exit(0); 当然,你可能还想在退出前做一些什么,比如保存一下缓存数据,清空临时文件,等等操作,就需要这样, 在项目的 App 条目下增加关闭逻辑:(App.xaml.cs) /// <summary> /// App.xaml

WPF直接用Window.Close直接关闭窗口导致不能完全退出的问题

前几天我在CSDN扔了一个问题,基本描述一下:写了一段这样的代码,来实现获取Control的template,却发现一个这样的问题,就是当我打开了一个window以后,手动调用Close(),窗口的确是消失了,但是当我关闭了主窗口以后,却发现程序没有退出. 1 private void ControlTypeSelectingBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 2 { 3 try 4 { 5 Type

WPF PasswordBox鼠标进入时程序异常退出的解决办法

最近在开发了一个程序中用到了PasswordBox控件,但是在程序给别人用的时候,鼠标一进入控件时程序就异常退出,查了下windows日志,错误显示如下: 应用程序: WpfPasswordTest2.exe Framework 版本: v4.0.30319 说明: 应用程序通过 System.Environment.FailFast(string message) 请求终止进程. 消息: 不可恢复的系统错误. 堆栈: 在 System.Environment.FailFast(System.S

WPF 屏蔽Alt+F4强制退出

if (e.KeyStates == Keyboard.GetKeyStates(Key.F4) && Keyboard.Modifiers == ModifierKeys.Alt) { e.Handled = true; }

【转载wpf命令】

出处:http://blog.csdn.net/fwj380891124 WPF学习之深入浅出话命令 分类:             WPF              2012-11-05 18:08     4934人阅读     评论(2)     收藏     举报 WPF为我们准备了完善的命令系统,你可能会问:“有了路由事件为什么还需要命令系统呢?”.事件的作用是发布.传播一些消息,消息传达到了接收者,事件的指令也就算完成了,至于如何响应事件送来的消息事件并不做任何限制,每个接收者可已用

一个WPF小项目小结

一:缘起 在10月中旬的时候在学校BBS上看到有人有做PC桌面客户端的需求,做的是能耗的计算和评估,要算能耗,就有很多环节,最后对这些环节数据进行一些简单计算.我想要是做的话就用比较熟的wpf,就去聊了下,对方给了1张比较复杂的Excel表格(其实对方的需求并不是很清楚,最后大概10来张EXcel表格),说是要做成软件呈现的形式,也没要求数据库,反正只要有功能,界面他们也没概念,给了个98年的老软件作为参考,最后EXcel表格弄懂结构后不复杂,计算都是加减乘除.我就答应了,这个软件算起来大概花了

【.net 深呼吸】WPF 中的父子窗口

与 WinForm 不同,WPF 并没有 MDI 窗口,但 WPF 的窗口之间是可以存在“父子”关系的. 我们会发现,Window 类公开了一个属性叫 Owner,这个属性是可读可写的,从名字上我们也能猜到,应该是用来设置窗口的父子关系的.这个属性看起来不难用,只要赋个窗口实例即可,而真正的难点是你得搞清楚“谁是谁的父窗口”,“谁是谁的子窗口”,一旦你搞混了,有可能会应用程序带来一些小麻烦. 这个问题是一位妹子问我的,不然怎么说女孩子特别细心呢,这个小玩意儿估计很多时候我们都不会注意到. 下面,

WPF 程序中启动和关闭外部.exe程序

当需要在WPF程序启动时,启动另一外部程序(.exe程序)时,可以按照下面的例子来: C#后台代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; u

WPF学习之事件(一)

就像属性系统在WPF中得到升级.进化为依赖属性一样,事件系统在WPF中也被升级,从而进化成为——路由事件(Routed Event),并在其基础上衍生出命令传递机制.就让我们一起来领略这些新消息机制的风采吧! 1.近观WPF的树形结构. 路由(Route)一词的大意为:起点和终点之间有若干个中转站,从起点出发后经过每个中转站时都要进行选择,最终以正确(比如最短或者最快)的路径到达终点.我们知道,WPF的UI是由布局组件和控件构成的属树形结构.因此,当这棵树上的某个节点激发出某个事件的时候,程序员