关闭事件中的显示对话框
本文关键字:显示 对话框 事件 | 更新日期: 2023-09-27 18:30:57
如果用户关闭应用程序,则必须显示保存文件消息(以确保他想要放弃已编辑文件的更改)。
为了实现这一点,我有一个带有命令绑定的菜单项(没有键手势):
private void Command_Exit(object sender, ExecutedRoutedEventArgs e)
{
Application.Current.Shutdown();
}
主窗口有一个关闭事件。 在这种情况下,我检查是否有未保存的文件。 如果是,则必须打开"保存"对话框(以选择必须保存哪些文件):
private void Window_Closing(object sender, CancelEventArgs e)
{
if (sdl.Count() > 0)
{
SaveDialog sd = new SaveDialog();
IEnumerable<Doc> close = sd.ShowDialog(this);
if (close == null)
e.Cancel = true;
else
foreach (Doc document in close)
document.Save();
}
}
在这个 ShowDialog-Method 中(在我的 SaveDialog-Class 中实现)我调用
bool? ret = ShowDialog();
if (!ret.HasValue)
return null;
if (!ret.Value)
return null;
问题是:
如果我使用 Alt+F4 快捷方式关闭应用程序(主窗口的默认行为),它可以工作,如果有未保存的文件,我会得到保存对话框。 但是如果我通过执行Command_Exit方法关闭应用程序,则方法调用
bool? ret = ShowDialog();
返回 null,并且不显示对话框。
如果我将 Alt+F4 键手势分配给命令绑定,问题就会切换:执行Command_Exit效果很好,但 Alt+F4 快捷方式不能。
ShowDialog()-方法在这两种情况下都不起作用的原因是什么,以及如何修复它?
Application.Current.Shutdown
路由允许您通过处理 Exit 事件来侦听关闭请求,如下所述:
http://msdn.microsoft.com/en-us/library/ms597013.aspx
它没有详细说明它如何关闭窗口,所以我不一定相信关闭事件处理程序会在关闭应用程序之前触发。
关闭应用程序的另一种非常标准的方法是关闭主窗口(开头显示的窗口)。这可能是Window.Close
方法,如果您已经在窗口的上下文中,只需调用 Close()
即可。然后,这将命中关闭事件处理程序。
您的Command_Exit
实现是错误的。 Application.Current.Shutdown()
意味着应用程序已关闭,这可能会阻止对话框打开。
以其他方式实现该命令:在命令中,您应该询问您的业务逻辑是否可以安全关闭,并仅在该情况下发出Application.Current.Shutdown()
。否则,应要求业务逻辑启动关闭序列,这反过来将保存打开的文件,并在完成保存操作时发出Shutdown
。
此外,当用户尝试关闭主窗口(即在其Window.Closing
上)时,您应该触发相同的例程。