在子窗口在第三个窗口上使用ShowDialog之后,主窗口在其他应用程序的窗口后面消失

时间:2012-11-03 13:13:35

标签: c# wpf dialog window modal-dialog

我注意到WPF应用程序中这种奇怪的行为。

我有MainWindow,使用Show()中的App.OnStartup显示。所述MainWindow可以使用SubWindow打开(非模态)Show()SubWindow的{​​{1}}设置为Owner

关闭MainWindow后,SubWindow再次可见(好)。

某些操作可能会导致MainWindow打开第三个窗口作为模式对话框,使用SubWindowShowDialog()设置为Owner)。当该模态对话框在SubWindow的生命周期内至少打开并关闭一次时,就会发生奇怪的事情。

关闭SubWindow后,SubWindow无法进入视野。相反,任何随机窗口隐藏在 MainWindow之后。任何人都可以向我解释为什么会发生这种情况,以及如何解决它?

模态对话框是使用MainWindow显示的普通Window还是使用ShowDialog()显示的消息框没有区别。


以下是一些 minimal 代码来重现这一点。在visual studio中创建一个新的WPF应用程序,并将其粘贴到预先生成的MainWindow.xaml.cs

然后,按键盘上的一个键只打开一个窗口,关闭它,按预期行为。按两个键,关闭两个键,然后第一个窗口在Visual Studio后面(大概)。

MessageBox.Show()

5 个答案:

答案 0 :(得分:9)

这是一个非常烦人的WPF错误,我从来没有找到导致它的代码中的缺陷,但是在源代码中有一个关于聚焦的“必须弄清楚”这一点的heckofalot。只是一个解决方法,一个不太理想的解决方案,你可以通过在窗口关闭时明确地将焦点给予所有者来解决它。将此代码复制/粘贴到SubWindow类中;

    protected override void OnClosing(System.ComponentModel.CancelEventArgs e) {
        base.OnClosing(e);
        if (!e.Cancel && this.Owner != null) this.Owner.Focus();
    }

答案 1 :(得分:0)

只有隐藏窗口才能解决同样的问题。在这种情况下,我无法看到Closing有一个等效事件,但无论如何这都有效:

        if (Owner != null) Owner.Focus();
        Hide();

答案 2 :(得分:0)

this.Owner.Focus();它不适合我,它仍然在后面的窗口我不得不玩了很多并尝试使用TopMost,TopMost的问题是我需要在收盘后将其返回false。我使用了OnClosing和OnClosed事件。

var

答案 3 :(得分:0)

我在WinFoms(.NET 4.7+)中也遇到了同样的问题。我的解决方法是先关闭第一个对话框(调用其Close方法),然后再显示第二个对话框。

示例

  1. 主窗体打开FirstForm
  2. FirstForm打开SecondForm并导致问题!

解决方法

Close内调用FirstForm方法,该方法将打开SecondForm

// FirstForm.cs

using(var secondForm = new SecondForm())
{
    Close(); // <- this closes FirstForm instance
    secondForm.ShowDialog(owner: mainFormInstance);
}

HTH

答案 4 :(得分:0)

一个老问题,但我想我将分享对C#WinForms应用程序有效的方法,因为Owner.Focus()对我不起作用。

这是Daren的TopMost修复程序的一个变体,但我发现我实际上不必将TopMost设置为true和back。只需将其设置为自身,就可以避免父窗口消失在其他应用程序后面。

protected override void OnClosing(CancelEventArgs e) {
    if (Owner != null)
        Owner.TopMost = Owner.TopMost;
    base.OnClosing(e);
}