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

时间:2014-02-18 05:59:03

标签: c# wpf windows window

所以,我已经遇到了很多WPF应用程序的问题,在关闭窗口的儿童窗口之后,那个窗口(通常是我的主窗口)将进入后台,在我打开的任何其他东西后面。经过一些研究,我发现这个提交给微软的错误报告:Bug Report和他们通常的回应“WPF团队最近审查了这个问题,并且不会解决它......”

有没有人成功地自己解决这个问题?它让我发疯,我无法找到解决方案。

修改

我考虑了詹姆斯在他的回答中所推荐的内容,并且由于窗户的不便之处几乎解除了他的建议,我想出了这个:

ChildWindow.Closed += delegate
{
    ChildWindow = null;
    this.Topmost = true;
    System.Threading.Thread.Sleep(1000);
    this.Topmost = false;
};

因此,当引发孩子的Closed()事件时,我确保父窗口是最顶层的。然后,我让线程休眠1秒钟,并将topmost设置为false,以允许其他窗口覆盖此父窗口。

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

我不确定这是否是最好的方式,但它确实有效。微软需要为WPF投入更多资源。

3 个答案:

答案 0 :(得分:2)

将主窗口设置为:

Topmost=true

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

答案 1 :(得分:1)

我只想在问题下发表评论,但我没有足够的声誉。 我遇到了同样的问题,在使用了此处介绍的解决方案后,我意识到一个更干净的解决方案是在父级上调用Focus()而不是使其位于最顶层,设置一个计时器,然后移除最顶层:

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

答案 2 :(得分:0)

此错误确实很烦人,因为它并非一直存在,有时很难复制。我知道OP询问过WPF,但是到目前为止,这是我针对WinForms的解决方法(我宁愿避免使用Thread.Sleep(1000),以便UI保持响应状态)

ChildWindow.Closed += delegate { this.Activate(); };