我有一个试图为动态加载的控件设置选项卡订单(Tabindex)的情况。主XAML看起来像这样:
<ItemsControl DockPanel.Dock="Top" ItemsSource="{Binding ItemsDataSource}" Name="overlayItems" ItemTemplate="{StaticResource DetailsTemplate}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
例如,假设详细信息板很简单:
<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工作正常,除了结果选项卡顺序。
假设tockitdataSource是一个类的集合,并包含该类的3个实例,则创建了三组详细信息模板。但是,选项卡顺序没有更改,每个field1textbox都保留在TabIndex0。这意味着,这意味着从field1textbox的第一个实例到field2textbox,再到field3textbox,而不是从field1textbox的第一个实例到field1textbox的第一个实例到field1textbox的第二个实例。到Field1Textbox的第三个实例,然后到Field2Textbox的第一个实例,依此类推。我的问题是,如何在数据模板的第二个实例中纠正标签顺序,将其文本框索引分别更新为3、4和5?
您会在MSDN的KeyboardNavigation.TabNavigation
附加属性页面中找到答案。此属性获取或设置了该属性设置在上的元素子女的逻辑选项卡导航行为。
使用的KeyboardNavigationMode
枚举中有几个可能的值以不同的方式影响表顺序,但是您追求Local
值,其效果是在此容器内仅考虑 tab索引。和... [到达边缘时导航离开包含元素] 。
<Grid KeyboardNavigation.TabNavigation="Local">
...
</Grid>