WPF:标签导航被折叠的超链接破坏
Posted
技术标签:
【中文标题】WPF:标签导航被折叠的超链接破坏【英文标题】:WPF: Tab navigation broken with collapsed hyperlink 【发布时间】:2011-07-24 14:41:26 【问题描述】:问题:使用 TAB 键导航在折叠的文本块/超链接处停止。
复制:
<Window x:Class="TabTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Width="200" Height="200">
<Grid>
<StackPanel Orientation="Vertical">
<TextBox Text="before" />
<TextBlock>
<TextBlock.Style>
<Style TargetType="x:Type TextBlock">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</TextBlock.Style>
<Hyperlink Focusable="False">
<TextBlock Text="test" />
</Hyperlink>
</TextBlock>
<TextBox Text="after" />
</StackPanel>
</Grid>
</Window>
如果您运行这个超级简单的演示并按 TAB,光标将移动到“之前”文本框。再次按 TAB 不会……什么都没有。光标停留在“之前”文本框,永远不会到达“之后”文本框。当超链接的 TextBlock 可见时,导航按预期工作。
问题:如何在 HyperLink 折叠的情况下使 TAB 导航正常工作?
【问题讨论】:
【参考方案1】:在我的例子中,它甚至可以使用折叠的超链接。但是当我使用 FocusManager 自动将焦点设置在某个元素上时,我遇到了类似的问题。当 StackPanel 折叠时,它使用 Tab 键阻止了键盘导航。在我的情况下,我不得不删除 FocusManager.FocusedElement 并且一切都很好。
<StackPanel FocusManager.FocusedElement="Binding ElementName=tbUser"/>
也许这对其他人也有帮助,因为我花了一些时间来弄清楚。
【讨论】:
【参考方案2】:@Gimno 的回答让我走上了正轨,但我发现使用KeyboardNavigation.TabNavigation="None"
实际上只给顶部元素焦点一次(正如您对Once
所期望的那样)。 Gimno 的回答有效,因为他/她还在超链接上设置了Focusable="False"
。使用 TabNav=None,您不必在所有子控件上设置 Focusable。
这是我对这个方法的应用(只有按钮获得标签焦点,而不是文本块或超链接):
<Button Command="Binding ChangeSoundCommand" Click="ChangeSoundClick" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Transparent" BorderBrush="Transparent" BorderThickness="0" Padding="0"
KeyboardNavigation.TabNavigation="None">
<Button.Template>
<ControlTemplate>
<Grid>
<TextBlock Name="tb" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed" >
<Hyperlink>Browse...</Hyperlink>
</TextBlock>
<TextBlock Name="w_content" Text="Binding FilePath" TextTrimming="CharacterEllipsis" />
</Grid>
<ControlTemplate.Triggers>
<Trigger SourceName="w_content" Property="Text" Value="">
<Setter TargetName="tb" Property="Visibility" Value="Visible"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
【讨论】:
【参考方案3】:问题不在于超链接,而在于 TextBlock 中的嵌套控件。您可以将其更改为
<TextBlock Visibility="Collapsed">
<TextBlock Text="MyText" />
</TextBlock>
标签导航仍然会被破坏。
解决办法是在外层TextBlock处使用KeyboardNavigation.TabNavigation="Once"
:
<TextBlock KeyboardNavigation.TabNavigation="Once">
<TextBlock.Style>
<Style TargetType="x:Type TextBlock">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</TextBlock.Style>
<Hyperlink Focusable="False">
<TextBlock Text="test" />
</Hyperlink>
</TextBlock>
然后一切都按预期进行。问题是内部 TextBlock 获得了焦点,即使外部 Control 它被折叠了。将KeyboardNavigation.TabNavigation
设置为Once
解决了这个问题,因为整个容器及其子容器只获得一次焦点。 (MSDN)
【讨论】:
简单但有效 ;-) 谢谢!以上是关于WPF:标签导航被折叠的超链接破坏的主要内容,如果未能解决你的问题,请参考以下文章
带有超链接和 1 单击展开/折叠的 Google 组织结构图