如何防止新的 WPF 表单窃取焦点?

Posted

技术标签:

【中文标题】如何防止新的 WPF 表单窃取焦点?【英文标题】:How to prevent a new WPF form from stealing focus? 【发布时间】:2009-09-21 20:00:32 【问题描述】:

我编写了一个简单的MSN 风格的程序,它将使用WCF 发送和检索消息。主窗体包含一个文本框,用于输入要发送的消息。在后台,应用程序每隔几秒钟轮询一次服务器以获取新消息。当收到新消息时,会打开一个新窗口来显示它。这必须使用 Dispatcher 类在 UI 线程上完成。

问题是当显示新窗口时,焦点从 TextBox 上移开,从而导致输入中断。这很烦人!在MSN Messenger 中,可以在接收消息的同时继续输入您自己的消息。是怎么做到的?

作为一种解决方法,我在 TextBox 具有焦点时推迟弹出带有新消息的弹出窗口,但应该有更好的方法!

【问题讨论】:

有没有办法打开一个新窗口而不被聚焦? 【参考方案1】:

答案很简单:因为 .NET 3.5 SP1 WPF 表单具有 ShowActivated 属性。将此设置为 false,任何被标记的表单都不会再窃取焦点!

【讨论】:

WPF 表单?那是什么?【参考方案2】:

您可以将窗口的 F​​ocusable 属性设置为 false。

【讨论】:

在这种情况下不是。用户必须能够与表单交互【参考方案3】:

在我的应用程序中,我需要在所有其他窗口之上显示一个通知窗口,同时我的 MainWindow 被最小化,但不会窃取焦点。

所以我就这样做了:

private void Window_Loaded(object sender, RoutedEventArgs e)

    this.Topmost = true;
    this.Topmost = false;

【讨论】:

由于在窗口已经激活并显示后会触发加载的事件,因此如果窃取焦点,这不会停止。

以上是关于如何防止新的 WPF 表单窃取焦点?的主要内容,如果未能解决你的问题,请参考以下文章

防止视图窃取焦点/将焦点设置到视图

显示表单而不窃取焦点?

更新谷歌地图会从表单元素中窃取焦点

当表单没有焦点时,如何防止表单处理热键?

非焦点表单上的 C#/WPF 热键(如 launchy)

WPF 打开新窗口 如何设置 焦点还在原来的窗口 谢谢