У меня есть ситуация, когда я пытаюсь установить порядок табуляции (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 отлично работает, за исключением результирующего порядка табуляции.

Предполагая, что ItemsDataSource является коллекцией класса и содержит 3 экземпляра этого класса, создаются три набора шаблона данных DetailsTemplate. Однако порядок табуляции не меняется, каждый field1TextBox остается на TabIndex 0. Это означает, что вместо перехода от первых экземпляров field1TextBox к field2TextBox к field3TextBox, табуляция переходит от первого экземпляра field1TextBox ко второму экземпляру field1TextBox, а затем к третьему экземпляру field1TextBox, затем к первому экземпляру field2TextBox и так далее. У меня вопрос: как мне исправить порядок табуляции, если, скажем, у второго экземпляра шаблона данных будут обновлены индексы вкладок текстовых полей до 3, 4 и 5 соответственно?

7
Hexum064 28 Янв 2014 в 21:23

1 ответ

Лучший ответ

Вы найдете ответ в KeyboardNavigation.TabNavigation Страница вложенного ресурса из MSDN. Это свойство Получает или задает логическое поведение навигации по вкладкам для дочерних элементов элемента, для которого установлено это свойство .

Есть несколько возможных значений в Используется перечисление KeyboardNavigationMode, которое по-разному влияет на порядок табуляции, но вы выбираете значение Local, что приводит к тому, что индексы вкладок учитываются в локальном поддереве только внутри этого контейнера и ... [Навигация покидает содержащий элемент при достижении края] .

<Grid KeyboardNavigation.TabNavigation="Local">
    ...
</Grid>
5
Sheridan 29 Янв 2014 в 01:44
Спасибо, Шеридан. Я проверю это.
 – 
Hexum064
29 Янв 2014 в 02:10
Я хотел подтвердить, что это сработало для моего решения. Еще раз спасибо!
 – 
Hexum064
30 Янв 2014 в 22:16