WPF中窗口元素上的Tab键导航

myzjeezk  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(291)

在我的WPF 4.0基于桌面的应用程序中,我想添加一个通过按Tab键遍历窗口元素的功能。
下面是我的XAML片段:

<!--main body layout-->
<StackPanel x:Name="BodyLayout"
        Style="{StaticResource Body_Block}">

    <!--teaser block-->
    <Grid x:Name="TeaserGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>

        <TextBlock Grid.Column="0"
               Grid.Row="0"
               Style="{StaticResource Body_Teaser_Centering}">
                <Hyperlink Style="{StaticResource Body_Teaser_Hyperlink}"
                       Focusable="True"
                       KeyboardNavigation.TabIndex="0"
                       Click="Call_WinOffences_Click">
                    <Image Source="Resources/teaser_offences.png"
                           Style="{StaticResource Body_Teaser_Image}" />
                    <LineBreak />
                    <TextBlock Text="Offences"
                            Style="{StaticResource Body_Title}" />
                </Hyperlink>
        </TextBlock>

        <TextBlock Grid.Column="1"
               Grid.Row="0"
               Style="{StaticResource Body_Teaser_Centering}">
            <Hyperlink Style="{StaticResource Body_Teaser_Hyperlink}"
                   Focusable="True"
                   KeyboardNavigation.TabIndex="1"
                   Click="Call_WinEvents_Click">
                <Image Source="Resources/teaser_events.png"
                       Style="{StaticResource Body_Teaser_Image}" />
                <LineBreak />
                <TextBlock Text="Events"
                       Style="{StaticResource Body_Title}" />
            </Hyperlink>
        </TextBlock>
    </Grid>
</StackPanel>

我到底需要什么?我想打开这个窗口,并通过按Tab键盘上的第一次设置焦点在超链接块(ImageTextBlock)与TabIndex="0",并通过第二次按Tab将焦点切换到TabIndex="1"元素上,我还想循环这些切换。换句话说,我希望用户可以通过Tab键盘在我的窗口中导航元素,因为我们经常在任何其他正常的WinForms应用程序中这样做。
我现在实际上有什么?当我按Tab键时,超链接没有焦点,没有鼠标,我就不能使用我的窗口。
求你了,让我知道,我做错了什么?

trnvg8h3

trnvg8h31#

更新

我复制了你的示例代码(除了我没有的样式)到一个小项目中,它似乎对我来说工作得很好。我可以启动窗口,按Tab键聚焦第一个超链接,按Enter键,然后引发Click事件,再按Tab键等等。我唯一能想到的是,你的样式中的一些东西覆盖了这个行为。我上传了我的示例项目here
注意:我更改了图像的源代码,所以您必须将它们改回来:)

旧帖子

这里有两个部分。第一个是FrameworkElement是否为Focusable。第二个是TabIndex。TabIndex位于派生自FrameworkElement的Control中,并非所有元素都派生自Control,例如TextBlock。矩形等。如果你出于某种原因想添加TabIndex到这样的元素中,你可以使用KeyboardNavigation.TabIndex来代替。下面是一个简单的例子,有6个带有Tab-顺序集和1 Rectangle不是Focusable(因为默认情况下它不是Focusable)。

<Grid ShowGridLines="True">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Button Grid.Row="0" Grid.Column="0"
            Content="Some Button"
            KeyboardNavigation.TabIndex="0"
            Margin="5"/>
    <TextBox Grid.Row="1" Grid.Column="0"
             Text="Some TextBox"
             KeyboardNavigation.TabIndex="2"
             Margin="5"/>
    <TextBox Grid.Row="2" Grid.Column="0"
             Text="Another TextBox"
             KeyboardNavigation.TabIndex="1"
             Margin="5"/>
    <TextBlock Grid.Row="0" Grid.Column="1"
               Text="Focusable TextBlock"
               Focusable="True"
               KeyboardNavigation.TabIndex="4"
               Margin="5"/>
    <Rectangle Grid.Row="1" Grid.Column="1"
               Fill="Blue"
               Margin="5"/>
    <Rectangle Grid.Row="2" Grid.Column="1"
               Fill="Red"
               Focusable="True"
               KeyboardNavigation.TabIndex="3"
               Margin="5"/>
</Grid>
0yg35tkg

0yg35tkg2#

也许这会有所帮助:WPF TabStop / TabIndex in ItemsControl
TabIndex就是你在这里使用的方法。当你点击Tab键浏览控件时,它将按照TabIndex的顺序。这些甚至不需要按顺序--如果没有定义3和4,1,2,5就和1,2,3一样。

相关问题