【发布时间】:2009-05-07 17:02:16
【问题描述】:
我们正在 WPF 中开发一个 UI 控件,以便在现有的 Windows 窗体/MFC 应用程序引擎 (Rhino 3D) 中使用。
应用程序引擎公开了创建“Dockbar”的能力,这实际上让您可以将 Windows 窗体控件放在可以停靠到引擎界面的子窗口中。
我正在尝试将一个简单的 WPF 文本框放入 ElementHost 控件中,该控件已添加到 Dockbar。乍一看,这似乎工作正常;但在尝试输入文本框后,只有某些序列实际显示在文本框中。 DELETE、BACKSPACE、COPY、PASTE 和 SELECTING TEXT 工作。如果您键入 A-Z、1-9 等,这些键不会显示。
我已经在网上搜索过,并且听说过 ElementHost.EnableModelessKeyboardInterop() 但这仅适用于从表单创建的 WPF Windows。我只是创建 WPF 用户控件并将它们托管在 ElementHost 控件中。
我看到一篇关于 Dispatcher.Run() 的帖子,它有点工作,但破坏了表单的其余部分:
System.Windows.Threading.Dispatcher.Run();
PreviewKeyUp、PreviewKeyDown、KeyUp 和 KeyDown 事件都会在 TextBox 上触发,但可惜没有文本显示在文本框中。
我对 Windows 消息了解不多,但使用 WinSpector 我注意到没有 WM_GETTEXT 消息来自 TextBox(如果它们应该是我也不知道)。
我还创建了一个新的 Windows 窗体项目,并在其中做了同样的事情,它工作正常,所以这肯定是窗口在 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);
【问题讨论】:
标签: wpf interop textbox elementhost