WPF: Как отключить навигацию по вкладкам без отключения навигации по клавишам со стрелками? - PullRequest
8 голосов
/ 18 ноября 2010

Я установил IsTabStop на false для всех элементов управления в моем окне, чтобы при нажатии клавиши Tab фокус не перемещался (мне нужна клавиша Tab для чего-то другого).Но это нарушает навигацию по клавишам со стрелками - я нажимаю на элемент в ListView, а затем нажимаю вверх / вниз, чтобы изменить выбранный элемент больше.

Есть ли способ отключить навигацию по вкладкам, но безтрогательная навигационная клавиша со стрелкой?Кажется, они связаны между собой.

Я пытался установить IsTabStop в true и TabNavigation в false, но это тоже не работает.

<ListView ItemContainerStyle="{StaticResource ItemCommon}" IsTabStop="False">
    <ListView.Resources>
        <Style x:Key="ItemCommon">
            <Setter Property="IsTabStop" Value="False"/>
            <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
            <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle"/>
        </Style>
    </ListView.Resources>
</ListView>

Ответы [ 2 ]

15 голосов
/ 18 ноября 2010

В вашем окне (или у какого-то предка элементов управления, над которым вы не хотите работать с вкладкой) проглотите клавишу Tab.

Вы можете проглотить его, прикрепив к событию PreviewKeyDown и установив e.Handled = true, когда ключ является вкладкой.

Чистый код позади:

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.PreviewKeyDown += MainWindowPreviewKeyDown;
        }

        static void MainWindowPreviewKeyDown(object sender, KeyEventArgs e)
        {
            if(e.Key == Key.Tab)
            {
                e.Handled = true;
            }
        }
    }

Вы также можете установить обработчик клавиатуры следующим образом:

<Window x:Class="TabSwallowTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Keyboard.PreviewKeyDown="Window_PreviewKeyDown" >

    <StackPanel>
        <TextBox Width="200" Margin="10"></TextBox>
        <TextBox Width="200" Margin="10"></TextBox>
    </StackPanel>
</Window>

но вам понадобится соответствующий обработчик события:

   private void Window_PreviewKeyDown(object sender, KeyEventArgs e)

    {
        if (e.Key == Key.Tab)
        {
            e.Handled = true;
        }
    }
5 голосов
/ 10 февраля 2011

Я полагаю, что вам нужно установить KeyboardNavigation.TabNavigation присоединенное свойство равным Once в ListView.Я сделал это с помощью шаблонного ItemsControl, и он, кажется, дает мне поведение, которого я ожидал бы, как ListBox, где вкладка в элементе управления будет выбирать первый элемент, а дополнительная вкладка будет вкладываться прямо из списка и наследующий элемент управления.

Таким образом, следуя этому методу, ваш пример может быть сокращен до этого.

<ListView ItemContainerStyle="{StaticResource ItemCommon}"
          KeyboardNavigation.TabNavigation="Once" />

Однако я не проверял это с элементом управления ListView, но не хотелне удивлюсь, если это сработает для вас.

...