Навигация по клавиатуре в сетках WPF


Предположим, что у вас есть StackPanel, которая содержит ScrollViewer, который содержит другую StackPanel с ItemsControl с привязанным ItemsSource. Этот ItemsSource привязан к коллекции сеток, созданных во время выполнения. Каждая сетка содержит метку и текстовое поле / combobox/несколько флажков, которые все имеют уникальное значение TabIndex в StackPanel. Вот xaml:

<ScrollViewer Name="scrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
  <StackPanel Name="stackPanel" MinWidth="500" Width="Auto">
    <ItemsControl Name="itemsControl"                          ItemsSource="{Binding ElementName=SomeWindow, Path=GridsCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
  </StackPanel>
</ScrollViewer>

Я хочу просто переходить от одного элемента управления к другому, но только в пределах элементов управления в сетках в сетках коллекция. До сих пор я пробовал другую клавиатурную навигацию.Настройки TabNavigation, но без успеха. Как лучше всего это сделать?

2 2

2 ответа:

Установить TabNavigation в KeyboardNavigationMode.Cycle для каждого контейнера вы хотите вести себя так, чтобы фокус не ускользал от него, пока вы используете Tab и Shift+Tab :

KeyboardNavigation.SetTabNavigation(grid1, KeyboardNavigationMode.Cycle);

Если вы хотите изменить Ctrl+Tab поведение, использование KeyboardNavigation.SetControlTabNavigation.

Вы можете применить неявный стиль, который отключает табуляцию для каждого элемента управления, а затем повторно включить его только для того, что вы хотите иметь табуляцию:

<ScrollViewer Name="scrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
  <ScrollViewer.Resources>
      <Style TargetType="Control">
          <Setter Property="IsTabStop" Value="False" />
      </Style>
  </ScrollViewer.Resources>
  <StackPanel Name="stackPanel" MinWidth="500" Width="Auto">
    <ItemsControl Name="itemsControl"                          
                  ItemsSource="{Binding ElementName=SomeWindow, Path=GridsCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
  </StackPanel>
</ScrollViewer>

Не забудьте установить IsTabStop на динамически генерируемых сетках в True