Указанный порядок вкладок не выполняется? - PullRequest
4 голосов
/ 10 октября 2011

Почему мой XAML не соответствует указанному мною TabOrder?

В настоящее время у меня есть:

<DockPanel>
    <Grid DockPanel.Dock="Top">
        <UserControl TabIndex="0">
            <StackPanel Orientation="Horizontal">
                <ComboBox />
                <TextBox Text="Search Text" />
                <Button Content="Search" />
            </StackPanel>
        </UserControl>
        <ComboBox TabIndex="1" />
        <Separator />
        <TextBox TabIndex="3" Text="Save" />
        <TextBox TabIndex="4" Text="Cancel" />
    </Grid>
    <Grid>
        <ContentControl TabIndex="2" />
        <Popup />
    </Grid>
</DockPanel>

enter image description here

Мой TabOrder должен идти

  • Поиск ComboBox
  • Поиск текста
  • Кнопка поиска
  • База данных ComboBox
  • ContentControl
  • Кнопка Сохранить
  • Кнопка отмены

Но вместо этого идет

  • Поиск ComboBox
  • Поиск текста
  • Кнопка поиска
  • ContentControl
  • База данных ComboBox
  • Кнопка Сохранить
  • Кнопка отмены

Что у меня не так с моим TabOrder?

Редактировать

Я нашел этот SO-ответ , в котором предлагалось сделать UserControl.IsTabStop="False" и связать его TabIndex элемента управления Child с UserControl.TabIndex, что частично работает.

Мой TabOrder теперь

  • Поиск ComboBox
  • Поиск текста
  • Кнопка поиска
  • База данных ComboBox
  • Кнопка сохранения
  • Кнопка отмены
  • ContentControl

Ответы [ 3 ]

2 голосов
/ 10 октября 2011

Очевидно, что по умолчанию WPF считывает все элементы управления, внутри и снаружи UserControls, на одном уровне вкладок (если не указано иное) Поскольку элементы управления внутри UserControl не имеют указанного TabIndex, они вкладываются до последней после первого цикла вкладки.

Обходной путь должен был связать TabIndex внутренних элементов управления с TabIndex UserControl

<DockPanel Margin="10" KeyboardNavigation.TabNavigation="Cycle">
    <Grid DockPanel.Dock="Top"
          local:GridProperties.ColumnCount="6"
          local:GridProperties.StarColumns="0">

        <TextBlock Text="Header" FontSize="20" FontWeight="Bold" />
        <ContentControl Grid.Column="1" TabIndex="0" IsTabStop="False" Content="{Binding SearchViewModel}" />

        <ComboBox Grid.Column="2" Margin="5" Width="100" />

        <Separator Grid.Column="3" Style="{StaticResource VerticalSeparatorStyle}" />

        <Button Grid.Column="4" TabIndex="3" Content="Save" Width="75" Margin="5" />
        <Button Grid.Column="5" TabIndex="4" Content="Cancel" Width="75" Margin="5" />
    </Grid>

    <Line HorizontalAlignment="Stretch" X2="1" Stretch="Fill" Stroke="Black" StrokeThickness="1" Margin="0,5" DockPanel.Dock="Top" />

    <Grid x:Name="ShellContentRoot">

        <!-- Current Page -->
        <ContentControl TabIndex="2" Content="{Binding CurrentAccount}" IsTabStop="False" />

        <!-- Search Results -->
        <local:PopupPanel local:PopupPanel.PopupParent="{Binding ElementName=ShellContentRoot}" />
    </Grid>
</DockPanel>

Единственное, что особенного в моих SearchView, это то, что все элементы управления установлены

TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource 
    AncestorType={x:Type local:SearchView}}}"

Вкладка Tab идет:

  • UserControl Search ComboBox
  • UserControl Search Text
  • Кнопка поиска UserControl
  • База данных ComboBox
  • ContentControl
  • Кнопка Сохранить
  • Кнопка отмены
0 голосов
/ 10 октября 2011

Это работает для меня:

 <DockPanel  >
    <DockPanel DockPanel.Dock="Top">
         <UserControl TabIndex="0" KeyboardNavigation.TabNavigation="Local" DockPanel.Dock="Left">
            <StackPanel Orientation="Horizontal">
                <ComboBox />
                <TextBox Text="Search Text" />
                <Button Content="Search" />
            </StackPanel>
         </UserControl>
         <ComboBox TabIndex="1"  DockPanel.Dock="Left" />
         <Separator />
         <TextBox TabIndex="3" Text="Save"  DockPanel.Dock="Left"/>
         <TextBox TabIndex="4" Text="Cancel" DockPanel.Dock="Left"/>
    </DockPanel>
    <Grid DockPanel.Dock="Bottom">
          <ContentControl TabIndex="2"  Height="100" Width="100"/>
          <Popup />
    </Grid>
 </DockPanel>
0 голосов
/ 10 октября 2011

Попробуйте включить KeyboardNavigation.TabNavigation = "Local" в родительский DockPanel.

<DockPanel KeyboardNavigation.TabNavigation="Local">   

KeyboardNavigationMode

...