聚焦和TabIndex在用户控件上的应用

8
我有一个奇怪的现象: 我有一个包含文本框和简单用户控件(文本框和按钮)的MainWindow,但为了调试目的,我将其裁剪为仅含一个文本框。
当我使用没有设置TabIndex属性的文本框和用户控件时,光标按正确顺序步进控件(按照窗口中添加控件的顺序)。
当我使用设置了TabIndex属性的文本框和用户控件时,光标按无效顺序步进控件(首先所有用户控件,然后是所有文本框),这也适用于TabIndex设置为与控件添加顺序相对应的值。
以下是我的用户控件。
<UserControl x:Class="SmallControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             >
        <TextBox x:Name="txTEXT" Text="{Binding Text}" />
</UserControl>

以下Mainwindow xaml导致订单000000,111111,222222,333333,这是正常的。
    <GroupBox Header="Small,Textbox,Small,TextBox without TabIndex">
        <UniformGrid Columns="4">
            <local:SmallControl Text="000000" />
            <TextBox Text="111111" />
            <local:SmallControl Text="222222" />
            <TextBox Text="333333" />
        </UniformGrid>
    </GroupBox>

以下的Mainwindow xaml引导到订单000000,222222,111111,333333,这是不正确的。
    <GroupBox Header="Small,Textbox,Small,TextBox with TabIndex">
        <UniformGrid Columns="4">
            <local:SmallControl TabIndex="0" Text="000000" />
            <TextBox TabIndex="1" Text="111111" />
            <local:SmallControl TabIndex="2" Text="222222" />
            <TextBox TabIndex="3" Text="333333" />
        </UniformGrid>
    </GroupBox>

有没有一种方法可以在不被强制按照XAML中的“正确”顺序添加控件的情况下使用TabIndex?
1个回答

31

默认情况下,WPF 读取所有控件,包括 UserControls 内部和外部的控件,在同一个选项卡级别上(除非另有规定)。由于 UserControl 内部的控件没有指定 TabIndex,因此它们会在第一个 Tab 循环后被放到最后。

为了更改此行为,我通常在我的 UserControl 定义中设置 IsTabStop="False",然后将内部控件的 TabIndex 绑定到 UserControl 的 TabIndex。

UserControl XAML

<TextBox x:Name="txTEXT" Text="{Binding Text}" 
         TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource 
             AncestorType={x:Type local:SearchView}}}"/>

使用 XAML

<GroupBox Header="Small,Textbox,Small,TextBox with TabIndex">
    <UniformGrid Columns="4">
        <local:SmallControl TabIndex="0" Text="000000" IsTabStop="False" />
        <TextBox TabIndex="1" Text="111111" />
        <local:SmallControl TabIndex="2" Text="222222" IsTabStop="False" />
        <TextBox TabIndex="3" Text="333333" />
    </UniformGrid>
</GroupBox>

你还可以通过在UserControl上设置KeyboardNavigation.TabNavigation附加属性为Local,来正确地进行选项卡。我似乎记得在这方面遇到了问题,但是我真的不记得细节了,所以它可能有效。

<UserControl x:Class="SmallControl" ...
             KeyboardNavigation.TabNavigation="Local"  />

谢谢。这里需要注意的是:将IsTabStop放入用户控件XAML中对我没有起到作用,它应该在“使用XAML”中,就像Rachel回答的那样。如果你有很多这样的控件,你可能想把它放到“父控件.resources”中,以使你的XAML更易读。 - Zéiksz

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