WPF中Popup上的textbox无法切换到中文输入法

As Marco Zhou has said in the msdn forum (http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b2428b85-adc9-4a1e-a588-8dbb3b9aac06/):
Windows will only send WM_IME_SETCONTEXT message to the active window, Popup by default is designed to be shown with WM_EX_NOACTIVE which means that it doesn‘t in active state when displaying, that‘s why IME could not work correctly in this regard, to workaround this issue, you could try set the Popup as the active window using win32 SetActiveWindow() API.

So the workaround is use MyPopup instead of Popup:

public class MyPopup : Popup
{
    [DllImport("user32.dll")]
    static extern IntPtr SetActiveWindow(IntPtr hWnd);

static MyPopup()
    {
        EventManager.RegisterClassHandler(
            typeof(MyPopup),
            Popup.PreviewGotKeyboardFocusEvent,
            new KeyboardFocusChangedEventHandler(OnPreviewGotKeyboardFocus),
            true);
    }

private static void OnPreviewGotKeyboardFocus(Object sender, KeyboardFocusChangedEventArgs e)
    {
        var textBox = e.NewFocus as TextBoxBase;
        if (textBox != null)
        {
            var hwndSource = PresentationSource.FromVisual(textBox) as HwndSource;
            if (hwndSource != null)
            {
                SetActiveWindow(hwndSource.Handle);
            }
        }
    }
}

官方解决方案

使用的话自己建一个类代码如上,控件内local:MyPopup 等同于Popup,亲测好使,实用。

参考:https://connect.microsoft.com/VisualStudio/feedback/details/389998/wpf-popup-messes-with-ime-switching

原文地址:https://www.cnblogs.com/Tangcy/p/8118481.html

时间: 2024-12-18 21:46:28

WPF中Popup上的textbox无法切换到中文输入法的相关文章

WPF中Popup控件在Win7以及Win10等中的对齐点方式不一样的解决方案 - 简书

原文:WPF中Popup控件在Win7以及Win10等中的对齐点方式不一样的解决方案 - 简书 最近项目中使用弹出控件Popup,发现弹出框的对齐方式在不同的系统中存在不同(Popup在win10上是弹出在左边,Win7上是弹出在右边).现在记录解决方案于此: 修改弹出菜单相对于相应菜单项是左对齐还是右对齐 // 解决Popup控件在Win7以及Win10等系统中的对齐点方式不一样的问题(以下两种方法均OK) using System.Reflection;    // 方法一 using Sy

QT5.6.0无法切换fcitx中文输入法问题记录

前言:参考了网上一堆的文章,还是出现了一堆的问题,一句话能用apt-get install安装的千万别自己下源码编译,没有新版本就GOOGLE 关键字+PPA找到新版本源,用add-apt-repository命令添加,然后update下,再apt-get install试试有没有,如果要学习另当别论. 一 原因分析: 根据网上和自己的编译经验分析觉得QT5.6之所以无法切换fcitx的输入法是因为qt5的库文件和插件都没有加入fcitx输入法管理工具的相关支持,可能能用ibus,因为我在pla

关于wpf中popup跟随鼠标移动显示

最近在做一个画图工具,里面有一个功能是需要实现,当鼠标移动的时候在,鼠标的旁边显示坐标信息. 第一反应是想到了tooltip,但是tooltip有许多的限制,查询资料的过程中看到了popup,popup比tooltip更加灵活,下面讲讲tooltip跟popup的区别: 1.tooltip会自动显示,自动隐藏,而popup则需要设置IsOpen属性,并且在Popup.StaysOen属性为true时,Popup控件会一直显示,直到显式地将IsOpen属性设置为False.当Popup.Stays

关于WPF中Popup中的一些用法的总结

Popup控件是一个常用的非常有用的控件,顾明思义就是弹出式控件,首先我们来看看MSDN对它的解释吧,表示具有内容的弹出窗口,这个是非常重要的控件,我们看看它的继承关系吧: System.Object  System.Windows.Threading.DispatcherObject    System.Windows.DependencyObject      System.Windows.Media.Visual        System.Windows.UIElement       

IOS8 模拟器键盘与Mac键盘切换及中文输入法键盘的添加

关于键盘切换,输入法的添加,主要有以下两点需要注意: 1.在iOS8中,输入文本信息时,不能同时使用模拟器键盘与Mac键盘输入,而不用切换.iOS8只能使用一种. Mac键盘与模拟器键盘切换快捷键:commond + shift + k 2.模拟器键盘输入法切换 添加中文键盘:Product--Scheme--Edit Scheme--Application Region--中国

WPF中的换行符

原文:WPF中的换行符 WPF中UI上和后台代码中的换行符不同. 其中: XAML中为 C#代码中为 \r\n 或者: Environment.NewLine 版权声明:本文为博主原创文章,未经博主允许不得转载.

wpf中的换行符(转)

WPF中UI上和后台代码中的换行符不同. 其中: XAML中为 C#代码中为 \r\n 或者: Environment.NewLine

wpf中的倒影效果实现

原文:wpf中的倒影效果实现 ? ? ?? <TextBox Name="txt" ? ? ? ? ? ? ? ? ? ? ?FontSize="30" ? ? ? ? ? ? ? ? ? ? ?AcceptsReturn="True" ? ? ? ? ? ? ? ? ? ? ?AcceptsTab="True">abcdefghigklmnopqrstuvwxyz</TextBox> ? ? ? ?

centos6.4中文输入法安装和切换(转载)

centos6.4中文输入法安装和切换(转载) 1.用root登录,或者切换到root账户(su root): 2.yum install "@Chinese Support"; 3.exit: 4.System→preferences→input method:(如果没有,注销用户重新登录系统重试) 5.在input method中,使用add选项选择合适的中文输入法: 6.注销账户,重新登录. over 中英文输入法切换快捷键为Ctrl+Space