这令我感到困惑。
我编写了一个弹出框,其中包含一个托管在WindowsFormsHost中的WinForms UserControl,后者又托管在一个显示在屏幕上的Primitives.Popup中。整个应用程序是WPF,但是这个控件是从WinForms编写的早期应用程序中取消的。
弹出窗口由外部事件(来自CTI服务器的来电)激活。
UserControl内部是一个文本框控件。当用户在文本框中单击时,我在Popup上调用Focus方法,然后在文本框上调用Focus方法。文本框得到了关注。我可以相当肯定,因为该框在单击后显示了一个光标,而且我还有一个“GotFocus”事件处理程序,用于打印调试消息。
但是,如果在传入事件发生时有另一个程序处于活动状态,则键盘上按下的任何键都将继续转到该程序,而不是文本框。只有当用户点击我的应用程序的另一部分(即弹出窗口外的部分屏幕)才能使其成为活动程序,然后在文本框中单击才能接收键盘输入的文本框。
我希望我已经提供了足够的信息,而没有用无数的细节压倒你。如果还有其他人需要指出我正确的方向,我会很乐意提供它。
答案 0 :(得分:1)
由于WinForm TextBox是托管的,因此设置焦点不会激活托管WPF窗口。添加一行以激活窗口。
private void TextBox_Click(object sender, EventArgs e)
{
this.Activate(); //activate the Window
(sender as System.Windows.Forms.TextBox).Focus();
}