// Any control that causes the Window.Closing even to trigger.
private void MenuItemExit_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
// Method to handle the Window.Closing event.
private void Window_Closing(object sender, CancelEventArgs e)
{
var response = MessageBox.Show("Do you really want to exit?", "Exiting...",
MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
if (response == MessageBoxResult.No)
{
e.Cancel = true;
}
else
{
Application.Current.Shutdown();
}
}
public class CloseAppResult : CancelResult
{
public override void Execute(CoroutineExecutionContext context)
{
Application.Current.Shutdown();
base.Execute(context);
}
}
public class CancelResult : Result
{
public override void Execute(CoroutineExecutionContext context)
{
OnCompleted(this, new ResultCompletionEventArgs { WasCancelled = true });
}
}
15 回答
非常简单 . 使用以下代码:
不应该有
Application.ShutDown();
或.Exit()
消息 .Application
是一个静态类 . 它不涉及当前的应用程序 . 您需要转到当前应用程序,然后将其关闭,如下所示:这应该是诀窍:
如果您有兴趣,这里有一些我觉得有用的其他材料:
Details on Application.Current
WPF Application LifeCycle
这就是我的做法:
我只从主应用程序窗口调用
Application.Current.ShutDown()
,所有其他窗口都使用this.Close()
. 在我的主窗口中,Window_Closing(...)
处理右上方的x
按钮 . 如果任何方法要求窗口关闭,Window_Closing(...)
抓取事件以在用户确认时关闭 .我在我的主窗口中实际使用
Application.Current.Shutdown()
的原因是我在应用程序中声明了我的一个窗口的父窗口,如果在最后一个活动窗口关闭之前打开该窗口而没有显示,我就离开了在后台运行的隐藏窗口 . 该应用程序不会关闭 . 防止完全内存泄漏的唯一方法是让我进入任务管理器关闭应用程序 .Application.Current.Shutdown()
保护我免受意外的设计缺陷 .这是我个人的经验 . 最后,使用最适合您场景的方法 . 这只是另一条信息 .
尝试
为了我
没用 .
Caliburn微味
由于wuminqi said,
Application.Current.Shutdown();
是不可逆转的,我相信它通常用于强制应用程序关闭,例如用户注销或关闭Windows时 .而是在主窗口中调用
this.close()
. 这与按下窗口上的Alt F4或关闭[x]按钮相同 . 这将导致所有其他拥有的窗口关闭,并且只要关闭操作未被取消,最终将调用Application.Current.Shutdown();
. 请参阅Closing a Window上的MSDN文档 .此外,因为
this.close()
是可取消的,所以您可以在结束事件处理程序中放入保存更改确认对话框 . 只需为<Window Closing="...">
创建一个事件处理程序并相应地更改e.Cancel
. (有关如何执行此操作的详细信息,请参阅MSDN documentation . )如果你真的需要它关闭,你也可以使用Environment.Exit(),但它根本不优雅(更像是结束过程) .
使用方法如下:
根据需要使用以下任何一项:
1.
2.
上面所有的方法都会调用 Window 的 Window 类,并且执行可能会在某个时刻停止(因为通常应用程序会在窗口完全关闭之前放置像 'are you sure?' 或' Would you like to save data before closing? '这样的对话框)
3. 但是如果你想立即终止应用程序 without any warning . 使用以下
根据我的理解,
Application.Current.Shutdown()
也有其缺点 .如果您想显示确认窗口以让用户确认是否退出,
Application.Current.Shutdown()
是不可逆转的 .从xaml代码中,您可以调用预定义的SystemCommand:
我认为这应该是首选方式......
要退出您的应用程序,您可以致电
如Application.Shutdown方法的文档中所述,您还可以通过指定ShutdownMode来修改应用程序的关闭行为:
另请注意,
Application.Current.Shutdown();
只能从创建Application
对象的线程调用,即通常是主线程 .另一种方法可以做到这一点:
这将强制终止您的应用程序正在多线程应用程序中工作 .
注意:只关心将数据保存在另一个线程的文件中的应用程序 .
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;