首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF TextBox在窗口窗体中的ElementHost中不接受输入

WPF TextBox在窗口窗体中的ElementHost中不接受输入
EN

Stack Overflow用户
提问于 2009-05-07 17:02:16
回答 4查看 11.9K关注 0票数 20

我们正在开发WPF中的UI控件,以便在现有的Windows窗体/ MFC应用程序引擎(Rhino3D)中使用。

应用程序引擎公开了创建"Dockbar“的能力,它基本上允许您将Windows窗体控件放置在子窗口中,该窗口可以停靠到engine Interface。

我试图将一个简单的WPF TextBox放在一个ElementHost控件中,该控件被添加到Dockbar中。乍一看,这似乎很好;但是在尝试键入TextBox之后,只有某些序列实际出现在TextBox中。DELETEBACKSPACECOPY粘贴选择文本工作。如果你键入A,1-9等,这些键就不会出现.

我已经浏览过网络,并且听说过ElementHost.EnableModelessKeyboardInterop(),但是这只适用于从表单创建的Windows。我只创建WPF UserControls并将它们托管在ElementHost控件中。

我看到了一个关于Dispatcher.Run()的帖子,它有点工作,但打破了表单的其余部分:

代码语言:javascript
复制
System.Windows.Threading.Dispatcher.Run();

PreviewKeyUpPreviewKeyDownKeyUpKeyDown events都是针对TextBox的,但遗憾的是,TextBox中没有出现任何文本。

我对Windows不太了解,但是使用WinSpector,我注意到没有WM_GETTEXT消息来自TextBox (如果它们应该是,我也不知道)。

我还创建了一个新的Windows窗体项目,并在其中执行了相同的操作,并且工作正常,所以在Rhino3D引擎中如何创建和停靠窗口肯定是个问题。

下面是不起作用的示例代码:

代码语言:javascript
复制
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);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-07 19:58:29

头撒了两天我终于想出来了.

MFC对话框窗口接收WM_CHAR消息,并阻止控件处理输入。因此,为了防止这种情况,我将WM_GETDLGCODE挂起,每当我接收到HwndSource消息时,我就会返回要接受的输入类型,然后将事件标记为已处理。

我创建了自己的TextBox,以避免不得不修复每个文本框(参见下面):

代码语言:javascript
复制
    /// <summary>
    /// Interop Enabled TextBox : This TextBox will properly handle WM_GETDLGCODE Messages allowing Key Input
    /// </summary>
    class IOTextBox : TextBox
    {
        private const UInt32 DLGC_WANTARROWS = 0x0001;
        private const UInt32 DLGC_WANTTAB = 0x0002;
        private const UInt32 DLGC_WANTALLKEYS = 0x0004;
        private const UInt32 DLGC_HASSETSEL = 0x0008;
        private const UInt32 DLGC_WANTCHARS = 0x0080;
        private const UInt32 WM_GETDLGCODE = 0x0087;

        public IOTextBox() : base()
        {
            Loaded += delegate
                          {
                              HwndSource s = HwndSource.FromVisual(this) as HwndSource;
                              if (s != null)
                                  s.AddHook(new HwndSourceHook(ChildHwndSourceHook));
                          };
        }

        IntPtr ChildHwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (msg == WM_GETDLGCODE)
            {
                handled = true;
                return new IntPtr(DLGC_WANTCHARS | DLGC_WANTARROWS | DLGC_HASSETSEL);
            }
            return IntPtr.Zero;
        }
    }
票数 23
EN

Stack Overflow用户

发布于 2009-05-08 13:30:49

看看我自己关于这件事的问题。然而,最终,你所需要的只是这样的东西:

代码语言:javascript
复制
Window window1 = new Window();
ElementHost.EnableModelessKeyboardInterop(window1);
window1.Show();

Why is my WPF textbox "kinda" readonly?

票数 12
EN

Stack Overflow用户

发布于 2011-03-15 16:58:56

对于wxWidgets父窗口和嵌入式WPF TextBox控件,我也有类似的问题。我发现,虽然附加ChildHwndSourceHook确实解决了不接收键盘输入的问题,但我还是偶尔出现了重复的空格字符。WM_KEYDOWN消息似乎可靠地处理空间字符,但也会收到一些空格的重复WM_CHAR消息。为了解决这个问题,我在ChildHwndSourceHook函数的主体中添加了以下子句,它忽略了WM_CHAR空间字符:

代码语言:javascript
复制
        const UInt32 WM_CHAR = 0x0102;

        if (msg == WM_CHAR)
        {
            // avoid duplicated spaces when parent window is a native window
            if (wParam.ToInt32() == 32)
                handled = true;
        }
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/835878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档