如何防止子窗口关闭后父窗口后台运行?

6
所以,我在许多WPF应用程序中遇到了一个问题,即关闭窗口的子窗口后,该窗口(通常是我的主窗口)会进入背景,出现在我打开的所有其他内容之后。经过一些研究,我发现这个错误报告已经提交给Microsoft: 错误报告 ,而他们通常的回应是:“ WPF团队最近已经审查了此问题,并不会解决它...”
有人成功地自己解决了吗? 这让我发疯,我想不出解决方案。
编辑:
我考虑了一下James在他的答案中推荐的方法,尽管这个窗口总是显示在其他所有内容之上,但我想出了这个解决方案:
ChildWindow.Closed += delegate
{
    ChildWindow = null;
    this.Topmost = true;
    System.Threading.Thread.Sleep(1000);
    this.Topmost = false;
};

因此,当子窗口的Closed()事件被触发时,我确保父窗口是最顶层的。然后,我让线程休眠1秒钟,并将最顶层设置为false,以允许其他窗口覆盖此父窗口。 暂停的原因:如果我不使用暂停,只是this.Topmost = true后跟this.Topmost = false,那么效果不会产生,并且由于错误的时机,错误仍然会发生。
我不确定这是否是最佳方式,但它有效。微软需要投入更多资源到WPF。
3个回答

2

将主窗口设置为:

Topmost=true

这会有所帮助,但并不能完全解决问题。请记住,如果其他应用程序也具有此设置,则它们仍然可能位于该应用程序之上。如果这有所帮助,请告诉我。


1
虽然它解决了应用程序进入后台的问题,但它引入了一个新问题,即用户无法将任何其他窗口置于应用程序之上。例如,如果他们想要将其互联网浏览器窗口置于应用程序窗口之上。 - B.K.
看看我的修改,我采纳了你的想法并加以扩展。 - B.K.
这正是我处理这种情况的方式。我也同意不应该使用计时器,但现实是,对于某些编码,最上层而无需睡眠计时器是理想的。我很高兴能够指引你正确的方向。感谢您的编辑和有关如何允许其他窗口处于最上层的信息。 - James
必须使用暂停;否则,虫子没有足够的时间来激活,然后Topmost就无关紧要了。我已经测试过了。 - B.K.
1
虽然你的回答并没有完全解决问题,但它引导了我找到了解决方案,并且似乎没有更好的方法;因此,你得到了功劳。 :) - B.K.

2

我只是想在问题下留个评论,但我声望不够。 我也遇到了这个问题,尝试了这里提供的解决方案后,发现更好的方法是在父元素上调用Focus()而不是将其置于最顶层,然后设置一个计时器,再移除最顶层:

Original Answer翻译成"最初的回答"

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

1
这个bug确实非常让人烦恼,因为它并不总是出现,有时很难复现。我知道OP问的是WPF,但到目前为止,我在WinForms上的解决方法是(我更喜欢避免使用Thread.Sleep(1000)以使UI保持响应):
ChildWindow.Closed += delegate { this.Activate(); };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接