从UserControls使用时在wpf中设置Tab键顺序?

M.A*_*zad 6 c# wpf user-controls tab-ordering

我有这样的用户控件:

<UserControl x:Class="MySample.customtextbox"
         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" 
         mc:Ignorable="d" 
         d:DesignHeight="20" d:DesignWidth="300">
<Grid>
    <TextBox x:Name="Ytextbox"  Background="Yellow"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

我在窗口中使用此控件并设置Tab键顺序...但是当我的窗口加载时,Tab键顺序无法正常工作!我的窗口代码:

<Window xmlns:my="clr-namespace:MySample"  x:Class="MySample.window"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="window" Height="300" Width="600">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>

    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>

   <my:customtextbox Grid.Column="1" KeyboardNavigation.TabIndex="0" InfoText="{Binding msg}" Height="20"/>
    <TextBox Grid.Column="3" KeyboardNavigation.TabIndex="1" Text="{Binding msg}" Height="20" Background="Gold"></TextBox>
    <my:customtextbox Grid.Row="1" Grid.Column="1" KeyboardNavigation.TabIndex="2" InfoText="{Binding msg}" Height="20"/>
    <TextBox Grid.Column="3"  Grid.Row="1"  Text="{Binding msg}" Height="20" KeyboardNavigation.TabIndex="3" Background="Gold"></TextBox>

</Grid>
Run Code Online (Sandbox Code Playgroud)

Rac*_*hel 8

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

我通常使用的解决方法是设置IsTabStop="False"on my UserControl(以防止Tabbing到UserControl本身),然后在UserControl使用a 内部TemplateBinding绑定到TabIndexUserControl的内部控件TabIndex

<TextBox x:Name="Ytextbox"  Background="Yellow"
         TabIndex="{Binding Path=TabIndex, 
         RelativeSource={RelativeSource AncestorType={x:Type local:customtextbox}}}"/>
Run Code Online (Sandbox Code Playgroud)

<my:customtextbox IsTabStop="False" KeyboardNavigation.TabIndex="0" 
                  Grid.Column="1" InfoText="{Binding msg}" Height="20"/>
Run Code Online (Sandbox Code Playgroud)

  • 或者,当您的自定义用户控件具有更多控件,这些控件具有自己的特定制表符顺序,这些控件仅对usercontrol有效时,您可以在&lt;my:usercontrol&gt;上使用`KeyboardNavigation.TabNavigation =“ Local”`。 (2认同)