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

Posted Tony

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于WPF中Popup上的textbox无法切换到中文输入法的主要内容,如果未能解决你的问题,请参考以下文章

WPF 怎么设置comboBox.text

WPF与中文输入法兼容性问题的解决方案

Wpf TextBox上的键盘小数分隔符,如何?

WPF 绑定无法与 int 类型的属性一起正常工作

wpf 限制textbox只能输入数字及特殊键

WPF中的Popup控件,遇到个问题,求助