1

在我的 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 键盘时,超链接没有获得焦点,我无法在没有鼠标的情况下使用我的窗口。

请让我知道,我出了什么问题?

4

2 回答 2

1

更新
我将您的示例代码(除了我没有的样式)复制到一个小项目中,它似乎对我来说工作正常。我可以启动窗口,按 Tab 以首先聚焦超链接,按 Enter 并引发 Click 事件,再次按 Tab 等。我唯一能想到的是您的样式中的某些内容会覆盖此行为。我在这里上传了我的示例项目。

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

旧帖子
这里有两个部分。第一个是 FrameworkElement 是否可聚焦。第二个是 TabIndex。TabIndex 位于从 FrameworkElement 派生的 Control 中,并非所有元素都从 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>
于 2010-12-05T21:51:46.180 回答
0

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

TabIndex 是你去这里的方式。当您按 Tab 键通过控件时,它将按照 TabIndex 的顺序进行。这些甚至不需要按顺序排列——如果在任何地方都没有定义 3 和 4,则 1、2、5 与 1、2、3 相同。

于 2010-12-05T21:39:30.377 回答