【问题标题】:How to prevent parent window from going into background after child is closed?如何防止子窗口关闭后父窗口进入后台?
【发布时间】:2014-03-17 17:13:06
【问题描述】:

所以,我的许多 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 上投入更多资源。

【问题讨论】:

    标签: c# wpf windows window


    【解决方案1】:

    将主窗口设置为:

    Topmost=true
    

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

    【讨论】:

    • 虽然它解决了应用程序进入后台的问题,但它引入了用户无法将任何其他窗口置于应用程序之上的问题。即,如果他们想将他们的互联网浏览器窗口放在应用程序窗口的顶部。
    • 查看我的编辑,我采纳了您的想法并对其进行了扩展。
    • 这正是我处理这种情况的方式。我也同意不需要使用计时器,但现实情况是,对于某些编码,topmost 将是理想的,没有睡眠计时器。我很高兴我能够为您指明正确的方向。感谢您的编辑以及有关如何允许其他窗口位于顶部的信息。
    • 必须使用暂停;否则,没有足够的时间让错误启动,然后Topmost 很重要。我已经测试过了。
    • 虽然您的回答并没有完全解决问题,但它引导我找到了我的解决方案,而且似乎没有比这更好的了;因此,你得到了信用。 :)
    【解决方案2】:

    我只想在问题下发表评论,但我没有足够的声誉。 我遇到了同样的问题,在玩了一点这里提出的解决方案之后,意识到一个更干净的解决方案是在父级上调用 Focus() 而不是将其设为最顶层,设置一个计时器,然后删除最顶层:

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

    【讨论】:

      【解决方案3】:

      这个错误确实很烦人,因为它不会一直出现,有时很难重现。我知道 OP 询问了 WPF,但这是我迄今为止针对 WinForms 的解决方法(我更喜欢避免使用 Thread.Sleep(1000) 以便 UI 保持响应):

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

      【讨论】: