Подтвердить что ты не робот

Интерпретировать ввод как вкладку WPF

Я хочу интерпретировать Enter key как клавишу Tab во всем моем приложении WPF, то есть везде в моем приложении, когда пользователь нажимает Enter. Я хочу сфокусировать следующий настраиваемый элемент управления, за исключением случаев, когда кнопка сфокусирована. Есть ли способ сделать это в круге жизненного цикла приложения? Может ли кто-нибудь привести мне пример?
Большое спасибо!

4b9b3361

Ответ 1

Вы можете использовать мой код приложения EnterKeyTraversal, если хотите. Добавьте его в контейнер верхнего уровня в окне WPF, и все внутри будет обрабатывать ввод как вкладку:

<StackPanel my:EnterKeyTraversal.IsEnabled="True">
    ...
</StackPanel>

Ответ 2

Чтобы изменить его во всем проекте, вам нужно сделать это

  • В App.xaml.cs:

    protected override void OnStartup(StartupEventArgs e)
    {           
        EventManager.RegisterClassHandler(typeof(Grid), Grid.PreviewKeyDownEvent, new KeyEventHandler(Grid_PreviewKeyDown));
        base.OnStartup(e);
    }
    
    private void Grid_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        var uie = e.OriginalSource as UIElement;
    
        if (e.Key == Key.Enter)
        {
            e.Handled = true;
            uie.MoveFocus(
            new TraversalRequest(
            FocusNavigationDirection.Next));
        }
    }
    
  • Compile. И сделал это. Теперь вы можете использовать ввод как вкладку. Примечание: Эта работа для элементов в сетке

Ответ 3

Я столкнулся с проблемой woodyiii, добавив в свой XAML файл FrameworkElement.Tag(значение которого IgnoreEnterKeyTraversal) для определенных элементов (кнопок, comboboxes или чего-то, что я хочу игнорировать обход ключа ввода). Затем я искал этот тег и значение в прикрепленном свойстве. Например:

    if (e.Key == Key.Enter)
    {
        if (ue.Tag != null && ue.Tag.ToString() == "IgnoreEnterKeyTraversal")
        {
            //ignore
        }
        else
        {
            e.Handled = true;
            ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }
    }

Ответ 4

woodyiii. В UIElement есть функция PredictFocus(), которая по имени знает свою функцию, тогда вы можете проверить, включен ли этот элемент или нет, чтобы переместить фокус на него или нет...