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

+0

简单而有效的;-)谢谢! – 2011-03-28 18:49:04

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