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

问题描述:

我们在我们的项目中使用Mindfusion wpf键盘。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; 
     } 
    } 
} 

你有任何想法如何防止它丢失键盘焦点?

的解决方案是在另一个线程要打开的窗口...... 我们为了解决这个问题浪费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();