WPF:制表导航折断超链接
问题描述:
问题:导航与制表键停止在折叠TextBlock /超链接。WPF:制表导航折断超链接
繁殖:
<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导航正常工作?
答
问题不在于超链接,而在于TextBlock中的嵌套控件。您可以将其更改为
<TextBlock Visibility="Collapsed">
<TextBlock Text="MyText" />
</TextBlock>
并且Tab导航仍将被打破。
的解决方案是在外部的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获取焦点,即使外部控制它被折叠。将KeyboardNavigation.TabNavigation
设置为Once
可以解决整个容器及其孩子只能关注一次的问题。 (MSDN)
答
@ Gimno的回答让我在正确的轨道上,但是我发现,使用KeyboardNavigation.TabNavigation="None"
,其实是给予顶部元素焦点只有一次(因为你会从Once
期望)。 Gimno的回答是有效的,因为他/她也在超链接上设置了Focusable="False"
。使用TabNav = None,您不必在所有子控件上设置Focusable。
这里是我的这种方法的应用(仅Button获取标签的重点,也不正文块或超链接):
<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>
简单而有效的;-)谢谢! – 2011-03-28 18:49:04