C# 如何防止关闭子窗口后父窗口进入后台?

C# 如何防止关闭子窗口后父窗口进入后台?,c#,wpf,windows,window,C#,Wpf,Windows,Window,因此,我的许多WPF应用程序都遇到了一个问题,在关闭窗口的子窗口后,该窗口(通常是我的主窗口)将进入后台,隐藏在我打开的任何其他窗口后面。经过一些研究,我发现了这个提交给微软的bug报告:他们通常的回答是“WPF团队最近已经审查了这个问题,不会解决它…” 有没有人成功地独自解决了这个问题?这让我发疯,我想不出解决办法 编辑: 我仔细考虑了詹姆斯在回答中提出的建议,由于窗户凌驾于其他一切之上的不便性,我几乎拒绝了他的建议,我提出了以下建议: ChildWindow.Closed += delega

因此,我的许多WPF应用程序都遇到了一个问题,在关闭窗口的子窗口后,该窗口(通常是我的主窗口)将进入后台,隐藏在我打开的任何其他窗口后面。经过一些研究,我发现了这个提交给微软的bug报告:他们通常的回答是“WPF团队最近已经审查了这个问题,不会解决它…”

有没有人成功地独自解决了这个问题?这让我发疯,我想不出解决办法

编辑:

我仔细考虑了詹姆斯在回答中提出的建议,由于窗户凌驾于其他一切之上的不便性,我几乎拒绝了他的建议,我提出了以下建议:

ChildWindow.Closed += delegate
{
    ChildWindow = null;
    this.Topmost = true;
    System.Threading.Thread.Sleep(1000);
    this.Topmost = false;
};
因此,当引发child的
Closed()
事件时,我确保父窗口是最上面的。然后,我让线程休眠1秒,并将topmost设置为false,以允许其他窗口覆盖此父窗口

暂停原因:如果我不使用暂停,只使用
this.Topmost=true
后跟
this.Topmost=false
,那么效果永远不会发生,并且由于错误的时间安排,错误仍然会发生


我不确定这是否是最好的方法,但它是有效的。Microsoft需要在WPF上投入更多资源。

将主窗口设置为:

Topmost=true

这应该会有所帮助,但不会完全解决问题。请记住,如果另一个应用程序具有该设置,它们可能最终位于应用程序之上。如果这有帮助,请告诉我。

我会在这个问题下留下评论,但我没有足够的声誉。 我遇到了同样的问题,在使用了这里介绍的解决方案后,我意识到一个更干净的解决方案是对父级调用Focus(),而不是将其设置为最顶层,设置一个计时器,然后删除最顶层:

ChildWindow.Closed += delegate
{
    ChildWindow = null;
    parentWindow?.Focus();
};

这个bug真的很烦人,因为它并非总是出现,有时很难重现。我知道OP询问了WPF,但到目前为止,这是我针对WinForms的解决方法(我更喜欢避免使用
线程.Sleep(1000)
,以便UI保持响应性):


虽然它解决了应用程序进入后台的问题,但它引入了一个问题,即用户无法将任何其他窗口置于应用程序之上。i、 如果他们想把他们的互联网浏览器窗口放在应用程序窗口的顶部。查看我的编辑,我接受了你的想法并对其进行了扩展。这正是我处理这种情况的方式。我也同意不需要使用计时器,但现实情况是,对于某些编码来说,没有睡眠计时器的topmost是理想的。我很高兴能直接为你指出正确的方向。感谢您的编辑和有关如何允许其他窗口位于顶部的信息。必须使用暂停;否则,就没有足够的时间让bug启动,然后
最上面的
就起作用了。我已经测试过了。虽然你的答案不能完全解决问题,但它引导我找到了我的解决方案,而且似乎没有更好的解决方案;因此,您获得了积分。:)
ChildWindow.Closed += delegate { this.Activate(); };