C# 调用Application.Shutdown()后,使用ShowDialog显示窗口不会';行不通

C# 调用Application.Shutdown()后,使用ShowDialog显示窗口不会';行不通,c#,wpf,showdialog,application-shutdown,C#,Wpf,Showdialog,Application Shutdown,当我的程序被关闭(由Application.Shutdown()启动)时,我将在主窗口上捕获关闭事件。在处理程序中,我创建了一个对话框,询问用户是否要保存他们的工作。在这种特定情况下,用户不能取消应用程序关闭事件,这对我来说没问题 我发现,如果我通过ShowDialog启动“想要保存”窗口,该窗口将永远不会显示。但是,MessageBox.Show确实显示了一个窗口。这是应用程序关闭期间的预期行为吗?我在文档中找不到有关此行为的任何信息。如果有人能给我指出相关文档或这个问题的详细答案,那就太好了

当我的程序被关闭(由Application.Shutdown()启动)时,我将在主窗口上捕获关闭事件。在处理程序中,我创建了一个对话框,询问用户是否要保存他们的工作。在这种特定情况下,用户不能取消应用程序关闭事件,这对我来说没问题


我发现,如果我通过ShowDialog启动“想要保存”窗口,该窗口将永远不会显示。但是,MessageBox.Show确实显示了一个窗口。这是应用程序关闭期间的预期行为吗?我在文档中找不到有关此行为的任何信息。如果有人能给我指出相关文档或这个问题的详细答案,那就太好了。

Application.Shutdown最终会停止应用程序的消息循环(Dispatcher)。此后将不会出现任何UI。MessageBox.Show工作的唯一原因是它在应用程序的活动窗口上创建了自己的内部消息循环。

application.Shutdown最终会停止应用程序的消息循环(Dispatcher)。此后将不会出现任何UI。MessageBox.Show工作的唯一原因是它在应用程序的活动窗口上创建了自己的内部消息循环。

如果使用
application.Current.MainWindow.Close()允许您使用
e.Cancel=true,如果使用
Application.Current.Shutdown()它将忽略取消标志并关闭窗口

这是假设您只使用一个窗口,当然不需要再次显示提示

比如:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    e.Cancel = true;

    DisplayCloseConfirmation();
}

如果使用
Application.Current.MainWindow.Close(),则根据注释编辑允许您使用
e.Cancel=true,如果使用
Application.Current.Shutdown()它将忽略取消标志并关闭窗口

这是假设您只使用一个窗口,当然不需要再次显示提示

比如:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    e.Cancel = true;

    DisplayCloseConfirmation();
}

根据评论进行编辑

那么这就有点道理了。文档中有关于这方面的内容吗?@skybluecodeflier当然有.NET源代码。下面是Application.Shutdown在几个方法调用后最终到达Dispatcher.CriticalInvokeShutdown的行。那就有点道理了。文档中有关于这方面的内容吗?@skybluecodeflier当然有.NET源代码。下面是Application.Shutdown在几个方法调用后最终到达Dispatcher.CriticalInvokeShutdown的行。实际上,这是不可能的,因为在应用程序关闭期间窗口关闭事件中的设置e.Cancel=true被忽略。看啊,对。我的错,我使用的是
Application.Current.mainfown.Close()
最初允许我的应用程序在提示下关闭。谢谢你指出这一点!:)实际上,这是不可能的,因为在应用程序关闭期间窗口关闭事件中的设置e.Cancel=true被忽略。看啊,对。我的错,我使用的是
Application.Current.mainfown.Close()
最初允许我的应用程序在提示下关闭。谢谢你指出这一点!:)