WPF标签顺序工作错误

时间:2011-04-05 18:03:36

标签: c# wpf xaml tab-ordering

我在WPF中有一个视图,我一直在努力让Tab键顺序正确。我有三个文本框(让我们称之为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>

2 个答案:

答案 0 :(得分:10)

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

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

请注意,在TextBox2标签后,焦点会将焦点移到自定义控件本身上,而不是他们碰巧拥有的任何子控件。我的自定义控件中的TextBox没有TabIndex,因此其TabIndex被假定为默认值Int32.MaxValue(请参阅MSDN documentation for the TabIndex property)。因此,它们按标签顺序排在最后。

如果我将自定义控件标记为IsTabStop="False"(我不明白为什么我希望将焦点放在自定义控件本身上),我发现事情会更好用,并设置TextBox的tab-index通过将属性<my:CustomControl />添加到自定义控件中的TextBox,在TabIndex="{TemplateBinding TabIndex}"元素中给出的自定义控件中。一旦我这样做,Tab键顺序就像我期望的那样,

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

当然,我的自定义控件只包含一个TextBox,因此为我设置一个tab-index固定的东西。我没有你的代码,所以我不能肯定地说,但是将自定义控件中的所有子控件的tab-index设置为<my:CustomControl />元素中的tab-index可能就足够了

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

TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource AncestorType={x:Type my:CustomControlA}}}"

答案 1 :(得分:1)

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

  • 再次检查KeyboardNavigation.TabIndex属性值
  • 您是否在运行时动态添加自定义标签?
  • 您是否在运行时以编程方式更改自定义控件或与其进行交互?
  • 确保在XAML标记中以正确的顺序列出选项卡