Интерпретировать ввод как вкладку WPF - PullRequest
20 голосов
/ 16 мая 2009

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

Ответы [ 4 ]

37 голосов
/ 16 мая 2009

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

<StackPanel my:EnterKeyTraversal.IsEnabled="True">
    ...
</StackPanel>
4 голосов
/ 01 августа 2016

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

  • В приложении. 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. И сделал это. Теперь вы можете использовать Enter как вкладку. Примечание: эта работа для элементов в сетке

4 голосов
/ 21 января 2011

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

    if (e.Key == Key.Enter)
    {
        if (ue.Tag != null && ue.Tag.ToString() == "IgnoreEnterKeyTraversal")
        {
            //ignore
        }
        else
        {
            e.Handled = true;
            ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }
    }
0 голосов
/ 04 сентября 2010

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

...