在我的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键盘上第一次按下,将焦点设置在超链接块上(Image
和TextBlock
)TabIndex="0"
,然后按第二个Tab键切换焦点在元素上与TabIndex="1"
,我也想循环这个开关。换句话说,我希望用户可以通过Tab键盘浏览窗口中的元素,因为我们经常在任何其他常规WinForms应用程序中执行此操作。
我现在究竟拥有什么? 当我按下Tab键盘时,超链接无法获得焦点,我无法使用鼠标在窗口中工作。
请让我知道我出错了什么?
答案 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相同。