我们在项目中使用Mindfusion wpf键盘。
每次文本框聚焦时,我们都会为用户打开键盘对话框。
如果它是一个没有任何行为的常规文本框,一切正常,但是当我们将这个键盘用于带有“全选”行为的文本框时,我们只能输入一个字符,因为它会在键盘上按下后选择文本。
我们检查过,这与Mindfusion键盘没有问题,因为当我们将它用作用户控件时,它可以工作。当我们从他们的应用程序打开这个键盘时它工作。当我们打开Windows键盘时,它可以工作。
我认为最常见的是对话窗口。
我们尝试将其设置为focusable=false
和showactivated=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;
}
}
}
你知道如何防止它失去键盘焦点吗?
答案 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();