在MDI Child中的ElementHost中通过WPF控件进行Tab键导致焦点转移到其他MDI Child

时间:2017-11-08 12:26:08

标签: wpf winforms

我已经将我的问题简化为下面的代码,可以简单地将其放入LinqPad并运行。

问题是当我选中WinForms MDI子项内托管的WPF控件时 - 焦点在文本框之间移动,直到最后一点焦点跳转到第二个MDI子项(在我的示例中)是所有的WinForms和文本框之间的标签工作正常。)

如何防止WPF标签从一个MDI子项交换到另一个子项,而是将焦点保留在WPF文本框中。 (如果WinForms控件出现在ElementHost之前/之后,那么理想情况下焦点将从WinForms传播到WPF再到WinForms,然后返回到第一个WinForms。)

var mdiParent = new Form();
mdiParent.IsMdiContainer = true;
mdiParent.Width = 800;
mdiParent.Height = 600;
mdiParent.Show();

var otherChild = new Form();
otherChild.MdiParent = mdiParent;
var flow = new FlowLayoutPanel();
flow.Controls.Add(new TextBox());
flow.Controls.Add(new TextBox());
flow.Controls.Add(new TextBox());
otherChild.Controls.Add(flow);
otherChild.Show();

var form = new Form();
form.MdiParent = mdiParent;

var elementHost = new ElementHost();
elementHost.Dock = DockStyle.Fill;
form.Controls.Add(elementHost);

string xaml = @"
<StackPanel xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
    <TextBox />
    <TextBox />
    <TextBox />
</StackPanel>
";

elementHost.Child = (UIElement)System.Windows.Markup.XamlReader.Load(new XmlTextReader(new StringReader(xaml)));

form.Show();

1 个答案:

答案 0 :(得分:0)

这不一定是原始问题的答案,但我确实在我的应用程序中实现了一种解决方法。通过创建一个WinForm按钮并将其添加为Forms控件集合中的最后一个控件,焦点从WPF发送到此控件,然后正确返回到窗体上的第一个控件。我已经将控件放在屏幕上,但“解决方案”已经解决了问题。有点难看。当我输入这个时,我也想知道我是否可以将此控件上的TabStop设置为false,仅仅存在足以让WinForms / WPF焦点代码正确移动焦点?