WPF网格中的键盘导航

时间:2012-11-09 15:18:47

标签: wpf keyboard navigation grid itemscontrol

假设您有一个StackPanel,其中包含一个ScrollViewer,其中包含另一个StackPanel,其ItemsControl带有一个绑定的ItemsSource。此ItemsSource绑定到在运行时创建的网格集合。每个网格都包含一个标签和一个文本框/组合框/一些复选框,这些复选框在StackPanel中都有唯一的TabIndex值。 这是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>

我想简单地从一个控件切换到下一个控件,但仅限于网格集合中网格中的控件。到目前为止,我已经尝试了不同的KeyboardNavigation.TabNavigation设置,但没有任何运气。这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

您可以应用隐式样式来禁用每个Control的Tab键,然后重新启用它以获得您想要的选项卡:

<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

答案 1 :(得分:1)

为每个想要表现的容器设置TabNavigationKeyboardNavigationMode.Cycle,因此只要您使用 Tab ,焦点就不会转义它移 + 标签

KeyboardNavigation.SetTabNavigation(grid1, KeyboardNavigationMode.Cycle);

如果您想更改 Ctrl + Tab 行为,请使用KeyboardNavigation.SetControlTabNavigation