1. 程式人生 > >WPF中Popup上的textbox無法切換到中文輸入法

WPF中Popup上的textbox無法切換到中文輸入法

gist () efault use rom switch -i 輸入 spl

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無法切換到中文輸入法