2

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

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

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

有谁知道可能是什么问题?

4

1 回答 1

2

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

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

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

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


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

2根据wiktionary.org/wiki/explicit,与该词的第一个含义相同,并且与implicit相对。

于 2012-12-29T14:40:31.577 回答