5

我在 WPF 中有一个观点,我一直在努力使标签顺序正确。我有三个文本框(我们称它们为 Text1、Text2 和 Text3)和两个自定义控件,每个控件上都有几个其他文本框和各种控件(我们称它们为 Custom1 和 Custom2)。

布局是这样的,标签流应该去 Text1、Text2、Custom1、Custom2、Text3。我已在每个控件上设置 TabIndex 属性以匹配此排序,并验证它们都设置为 IsTabStop。

问题是,实际的选项卡流程是 Text1、Text2、Text3,然后是 Custom1、Custom2,我不知道为什么。当它进入自定义控件时,它会正确地跨过它们中的每个控件,正如我所期望的那样。我只是想不通为什么它在进入第一个自定义控件之前进入第三个文本框。

我已经尝试了我能想到的一切,包括确保所有 xaml 元素都按 Tab 键顺序排列,但似乎没有任何帮助。

我怀疑它在关注任何自定义控件之前会检查其所有基本控件,但我没有想法。任何帮助都会很棒。

编辑: 这是我的 xaml:

<Grid>
    <GroupBox x:Name="_groupBox" BorderBrush="Transparent" BorderThickness="0">
        <Grid x:Name="_card">
            <Label Content="A:" Height="28" HorizontalAlignment="Left" Margin="5,3,0,0" Name="_labelA" VerticalAlignment="Top" />
            <Label Content="B:" Height="28" HorizontalAlignment="Left" Margin="5,25,0,0" Name="_labelB" VerticalAlignment="Top" />
            <TextBox Name="_a" Height="20" HorizontalAlignment="Left" Text="{Binding AText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding AEnabled}" Margin="94,5,0,0"  VerticalAlignment="Top" LostFocus="InputNameLeave" Width="221" TabIndex="0" />
            <TextBox Name="_b" Height="20" HorizontalAlignment="Left" Margin="94,26,0,0" Text="{Binding BText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="102" TabIndex="1" />
            <my:CustomControlA HorizontalAlignment="Left" Margin="-6,55,0,0" x:Name="_custom1" VerticalAlignment="Top" TabIndex="2" IsTabStop="True" />
            <my:CustomControlB HorizontalAlignment="Left" Margin="334,0,0,0" x:Name="_custom2" VerticalAlignment="Top" Width="320" TabIndex="3" IsTabStop="True" />
            <Label Content="C:" Height="28" HorizontalAlignment="Left" Margin="342,59,0,0" Name="_labelC" VerticalAlignment="Top" />
            <TextBox Name="_c" Height="20" HorizontalAlignment="Left" Margin="417,60,0,0" Text="{Binding CText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding CEnabled}"  VerticalAlignment="Top" Width="154" TabIndex="4" />
        </Grid>
    </GroupBox>
</Grid>
4

2 回答 2

12

我手头没有您的自定义控件,所以我创建了一个只包含一个文本框的控件。将其连接到您的 XAML 后,我发现 Tab 键顺序如下:

文本框 1、文本框 2、自定义控件 1、自定义控件 2、文本框 3、自定义控件 1 中的文本框、自定义控件 2 中的文本框。

请注意,在 TextBox2 选项卡将焦点移到自定义控件本身之后,而不是它们碰巧拥有的任何子控件。我的自定义控件中的 TextBox 没有 TabIndex,因此它的 TabIndex 被假定为默认值 Int32.MaxValue(有关 TabIndex 属性,请参阅 MSDN 文档)。因此,它们在标签顺序中排在最后。

我发现如果我将自定义控件标记为IsTabStop="False"(我不明白为什么我希望将焦点放在自定义控件本身上),并且将自定义控件中 TextBox 的选项卡索引设置为在<my:CustomControl />通过将属性添加TabIndex="{TemplateBinding TabIndex}"到自定义控件中的 TextBox 中的元素。一旦我这样做了,标签顺序就像我所期望的那样,

TextBox1、TextBox2、CustomControl1 中的 TextBox、CustomControl2 中的 TextBox、TextBox3。

当然,我的自定义控件只包含一个 TextBox,所以设置一个 tab-index 为我解决了问题。我没有你的代码,所以我不能肯定地说,但是以<my:CustomControl />相同的方式将自定义控件中所有子控件的选项卡索引设置为元素中的选项卡索引可能就足够了。

编辑:如果你不能使用TemplateBinding, 而是有一个 .xaml 文件和相应的 .xaml.cs 文件,那么你有所谓的用户控件,而不是自定义控件。在这种情况下,您可以尝试使用以下内容在 XAML 中为 CustomControlA 设置选项卡索引:

TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource AncestorType={x:Type my:CustomControlA}}}"
于 2011-04-05T21:59:23.393 回答
1

请发布您的 XAML 代码。与此同时,需要考虑的一些事项包括:

  • 再次检查 KeyboardNavigation.TabIndex 属性值
  • 您是否在运行时动态添加自定义选项卡?
  • 您是否在运行时以编程方式更改或与自定义控件交互?
  • 确保选项卡在 XAML 标记中以正确的顺序列出
于 2011-04-05T19:03:00.433 回答