指定的选项卡顺序未被遵循?

5

为什么我的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
  • 内容控件
  • 保存按钮
  • 取消按钮

但实际情况是:

  • 搜索ComboBox
  • 搜索文本框
  • 搜索按钮
  • 内容控件
  • 数据库ComboBox
  • 保存按钮
  • 取消按钮

我的TabOrder出了什么问题?

编辑

我发现这个回答建议将UserControl.IsTabStop =“False”,并将其子控件的TabIndex绑定到UserControl.TabIndex,这在一定程度上起作用。

现在,我的TabOrder是:

  • 搜索ComboBox
  • 搜索文本框
  • 搜索按钮
  • 数据库ComboBox
  • 保存按钮
  • 取消按钮
  • 内容控件
3个回答

3

默认情况下,WPF 读取所有控件的标签级别相同(除非另有规定),包括 UserControls 内部和外部的控件。由于 UserControl 内部的控件未指定 TabIndex,它们在第一个 Tab 循环后会被移到最后。

解决方法是将内部控件的 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}}}"

选项卡顺序如下:

  • 用户控件搜索下拉框
  • 用户控件搜索文本框
  • 用户控件搜索按钮
  • 数据库下拉框
  • 内容控件
  • 保存按钮
  • 取消按钮

0
尝试在父级 DockPanel 中包含 KeyboardNavigation.TabNavigation="Local"。
<DockPanel KeyboardNavigation.TabNavigation="Local">   

键盘导航模式


我不想要本地选项卡导航... 我希望第一个网格具有 TabIndex 0、1、3、4,第二个网格具有 TabIndex 2。 - Rachel

0

这对我有效:

 <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>

我不想在我的UserControl中使用本地键盘导航。我希望它循环。 - Rachel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接