为什么我的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>
我的TabOrder应该去
>搜索ComboBox
>搜索文字
>搜索按钮
>数据库组合框
> ContentControl
>保存按钮
>取消按钮
但相反它
>搜索ComboBox
>搜索文字
>搜索按钮
> ContentControl
>数据库组合框
>保存按钮
>取消按钮
我的TabOrder有什么问题?
编辑
我发现this SO answer建议将UserControl.IsTabStop =“False”,并将它的Child控件的TabIndex绑定到UserControl.TabIndex,这部分有效.
我的TabOrder现在
>搜索ComboBox
>搜索文字
>搜索按钮
>数据库组合框
>保存按钮
>取消按钮
> ContentControl
最佳答案 显然,默认情况下,WPF会在同一选项卡级别读取UserControls内部和外部的所有控件(除非另有说明).由于UserControl中的控件没有指定TabIndex,因此它们会在第一个制表符循环后标记为最后一个.
解决方法是将内部控件的TabIndex绑定到UserControl的TabIndex
<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搜索ComboBox
> UserControl搜索文本
> UserControl搜索按钮
>数据库组合框
> ContentControl
>保存按钮
>取消按钮