关于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)
强制回收,关闭系统。
关于WPF的退出的更多相关文章
- WPF中退出时显示是否保存数据提示
一.通过窗体中的按钮实现退出时数据保存提示 Xaml: <Grid> <TextBlock HorizontalAlignment="Left" Margin=& ...
- 【WPF】退出应用时的提示弹窗
需求:按MainWindow右上角的[X]想要退出软件时,弹窗提示是否确定要退出. 主界面(ShellWindow)的前台给主界面窗体添加两个事件:Closing和Closed <Window ...
- WPF的退出
很多时候,会自己写退出程序的代码. 比如,先显示登录框(LogIn),成功后隐藏它,并显示一个主窗体(MainWin),或者外部还调用了其他App,当你关闭MainWin不一定会直接退出整个程序的. ...
- 2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- WPF直接用Window.Close直接关闭窗口导致不能完全退出的问题
前几天我在CSDN扔了一个问题,基本描述一下:写了一段这样的代码,来实现获取Control的template,却发现一个这样的问题,就是当我打开了一个window以后,手动调用Close(),窗口的确 ...
- C# Note11:如何优雅地退出WPF应用程序
前言 I should know how I am supposed to exit my application when the user clicks on the Exit menu item ...
- WPF 基础 - 启动与退出及异常捕获
1. 若需要控制 exe 实例数量 bool ret; mutex = new System.Threading.Mutex(true, exename, out ret); if (!ret) { ...
- WPF PasswordBox鼠标进入时程序异常退出的解决办法
最近在开发了一个程序中用到了PasswordBox控件,但是在程序给别人用的时候,鼠标一进入控件时程序就异常退出,查了下windows日志,错误显示如下: 应用程序: WpfPasswordTest2 ...
- WPF 屏蔽Alt+F4强制退出
if (e.KeyStates == Keyboard.GetKeyStates(Key.F4) && Keyboard.Modifiers == ModifierKeys.Alt) ...
随机推荐
- ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)
在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12) ",体验了7-12关键环节,本篇继续. ⒀当请求到达UrlRoutingModule的时候,Url ...
- 数据库优化实践【TSQL篇】
在前面我们介绍了如何正确使用索引,调整索引是见效最快的性能调优方法,但一般而言,调整索引只会提高查询性能.除此之外,我们还可以调整数据访问代码和TSQL,本文就介绍如何以最优的方法重构数据访问代码和T ...
- Nim教程【四】
这是国内第一个关于Nim的系列教程 先说废话 不得不说Rust也是门不错的语言,园子里 有人曾经说: Rust语言除了library或keyword缩写比较恶心以外其他所有地方完爆go 还有人曾这样评 ...
- 汇编语言hello world
DOS下: ;栈段 stack segment stack db dup(?) stack ends ;数据段 data segment szHello db 'Hello,world',0dh,0a ...
- servlet servlet基本概念和helloservlet实例
java web目录结构: web.xml是重要配置文件,容器正是通过这个文件找到service方法. 用纯文本+tomcat组装简单servlet web 新建HelloServlet.java: ...
- Help Viewer 2.2 独立运行
"C:\Program Files (x86)\Microsoft Help Viewer\v2.2\HlpViewer.exe" /catalogName VisualStudi ...
- sqlserver内存释放心得
SQL Server 2008 或者R2的默认内存分配是2147483647MB, 差不多算是无穷大,对于系统内存的管理策略是有多少占多少.SQLserver会把所有处理过的SQL操作缓存在内存里,这 ...
- tomcat文件服务配置
<Host name="localhost" appBase="" unpackWARs="true" auto ...
- Speech两种使用方法
COM组件使用speech: public class Speach { private static Speach _Instance = null ; private SpeechLib.SpVo ...
- Android webView打不开网页的解决办法
在我们开发过程中,有可能会遇到webview有些网页打不开的问题.这可能是设置的不对,下面就是解决办法. 进行如下设置吧,大多数情况都能解决! displayWebview.getSettings() ...