簡體   English   中英

WPF虛擬鍵盤對話框搶斷文本框的鍵盤焦點

[英]Wpf Virtual Keyboard dialog steals textbox keyboard 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;
        }
    }
}

你有什么想法如何防止它失去鍵盤焦點?

解決的辦法是在另一個線程中打開窗口...我們浪費了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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM