【问题标题】:How to tell whether closing via close button or via Application.Shutdown in WPF?如何判断是通过关闭按钮关闭还是通过 WPF 中的 Application.Shutdown 关闭?
【发布时间】:2012-07-30 18:57:24
【问题描述】:

我为标准“您确定要退出吗?”添加了一个代码。 this.Closing里面的消息 我的主窗口的事件。

它可以按预期从 gui 关闭,但是我想在通过 Application.Shutdown() 关闭应用程序时禁用此检查。

在窗口关闭之前触发的Application 中没有任何事件,并且无法覆盖 Shutdown 方法。

如何检测导致关闭窗口的原因?

【问题讨论】:

  • Shutdown 的调用是否在您的控制之下?如果是这种情况,您可以简单地在某处设置标志并在 Closing 处理程序中检查它。
  • 幸好不是。
  • 在这种情况下,您能否详细说明Shutdown 是如何被调用的以及由谁调用的?也许它会帮助我们找到解决方案。
  • 它被 System.Windows.Forms.Application.Restart() 调用;然后通过内部状态机。并且当未处理的异常冒泡到顶部而没有捕获时也会调用它。

标签: c# wpf


【解决方案1】:

免责声明:如果可以的话,我会将此作为评论而不是答案,因为它是一个肮脏的黑客(不是一个干净的黑客)。但是,如果您真的需要某些东西并且没有更好的解决方案出现,我还是会发布它以希望对您有所帮助...

如果您绝对无法控制/挂钩调用应用程序关闭的代码库部分,那么可能会找到其他响应关闭的东西,您可以在窗口关闭之前触发它。

我(不太理想)的想法是设置另一个隐藏窗口 (SO: Loading a WPF Window without showing it),用户不会与之交互,但应用程序将在关机时关闭。

在该窗口的关闭事件中,您可以设置一个标志来指示应用程序正在关闭。然后在主窗口的关闭事件中,您可以对该标志做出反应。

要解决的大问题是配置一些东西,以便隐藏窗口总是在主窗口之前安全关闭。

我使用 MainWindow.Xaml 作为应用程序 Startupuri 进行了一些有限的测试,并从 application.onstartup 事件创建隐藏窗口,发现隐藏窗口将首先关闭 - 但我不想在所有场景中保证这一点!实际上,让这个工作和充分测试可能需要做很多工作 - 正如我所说的,这是最后一次恢复肮脏的黑客攻击。

【讨论】:

    【解决方案2】:

    谁打电话给Application.Shutdown()?如果您负责,只需设置一个标志表明您已完成此操作,并在 Closing 事件处理程序中检查该标志。

    【讨论】:

    • 我不负责调用它。
    猜你喜欢
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多