7

我有一种情况,我试图为动态加载的控件设置选项卡顺序 (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>

这个 XAML 工作得很好,除了生成的 tab 顺序。

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

4

1 回答 1

5

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

KeyboardNavigationMode使用的枚举中有几个可能的值会以不同的方式影响制表顺序,但您关注的是该Local值,其效果是仅在此容器内的本地子树上考虑制表索引,并且... [导航离开到达边缘时包含元素]

<Grid KeyboardNavigation.TabNavigation="Local">
    ...
</Grid>
于 2014-01-28T21:44:19.437 回答