【问题标题】:What causes WPF App to close是什么导致 WPF 应用程序关闭
【发布时间】:2017-12-04 18:42:33
【问题描述】:

我遇到了一个奇怪的错误,即 WPF 应用程序在第一个窗口关闭后关闭。这让我很好奇是什么触发它关闭

例如,这是我不工作的版本。在 EULAWindow 关闭后,它会关闭应用程序。

EULAWindow eula = new EULAWindow();
eula.ShowDialog();
MainMenuWindow mainWindow = new MainMenuWindow();
mainWindow.ShowDialog();

我认为它会打开 EULA,然后打开菜单窗口。我发现如果我重新排列代码,它会像预期的那样运行。

例如,这将解决它:

EULAWindow eula = new EULAWindow();
MainMenuWindow mainWindow = new MainMenuWindow();
eula.ShowDialog();
mainWindow.ShowDialog();

这让我想到了在第一种情况下导致应用程序关闭的真正原因是什么?

【问题讨论】:

  • 可能是未处理的异常。您是否收到任何类型的错误消息?
  • 我捕捉到未处理的异常,没有任何错误,并像常规应用关闭一样触发 ProcessExit 事件。
  • 是否有什么阻止您使用第二个代码示例?
  • 查看App.ShutdownMode 并尝试App.OnStartup 中的其他值。
  • @RobertHarvey 没有什么能阻止我使用它,只是想知道这里发生了什么。

标签: c# wpf


【解决方案1】:

ShowDialog() 是一个阻塞调用。所以,在第一种情况下,你有一个窗口,然后显示它,然后让用户关闭它。关闭最后一个 UI 窗口后,应用程序应该做什么?也许,跟随应用程序关闭代码?我怀疑是这样。

在第二种情况下,您在 ShowDialog() 中的阻塞之前创建两个窗口。因此,一旦您关闭了第一个窗口,就会有另一个可以容纳用户的窗口,并且应用程序不会关闭,它只是等待显示下一个窗口。

【讨论】:

  • 我想我明白你在说什么,但你的第二段可能会更清楚。
  • 啊,这样更好。
  • 这是否意味着 App 类正在以某种方式在其中注册所有 Window 类?在第一种情况下,它在 MainMenuWindow 甚至显示之前调用第二个 ShowDialog 之后关闭应用程序,这应该是一个阻塞调用正确吗?
  • @DamonEarl,一旦你在 ShowDialog 中被阻止,这意味着它处于异步模式。因此,主执行行正在等待 ShowDialog 发出信号完成,同时有一个消息循环泵送您的键盘和鼠标输入。一旦您单击“关闭”,您将首先执行“关闭处理程序”逻辑,然后返回等待的主执行行。如果只有一个窗口,应用程序会在返回主执行行之前关闭。
【解决方案2】:

由于我使用应用程序启动来创建我的窗口,它默认将 EULAWindow 设置为 Current.MainWindow 然后保持 Current.ShutDownMode 作为 ShutdownMode.OnMainWindowClose

当您创建两个窗口时,在调用 Show 或 ShowDialog 之前,它会自动将关闭模式更改为 ShutdownMode.OnLastWindowClose

我不确定这是如何或在何处发生的,但我可以确定这是在进一步调查后发生的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多