title author date CreateTime categories
WPF 弹出 popup 里面的 TextBox 无法输入汉字
lindexi
2018-12-21 18:10:30 +0800
2018-2-13 17:23:3 +0800
WPF

这是一个 wpf 的bug,在弹出Popup之后,如果 Popup 里面有 TextBox ,这时无法在里面输入文字。

因为 Popup 的句柄具有 WS_EX_NOACTIVATE 的特性,所以 Popup 是无法获得焦点。在微软的系统,所有的窗口、控件都是有句柄,句柄就是一个指针,获得他才知道是哪个控件。

古老的输入法就是通过判断获得焦点的句柄是支持输入和判断他需要什么输入,如果在 win7 的搜狗,就是这样判断,于是搜狗很难在 Popup 的 TextBox 输入文字。

这个问题实际很好解决,最简单的方法是把程序修改为 .net 4.6.2 以上,这个 bug 已经在 .net 4.6.2 修复了。或者升级到 win10 系统。如果刚好两个方法都不能使用,那么通过代码也可以解决。

解决的方法是让输入法知道控件的句柄,这需要一个 win32 的 dll ,传说中的 User32.dll ,这个dll有SetFocus这个方法,请通过下面的代码在Popup打开时调用。代码的 ThePopup 就是需要打开的。

[DllImport("User32.dll")]
public static extern IntPtr SetFocus(IntPtr hWnd);IntPtr GetHwnd(Popup popup)
{HwndSource source = (HwndSource)PresentationSource.FromVisual(popup.Child);return source.Handle;
}private void ShowPopupButtonClick(object sender, RoutedEventArgs e)
{ThePopup.IsOpen = true;IntPtr handle = GetHwnd(ThePopup);SetFocus(handle);
}

这是一个简单的方法。当然还有另一个方法,使用SetForegroundWindow方法。

[DllImport("USER32.DLL")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);public static void ActivatePopup(Popup popup)
{HwndSource source = (HwndSource)PresentationSource.FromVisual(popup.Child);IntPtr handle = source.Handle;SetForegroundWindow(handle);
}

参见:https://www.codeproject.com/Questions/184429/Text-box-is-not-working-in-WPF-Popup

如果发现使用了我的方法还是无法输入,那么需要看一下 TextBox 是否禁用输入法。

 InputMethod.SetIsInputMethodSuspended

和这个类的其他属性都可以设置输入法,请尝试修改他的值。

这个问题已经反馈 https://connect.microsoft.com/VisualStudio/feedback/details/389998/wpf-popup-messes-with-ime-switching ,微软已经修复

修复在 Popup 输入法不跟随

在 Popup 里的 TextBox 输入可能出现输入法未跟随编辑框,这时需要调用 Win32 的方法

[DllImport("User32.dll")]
public static extern IntPtr SetFocus(IntPtr hWnd);IntPtr GetHwnd(Popup popup)
{HwndSource source = (HwndSource)PresentationSource.FromVisual(popup.Child);return source.Handle;
}

在 TextBox 获得焦点的时候调用下面代码

