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

Hel*_*ein 7 navigation keyboard wpf visibility hyperlink

问题:使用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>
Run Code Online (Sandbox Code Playgroud)

如果你运行这个超级简单的演示并按TAB键,光标将移动到"之前"TextBox.再次按TAB确实......没有.光标停留在"之前"TextBox中,永远不会到达"之后"文本框.当Hyperlink的TextBlock可见时,导航按预期工作.

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

Gim*_*mno 10

问题不是超链接,而是TextBlock中的嵌套控件.你可以改成它

<TextBlock Visibility="Collapsed">               
  <TextBlock Text="MyText" />
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

并且标签导航仍然会被破坏.

解决方案是KeyboardNavigation.TabNavigation="Once"在外部TextBlock使用:

<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>
Run Code Online (Sandbox Code Playgroud)

然后一切都按照预期的方式运作.问题是内部TextBlock获得了Focus,即使外部Control被折叠也是如此.设置 KeyboardNavigation.TabNavigationOnce解决它作为整个Container及其子项只获得焦点一次.(MSDN)