9

如果用户关闭应用程序,则必须显示 Save-File-Message(以确保他想要丢弃已编辑文件的更改)。

为了实现这一点,我有一个带有命令绑定(没有键手势)的菜单项:

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 方法(在我的 SaveDialog 类中实现)我调用

bool? ret = ShowDialog();
if (!ret.HasValue)
     return null;
if (!ret.Value)
     return null;

问题是:

如果我使用 Alt+F4-Shortcut 关闭应用程序(主窗口的默认行为)它可以工作,如果有未保存的文件,我会得到 savedialog。但如果我通过执行 Command_Exit-Method 关闭应用程序,则 Method-Call

bool? ret = ShowDialog(); 

返回 null 并且对话框不出现。

如果我将 Alt+F4 KeyGesture 分配给 CommandBinding,则会切换问题:执行 Command_Exit 效果很好,但 Alt+F4 快捷方式不行。

ShowDialog()-Method 在这两种情况下都不起作用的原因是什么以及如何解决它?

4

2 回答 2

6

Application.Current.Shutdown路由允许您通过处理此处详细说明的 Exit 事件来侦听关闭请求:

http://msdn.microsoft.com/en-us/library/ms597013.aspx

它没有详细说明它是如何关闭窗口的,所以我不一定相信关闭事件处理程序会在它关闭应用程序之前触发。

关闭应用程序的另一种非常标准的方法是关闭主窗口(最开始显示的那个)。这可能是Window.Close方法,如果您已经在窗口的上下文中,只需调用Close(). 然后这将命中关闭事件处理程序。

于 2012-04-12T13:41:29.257 回答
3

你的Command_Exit实现是错误的。Application.Current.Shutdown()表示应用程序已经关闭,这可能会阻止对话框打开。

您应该以其他方式实现命令:在命令中,您应该询问您的业务逻辑是否可以安全关闭,并且Application.Current.Shutdown()仅在这种情况下发出。否则,您应该要求业务逻辑启动关闭序列,这将依次保存打开的文件,并Shutdown在完成保存操作时发出 a。

此外,当用户试图关闭主窗口(即在其上Window.Closing)时,您应该触发相同的例程。

于 2012-04-12T13:41:27.837 回答