.net – WPF托管一个WinForm,Tab导航问题

WindowsFormsHost和标签导航中托管WinForms窗体时遇到问题.为了解决这个简单的例子:

>创建WPF窗口(应用程序的起点)
>创建WinForms窗体,其上有两个TextBox
> WPF窗口:添加了WindowsFormsHost
> WPF窗口:添加OnLoaded处理程序
> WPF窗口:添加了位于WindowsFormsHost下的文本框

在OnLoaded处理程序中我得到:

System.Windows.Forms.Form f = new WinFormsForm();
f.TopLevel = false;
f.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.windowsFormsHost1.Child = f;

当我运行应用程序时:

>没有什么是重点(好的)
>我点击WindowsFormsHost的第一个TextBox,它得到焦点(好的)
>我按Tab,焦点转到第二个TextBox在WindowsFormsHost(好的)
>我再次按Tab键,焦点返回到WindowsFormsHost中的第一个TextBox(不行;应该将WindowsFormsHost和焦点放在WPF窗口底部的文本框)
>我点击wpf(放置在WindowsFormsHost之下)的文本框,它得到焦点(好的)
>我按Tab,焦点转到WindowsFormsHost中的第一个文本框,因为它应该在结束之后开始.所以这也没关系
>我再次点击wpf文本框,按shift标签,焦点转到WindowsFormsHost中的第二个文本框(好的)
>我按Tab,焦点转到WindowsFormsHost中的第一个文本框(转到WFH开头)(不行)

如何让焦点的行为像我只有一种类型的控件?意思是在这种情况下WFH-1st-Textbox,WFH-2nd-Textbox,WPF-Textbox的标签顺序.

根据我发现的文章,似乎不可能完成.根据MSDN Blog Entry(Hwnds部分),Windows Forms控件总是位于层次结构中的WPF控件之上. MSDN article(从WPF消息循环中获取消息的部分)指出,在WPF甚至知道它们之前,会在WindowsFormsHost元素中发生的事件被处理.

所以我假设按下TAB键触发的事件由WindowsFormsHost元素处理(导致其他文本框的焦点).在封闭的WPF窗口中,事件将永远不会被遇到,因为它已经被处理了.另一方面,当您按WPF文本框中的TAB键时,WPF正在处理事件本身,正常处理控制链.有了这个重点将会转到WindowsFormsHost元素中的文本框,从那里你不能使用键盘.

我知道这不会帮助你目前的问题,但我希望它解释一些事情.

附录
如果您不依赖于使用表单控件,则可以将其更改为具有相同控件元素的WinForms用户控件.之后,您可以通过以下方式更改WindowsFormsHost元素的初始化:

System.Windows.Forms.UserControl control = new WinFormUC();
windowsFormsHost1.Child = control;

类WinFormUC是我的WinForms用户控件包含提到的文本框.在我的测试中,TAB键的按压将文本框重点集中在一起,无论是Winforms还是WPF文本框.

翻译自:https://stackoverflow.com/questions/5166476/wpf-hosting-a-winform-tab-navigation-problems

转载注明原文:.net – WPF托管一个WinForm,Tab导航问题