WPF托管WinForm,Tab导航问题

Zoo*_*Way 13 .net wpf windowsformshost tab-ordering winforms

在a WindowsFormsHost和选项卡导航中托管WinForms表单时遇到了问题.要解决我已经做了这个简单的例子:

  • 创建WPF Window(应用程序的起点)
  • 创建Form了两个TextBox上面的WinForms
  • WPF窗口:添加WindowsFormsHost到它
  • WPF窗口:添加了OnLoaded处理程序
  • WPF窗口:添加Textbox定位在WindowsFormsHost

OnLoaded我得到的处理程序中:

System.Windows.Forms.Form f = new WinFormsForm();
f.TopLevel = false;
f.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.windowsFormsHost1.Child = f;
Run Code Online (Sandbox Code Playgroud)

当我现在运行应用程序时:

  • 什么都没有集中(好)
  • 我点击第一个TextBoxWindowsFormsHost,它获得焦点(OK)
  • 我按Tab键,焦点转移到第二TextBoxWindowsFormsHost(OK)
  • 我再次按Tab键,焦点返回到第1 TextBoxWindowsFormsHost( ok了;应该已经离开WindowsFormsHost,并在WPF窗口底部给予重点的文本框)
  • 我点击wpf中的文本框(放在后面和下面WindowsFormsHost),它得到焦点(确定)
  • 我按Tab键,焦点转到第一个文本框WindowsFormsHost- 因为它应该在结束后开始.所以这也没关系
  • 我再次单击wpf文本框并按shift + tab,焦点转到第二个文本框WindowsFormsHost(ok)
  • 我按Tab键,焦点转移到文本框第一次在WindowsFormsHost(去在WFH开始)(确认)

如果我只有一种类型的控件,我如何使焦点行为?在这种情况下,意味着WFH-1st-Textbox,WFH-2nd-Textbox,WPF-Textbox的Tab键顺序.

Osi*_*s76 7

根据我发现的文章,这似乎无法实现.根据MSDN博客条目(部分Hwnds),Windows窗体控件始终位于层次结构中的WPF控件之上.的MSDN文章(来自WPF消息循环部分,获取消息)指出,在一个WindowsFormsHost元素中发生的事件将前WPF甚至意识到它们进行处理.

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

我知道这不会对你当前的问题有所帮助,但我希望它能解释一些问题.


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

System.Windows.Forms.UserControl control = new WinFormUC();
windowsFormsHost1.Child = control;
Run Code Online (Sandbox Code Playgroud)

WinFormUC类是我的WinForms用户控件,包含上面提到的文本框.在我的测试中,无论是Winforms还是WPF文本框,按下TAB键都会一个接一个地聚焦文本框.