xxPopup.GotFocus += Popup_GotFocus;private void Popup_GotFocus(object sender, RoutedEventArgs e){// WPF BUG Fix:TextBox 在 Popup 中,IME 备选框不跟随Win32.SetFocus(GetHwnd(RenamePopup.Child));}

在 WinForms 弹出的 WPF 的 TextBox 无法输入问题

刚刚 Siberia 问了我一个问题,为什么 WinForms 弹出的 WPF 的文本框无法输入数字,但是可以输入其他的内容

一开始我认为的是绑定的问题,如果一个控件绑定了另一个控件,或者有后台代码绑定,有另一个控件绑定了输入框都有方法让用户输入的数字不显示

如果是我在调试,我会先拿到 TextChanged 事件,看是不显示还是没有接收到输入

另外需要判断当前的焦点是否在 TextBox 上

按照这个方法会发现有焦点,但是没有 TextChanged 收到输入,这时因为 WinForms 弹出的 WPF 程序消息循环的键盘事件的问题,对于中文的输入,有输入法在 HasKeyboardFocusCore 拿到输入,但是如果数字不经过输入法就在 WinForms 收到数字

解决的方法是调用 EnableModelessKeyboardInterop 传入 WPF 就可以

Window winWPF = new Window();  //WinWPF为想要显示的WPF窗体。
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(winWPF);
winWPF.Show();

WPF 禁用TextBox的触摸后自动弹出虚拟键盘 - 唐宋元明清2188 - 博客园

解决Winform中弹出WPF窗体不能在文本框中输入的问题 - 飞鹰的专栏 - CSDN博客

Windows 窗体和 WPF 互操作性输入 - 小而美 - CSDN博客

ElementHost.EnableModelessKeyboardInterop(Window) Method (System.Windows.Forms.Integration)

2018-12-21-WPF-弹出-popup-里面的-TextBox-无法输入汉字相关推荐

  1. flutter APP中禁止软键盘弹出,监听硬键盘输入方法

    flutter App中禁止软键盘弹出,监听硬键盘输入的方法 之前的工作中遇到一个需求,想点击输入框后不弹出软键盘,使用设备硬键盘输入,解决方法:设置输入框只读并且显示光标,然后配置键盘监听就可以了. ...

  2. mint-ui 的地址选择 外部套了vant ui的 弹出popup

    <template><div class="edit-address"><van-cell-group><van-field v-mode ...

  3. 【JSConf EU 2018】有关浏览器弹出式窗口的相关探讨

    在前端大爆发的今天,随着层出不穷的新技术和新框架的不断推出和W3C标准的不断更新,前端开发已经不局限于展示服务端返回的信息,而更多的去关注功能,这也带给了我们更多思考. 本次JSCONF2018大会上 ...

  4. 【一周头条盘点】中国软件网(2018.12.17~2018.12.21)

    每一个企业级应用的人都置顶了中国软件网 中国软件网为你带来最新鲜的行业干货 一周热点 钉钉.人力窝联合成立"人力家",重新定义HR的工作方式 近日,阿里巴巴钉钉联合人力窝在杭州召开 ...

  5. MySql每晚12点都会弹出这个?

    这是MySql的定时任务,检查自动更新,可以关掉. 解决方法: 右键计算机,管理,进入系统工具下面的第一个任务计划程序,查看活动任务,会看到一个mysql的任务每天晚上12点自动触发,双击进入任务,将 ...

  6. 为什么MySql每晚12点都会弹出这个?

    这是MySql的定时任务,检查自动更新,可以关掉. 解决方法: 右键计算机,管理,进入系统工具下面的第一个任务计划程序,查看活动任务,会看到一个mysql的任务每天晚上12点自动触发,双击进入任务,将 ...

  7. 背水一战 Windows 10 (36) - 控件(弹出类): ToolTip, Popup, PopupMenu

    原文:背水一战 Windows 10 (36) - 控件(弹出类): ToolTip, Popup, PopupMenu [源码下载] 背水一战 Windows 10 (36) - 控件(弹出类): ...

  8. Openlayers3 实现点击不同的图标弹出不同的popup信息

    1. 我们老师的书籍<WebGIS之Openlayers全面解析>上面有关于popup的例子,作为例子,肯定是写死的,没有查询数据库,也就是只有一个地理位置.(先不要管为什么看不到地图 ) ...

  9. [js]uploadify结合jqueryUI弹出框上传,js中的冒出的bug,又被ie坑了

    引言 最近在一个项目中,在用户列表中需要对给没有签名样本的个别用户上传签名的样本,就想到博客园中上传图片使用弹出框方式,博客园具体怎么实现的不知道,只是如果自己来弄,想到两个插件的结合使用,在弹出框中 ...

最新文章

  1. hive中array嵌套map以及行转列的使用
  2. 判断一个点是否在RotatedRect中
  3. 阿里云移动端播放器高级功能---直播时移
  4. 如何使用 Arthas 定位 Spring Boot 接口超时
  5. uwsgi bind(): Permission denied [core/socket.c line 230]
  6. 在Linux 6上使用UDEV解决RAC ASM存储设备名问题
  7. 跟我一起写 Makefile(五)
  8. MySQL非分片字段查询_Mycat从入门到放弃-Go语言中文社区
  9. C语言三路基数快排multikey quick sort算法(附完整源码)
  10. “白加黑”远控木马技术分析及手杀方案
  11. storm spout mysql_storm+mysql集成
  12. mysql 分组查出来横向展示_MySQL汇总分析(group by)
  13. SQLServer优化资料整理(二)
  14. mysql 113_Centos 下 can't connect mysql server 113
  15. Git学习总结(4)——我的Git忽略文件与忽略文件提交规则和配置总结
  16. android 自己定义标签的使用,实现扁平化UI设计
  17. 随想录(kernel的版本管理)
  18. Eclipse中关闭不需要的插件
  19. Unable to update index for central|http://repo1.maven.org/maven2
  20. 域名没备案使用七牛cdn加速

热门文章

  1. html中img的align属性的参数
  2. H5游戏项目开发总结
  3. Elton John ------Sorry seems to be the hardest
  4. 举个栗子!Tableau 技巧(134):集操作查看数据详情及占比
  5. 为何公众号推送会延迟发送_关于公众号推送延迟更新的说明
  6. PostgreSQL 11 preview - Allow on-line enabling and disabling of data checksums
  7. 计算机网络考试多选题汇总Ⅱ
  8. python中可以作为源文件后缀名的是_python源文件的后缀是什么?
  9. 天津公共资源交易网 url加密
  10. excel表格下载,并设置填充色