动态加载控件上的Tab顺序

时间:2014-01-28 17:23:02

标签: c# wpf tab-ordering

我有一种情况,我正在尝试为动态加载的控件设置Tab键顺序(tabindex)。主XAML看起来像这样:

<ItemsControl DockPanel.Dock="Top" ItemsSource="{Binding ItemsDataSource}" Name="overlayItems" ItemTemplate="{StaticResource DetailsTemplate}">
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel Orientation="Vertical"/>
    </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
</ItemsControl>

出于示例目的,假设DetailsTemplate是这样的简单:

<DataTemplate x:Key="DetailsTemplate">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="50" />
      <ColumnDefinition Width="150" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
      <RowDefinition Height="22" />
      <RowDefinition Height="22" />
      <RowDefinition Height="22" />
    </Grid.RowDefinitions>

    <Label Grid.Column="0" Grid.Row="0" Padding="0">Field 1</Label>
    <TextBox Grid.Column="1" Grid.Row="0" Name="field1TextBox" TabIndex="0" Text="{Binding Field1Value}"/>

    <Label Grid.Column="0" Grid.Row="1" Padding="0">Field 2</Label>
    <TextBox Grid.Column="1" Grid.Row="1" Name="field2TextBox" TabIndex="1" Text="{Binding Field2Value}"/>

    <Label Grid.Column="0" Grid.Row="2" Padding="0">Field 3</Label>
    <TextBox Grid.Column="1" Grid.Row="2" Name="field3TextBox" TabIndex="2" Text="{Binding Field3Value}"/>
  </Grid>
</DataTemplate>

除了生成的Tab键顺序之外,此XAML工作正常。

假设ItemsDataSource是一个类的集合并包含该类的3个实例,则创建三组DetailsTemplate数据模板。但是Tab键顺序没有改变,每个field1TextBox都保留在TabIndex 0.这意味着,而不是从field1TextBox的第一个实例到field2TextBox到field3TextBox的Tab键,选项卡从field1TextBox的第一个实例转到field1TextBox的第二个实例然后到field1TextBox的第三个实例然后到field2TextBox的第一个实例,依此类推。我的问题是,如何更正标签顺序,例如,数据模板的第二个实例将其文本框标签索引分别更新为3,4和5?

1 个答案:

答案 0 :(得分:4)

您可以在MSDN的KeyboardNavigation.TabNavigation Attached Property页面中找到答案。此属性获取或设置此属性在上设置的元素的子元素的逻辑选项卡导航行为。

使用的KeyboardNavigationMode Enumeration中有几个可能的值会以不同的方式影响制表顺序,但是您的Local值之后会产生制表符索引的影响仅在此容器内的本地子树上... [导航在到达边缘时离开包含元素]

<Grid KeyboardNavigation.TabNavigation="Local">
    ...
</Grid>