WPF应用程序上的模态对话框焦点问题

时间:2010-06-17 13:39:37

标签: c# wpf user-controls modal-dialog

我的wpf应用程序出了问题,主应用程序后面会出现一个模态对话框,导致它挂起。

这是非常不一致的,大多数情况下弹出窗口正常工作并显示在前面但偶尔会弹出后面,这会阻止任何与它的交互。如果发生这种情况,我仍然可以使用任务栏关闭对话框。我注意到它通常发生在许多其他应用程序打开且任务栏已满时。此外,我正在使用两个屏幕,问题只发生在任务栏的屏幕上 - 非常奇怪!

该对话框是一个窗口控件,它包含一个注入的usercontrol作为它的数据上下文。要在调用ShowDialog()之前设置窗口的所有者,请使用应用程序中的第一个活动窗口而不是Window.GetWindow(this):


private static Window GetOwner()
{
    if (Application.Current != null)
    {
      var owner = Application.Current.Windows.Cast().FirstOrDefault(w => w.IsActive);
      return owner ?? Application.Current.MainWindow;
    }
    return null;
}

可能导致此问题的任何想法?甚至如何尝试跟踪它,以便在发生时收集更多信息?

谢谢, 敦尔

2 个答案:

答案 0 :(得分:0)

我在Windows窗体应用程序上没有焦点问题,有时会转换为闪烁效果。原因之一是其中一个人修改了隐藏模态窗口的代码,直到它显示出来以避免丑陋的黑暗补丁!因为他在最顶级的模态窗口上调用了.Hide(),所以焦点转移到了另一个应用程序,当窗口完全加载时调用.Show()时,焦点会出现焦距和闪烁。

我花了一段时间来解决这个问题,并改变了改变不透明度的逻辑。我让窗户透明,直到满载。看看这对你有什么帮助!

答案 1 :(得分:0)

我的WPF应用程序出现了类似的情况,因为模态打开Window的Owner属性设置不正确。在大多数情况下,它仍然有点类似,但很多时候模态窗口会被卡在后面,就像你描述的那样,特别是在多个应用程序窗口之间切换时。

我将自己的ShowDialog()方法添加到模态窗口,如下所示:

    public bool? ShowDialog(Window owner)
    {
        Owner = owner;
        return ShowDialog();
    }

我在展示时明确地传递了拥有的窗口。通过正确设置所有者属性,我的问题得到了解决。

也许您还没有正确设置所有者属性?