【问题标题】:WPF Modal dialog goes in backgroundWPF 模态对话框进入后台
【发布时间】:2012-12-26 08:52:53
【问题描述】:

我遇到了一个应用程序的问题,其中模态 WPF 对话框偶尔会出现在主应用程序窗口的后面。当我单击对话框上的按钮时,会发生这种情况,该按钮在主应用程序窗口中进行一些处理和更新控件(通过绑定)。当它进入后台时 - 单击应用程序中的任意位置会将其返回到前台。

        var dialog = LoadDialogWindowThroughMEF();
        dialog.Owner = Application.Current != null ? Application.Current.MainWindow : null;
        dialog.ShowInTaskbar = false;
        dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;
        return dialog.ShowDialog();

上面的代码显示了我如何打开模态窗口。这种情况很少发生。

有人知道可能是什么问题吗?

【问题讨论】:

  • 看到这个link。也许如果你设置 dialog.Topmost=true,它可以解决问题。
  • 我上面粘贴的代码和上面的链接建议的一样。
  • Application.Current 是否有可能是null
  • LoadDialogWindowThroughMEF() 方法内部发生了什么?
  • 单击对话框窗口中的按钮时会发生什么?

标签: wpf c#-4.0


【解决方案1】:

我不确定我是否有答案,但我可以分享一些我的想法:

每次我遇到这类问题,都是因为Owner 设置不正确。所以,我会尝试设置Owner,看看这是否会使问题重现。您需要绝对确保Owner 始终设置为正确的父窗口1。您可能还想检查应用程序的实际MainWindow 是否应该是父应用程序。我认为大多数时候在代码中明确2 是有益的。在这种情况下,这意味着最好分配已知的父级(也许您在可以使用的某个地方对父级有引用),而不是依靠Application.Current 为您提供该引用。这样做将使您能够控制对Owner 的分配。它甚至可以摆脱 ?: 运算符,因为即使在单元测试期间您也可以控制引用。

我还希望您确保实际更新父窗口的代码不会以任何方式强制将焦点集中到父窗口上的特定控件或类似的东西上。 (只要正确的父级设置为Owner,我不认为这是一个可能的问题。)

我希望这对您有所帮助,但如果没有,我理解。当您单击父窗口时您的对话框重新出现的事实反驳了我的部分(或全部!)观点......


1 运行单元测试时除外,但那是完全不同的事情。

2wiktionary.org/wiki/explicit 中单词的第一个含义相同,与 implicit 相对。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2020-07-27
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多