WPF:标签导航打破了折叠的超链接

时间:2011-03-28 15:47:41

标签: wpf hyperlink keyboard navigation visibility

问题:使用TAB键导航在折叠的TextBlock / Hyperlink处停止。

繁殖:

<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键,光标将移动到“之前”TextBox。再次按TAB确实......没有。光标停留在“之前”TextBox中,永远不会到达“之后”文本框。当Hyperlink的TextBlock可见时,导航按预期工作。

问题:如何在HyperLink崩溃的情况下使TAB导航正常工作?

3 个答案:

答案 0 :(得分:9)

问题不是超链接,而是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获得了Focus,即使外部Control被折叠也是如此。将KeyboardNavigation.TabNavigation设置为Once会将其解决为整个Container及其子项仅获得焦点一次。 (MSDN

答案 1 :(得分:2)

@ Gimno的回答让我走上正轨,但我发现使用KeyboardNavigation.TabNavigation="None"实际上只给了top元素一次焦点(正如你对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>

答案 2 :(得分:0)

就我而言,即使使用了折叠的超链接,它也可以正常工作。但是,当我使用FocusManager自动将焦点设置在某些元素上时,我遇到了类似的麻烦。当StackPanel折叠时,它使用Tab键阻止了键盘导航。就我而言,我必须删除 FocusManager.FocusedElement ,一切都很好。

<StackPanel FocusManager.FocusedElement="{Binding ElementName=tbUser}"/>

也许这对其他人也有帮助,因为我花了一些时间来弄清楚。