我注意到WPF应用程序中这种奇怪的行为。
我有MainWindow
,使用Show()
中的App.OnStartup
显示。所述MainWindow
可以使用SubWindow
打开(非模态)Show()
。 SubWindow
的{{1}}设置为Owner
。
关闭MainWindow
后,SubWindow
再次可见(好)。
某些操作可能会导致MainWindow
打开第三个窗口作为模式对话框,使用SubWindow
(ShowDialog()
设置为Owner
)。当该模态对话框在SubWindow
的生命周期内至少打开并关闭一次时,就会发生奇怪的事情。
关闭SubWindow
后,SubWindow
无法进入视野。相反,任何随机窗口隐藏在 MainWindow
之后。任何人都可以向我解释为什么会发生这种情况,以及如何解决它?
模态对话框是使用MainWindow
显示的普通Window
还是使用ShowDialog()
显示的消息框没有区别。
以下是一些 minimal 代码来重现这一点。在visual studio中创建一个新的WPF应用程序,并将其粘贴到预先生成的MainWindow.xaml.cs
中然后,按键盘上的一个键只打开一个窗口,关闭它,按预期行为。按两个键,关闭两个键,然后第一个窗口在Visual Studio后面(大概)。
MessageBox.Show()
答案 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
方法),然后再显示第二个对话框。
示例
FirstForm
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);
}