Очевидно, что по умолчанию 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
- Кнопка Сохранить
- Кнопка отмены