我们正在 WPF 中开发一个 UI 控件,以便在现有的 Windows 窗体/MFC 应用程序引擎 (Rhino 3D) 中使用。
应用程序引擎公开了创建“Dockbar”的能力,它实质上允许您将 Windows 窗体控件放在可以停靠到引擎界面的子窗口中。
我试图将一个简单的 WPF TextBox 放在 ElementHost 控件中,该控件已添加到 Dockbar 中。乍一看,这似乎工作正常;但在尝试输入文本框后,只有某些序列实际显示在文本框中。DELETE、BACKSPACE、COPY、PASTE和SELECTING TEXT工作。如果您键入 AZ、1-9 等,则不会显示这些键。
我已经在网上搜索过,并且听说过,ElementHost.EnableModelessKeyboardInterop()
但这仅适用于从表单创建的 WPF Windows。我只是创建 WPF 用户控件并将它们托管在 ElementHost 控件中。
我看到一篇关于 Dispatcher.Run() 的帖子,它有点工作,但打破了表格的其余部分:
System.Windows.Threading.Dispatcher.Run();
PreviewKeyUp、PreviewKeyDown、KeyUp和KeyDown事件都在 TextBox 上触发,但遗憾的是,TextBox 中没有显示任何文本。
我对 Windows 消息了解不多,但使用 WinSpector 我注意到没有 WM_GETTEXT 消息来自 TextBox(如果它们甚至应该是我不知道)。
我还创建了一个新的 Windows Forms 项目并在那里做了同样的事情,它工作正常,所以它必须是如何在 Rhino 3D 引擎中创建和停靠窗口的问题。
这是不起作用的示例代码:
ElementHost el = new ElementHost();
System.Windows.Controls.TextBox t = new System.Windows.Controls.TextBox();
t.Width = 100;
t.Text = "TEST";
el.Child = t;
panel1.Controls.Add(el);