TabF中的窗口元素的TabNavigation

时间:2010-12-05 21:25:24

标签: wpf usability keyboard-navigation tabnavigator

在我的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键盘上第一次按下,将焦点设置在超链接块上(ImageTextBlockTabIndex="0",然后按第二个Tab键切换焦点在元素上与TabIndex="1",我也想循环这个开关。换句话说,我希望用户可以通过Tab键盘浏览窗口中的元素,因为我们经常在任何其他常规WinForms应用程序中执行此操作。

我现在究竟拥有什么? 当我按下Tab键盘时,超链接无法获得焦点,我无法使用鼠标在窗口中工作。

请让我知道我出错了什么?

2 个答案:

答案 0 :(得分:1)

<强>更新
我将您的示例代码(除了我没有的样式除外)复制到一个小项目中,它似乎对我来说很好。我可以启动窗口,按Tab键聚焦第一个超级链接,按Enter键并单击事件,再次按Tab键等。我唯一能想到的是你的样式中的某些内容会覆盖此行为。我上传了我的示例项目here

注意:我更改了图像的来源,因此您必须将其更改回来:)

旧帖子
这里有两个部分。第一个是FrameworkElement是否可以聚焦。第二个是TabIndex。 TabIndex在Control中派生自FrameworkElement,而不是所有从Control派生的元素,如TextBlock,Rectangle等。如果由于某种原因想要将TabIndex添加到这些元素中,您可以使用KeyboardNavigation.TabIndex。这是一个简单的示例,其中6个控件具有Tab-Order设置,1个Rectangle不可聚焦(因为默认情况下它不可聚焦)。

<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>

答案 1 :(得分:0)

也许这会有所帮助:WPF TabStop / TabIndex in ItemsControl

TabIndex就是你去的地方。当您按Tab键浏览控件时,它将按TabIndex的顺序排列。这些甚至不需要按顺序排列 - 如果在任何地方没有定义3和4,则1,2,5与1,2,3相同。