【问题标题】:Tabbing through WPF controls in ElementHost within MDI Child causes focus to move to other MDI Child通过 MDI Child 中 ElementHost 中的 WPF 控件切换会导致焦点移动到其他 MDI Child
【发布时间】:2017-11-08 12:26:08
【问题描述】:

我已将我的问题简化为下面的代码,只需将其放入 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();

【问题讨论】:

    标签: wpf winforms


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多