WPF - 将窗口置于前台

13

我有一个WPF窗口,我不关闭它,而是使用Hide()和Show()方法。现在,当我在我的MainWindow中的Grid上双击记录时,这将触发显示该窗口,但该窗口总是显示在MainWindow后面。 我已经尝试了以下方法,但没有成功:

view.Show();
view.Activate();
view.Topmost = true;
view.Topmost = false;
view.Focus();       

是否有其他方法可以将窗口置于前台?我无法将MainWindow设置为Owner。


1
你需要详细说明“我无法将MainWindow设置为Owner”的问题。 - vcsjones
我不会将MainWindow设置为我的视图的Owner,因为这两个窗口之间没有关系。而且我应该能够打开许多这样的窗口。 - BennoDual
听起来如果窗口A打开窗口B,它们之间存在关联。窗口A可以是多个窗口的所有者,只是不要以模态方式显示。 - Mranz
为什么你立即将“最高值”从true更改为false? - Rev
4个回答

28

Window.Activate 是一个可选方案(如果您不想设置为所有者)。如果这种方式不能起作用(就像您所描述的那样),则问题可能出现在其他位置。也许你的MainWindow中TopMost设置为true?或者你有一个延迟调用,它会将焦点放在主窗口或控件中吗?

正如另一个答案中提到的,调用ShowDialog()不是一个选择,除非您希望整个应用程序被阻塞,直到模态打开的窗口关闭。

Win32-API存在一个错误,它也影响WPF窗口管理,但是您描述的问题似乎不是这样。

此外,以下是一个hack方法,但我希望您不需要使用它:

Dispatcher.BeginInvoke(new Action(delegate {       
        view.Activate();
        }), System.Windows.Threading.DispatcherPriority.ContextIdle, null);

3

我曾经遇到类似的问题,并通过结合其他答案找到了解决方案。一旦窗口被隐藏,我使用以下代码将其置于前台:

    view.WindowState = WindowState.Normal;
    view.Activate();

注意:如果在隐藏之前窗口已被最大化,该代码将使其以最大化状态返回。

这对我有用,而直接使用Activate则没有。非常感谢您的建议! - ravuya
1
即使窗口以最大化状态启动,执行此操作也会将其放置在默认高度/宽度。 - Camadas

2
myWindow.WindowState = WindowState.Normal;

那对我来说有效。


1
我遇到了同样的问题 - 我在 MouseDoubleClick 事件中显示一个 Owner 设置为 NULL 的窗口。最终我意识到需要在我的事件代码完成之前设置:
e.Handled = true 以下 Microsoft 文档概述了当事件以“显著且相对完整的方式”响应时,您可能希望将其标记为已处理:

http://msdn.microsoft.com/en-us/library/ms747183.aspx

这是主观的,但在我的情况下,它防止我刚打开的窗口对用户可见。

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