UserControls上的焦点和TabIndex

kla*_*sel 6 wpf user-controls focus

我有一个奇怪的行为:我有一个包含文本框和(简单)用户控件(文本框和按钮)的MainWindow,但我将其剥离为仅用于调试目的的文本框.

当我使用textboxes和usercontrols WITHOUT设置TabIndex属性时,光标按正确的顺序逐步执行控件(按照控件添加到窗口的顺序)

当我使用textboxes和usercontrols WITH设置TabIndex属性时,光标以无效顺序(首先是所有用户控件,然后是所有文本框)逐步执行控件,当TabIndex设置为与控件的顺序相对应的值时也是如此添加

这是我的usercontrol

<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>
Run Code Online (Sandbox Code Playgroud)

以下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>
Run Code Online (Sandbox Code Playgroud)

以下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>
Run Code Online (Sandbox Code Playgroud)

有没有办法使用TabIndex而不必强制在xaml中以"正确"的顺序添加控件?

关心克劳斯

Rac*_*hel 28

默认情况下,WPF在同一选项卡级别读取UserControls内部和外部的所有控件(除非另有说明).由于UserControl中的控件没有指定TabIndex,因此它们会在第一个制表符循环后标记为最后一个.

要改变这种行为,我通常设置IsTabStop="False"我的UserControl定义,然后将内部控件TabIndex绑定到UserControl的TabIndex

UserControl XAML

<TextBox x:Name="txTEXT" Text="{Binding Text}" 
         TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource 
             AncestorType={x:Type local:SearchView}}}"/>
Run Code Online (Sandbox Code Playgroud)

用法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>
Run Code Online (Sandbox Code Playgroud)

您也可以通过将UserControl上的KeyboardNavigation.TabNavigation附加属性设置为Local来正确选项.我似乎记得有这个问题,但老实说我不记得细节,所以它可能有用.

<UserControl x:Class="SmallControl" ...
             KeyboardNavigation.TabNavigation="Local"  />
Run Code Online (Sandbox Code Playgroud)

  • 工作,设置TabNavigation = Local是线索 (15认同)