Wpf虚拟键盘对话框窃取文本框键盘焦点

时间:2017-08-30 06:29:43

标签: c# wpf keyboard window focus

我们在项目中使用Mindfusion wpf键盘。

每次文本框聚焦时,我们都会为用户打开键盘对话框。

如果它是一个没有任何行为的常规文本框,一切正常,但是当我们将这个键盘用于带有“全选”行为的文本框时,我们只能输入一个字符,因为它会在键盘上按下后选择文本。

我们检查过,这与Mindfusion键盘没有问题,因为当我们将它用作用户控件时,它可以工作。当我们从他们的应用程序打开这个键盘时它工作。当我们打开Windows键盘时,它可以工作。

我认为最常见的是对话窗口。

我们尝试将其设置为focusable=falseshowactivated=false,但它无效。

我们也尝试使用focusmanger和win32.showunactivated

这是行为代码:

public class SelectAllTextOnFocusBehavior : Behavior<TextBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.GotKeyboardFocus += AssociatedObjectGotKeyboardFocus;
        AssociatedObject.GotMouseCapture += AssociatedObjectGotMouseCapture;
        AssociatedObject.PreviewMouseLeftButtonDown += AssociatedObjectPreviewMouseLeftButtonDown;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.GotKeyboardFocus -= AssociatedObjectGotKeyboardFocus;
        AssociatedObject.GotMouseCapture -= AssociatedObjectGotMouseCapture;
        AssociatedObject.PreviewMouseLeftButtonDown -= AssociatedObjectPreviewMouseLeftButtonDown;
    }

    private void AssociatedObjectGotKeyboardFocus(object sender,
        System.Windows.Input.KeyboardFocusChangedEventArgs e)
    {
        AssociatedObject.SelectAll();
        Console.WriteLine("AssociatedObjectGotKeyboardFocus");
    }

    private void AssociatedObjectGotMouseCapture(object sender,
        System.Windows.Input.MouseEventArgs e)
    {
        AssociatedObject.SelectAll();
        Console.WriteLine("AssociatedObjectGotMouseCapture");
    }

    private void AssociatedObjectPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (!AssociatedObject.IsKeyboardFocusWithin)
        {
            AssociatedObject.Focus();
            Console.WriteLine("AssociatedObjectPreviewMouseLeftButtonDown");

            e.Handled = true;
        }
    }
}

你知道如何防止它失去键盘焦点吗?

1 个答案:

答案 0 :(得分:0)

解决方案是在另一个线程中打开窗口... 我们浪费了12个小时来解决它..

        var thread = new Thread(() =>
        {
            fk = new FullKeyboard();
            fk.Show();
            App.Current.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
            System.Windows.Threading.Dispatcher.Run();
        });

        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();