WPF: навигация по вкладкам не работает с свернутой гиперссылкой - PullRequest
7 голосов
/ 28 марта 2011

Проблема: Навигация с помощью клавиши 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, курсор переместится в текстовый блок «до».Повторное нажатие клавиши TAB ... ничего не дает.Курсор остается в текстовом поле «до» и никогда не достигает текстового поля «после».Навигация работает, как и ожидалось, когда текстовый блок Гиперссылки виден.

Вопрос: Как сделать так, чтобы навигация по TAB работала правильно при свернутом HyperLink?

Ответы [ 2 ]

10 голосов
/ 28 марта 2011

Проблема не в гиперссылке, а во вложенных элементах управления в TextBlock. Вы можете изменить его на

<TextBlock Visibility="Collapsed">               
  <TextBlock Text="MyText" />
</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 )

2 голосов
/ 10 июня 2011

@ Ответ Gimno поставил меня на правильный путь, но я обнаружил, что использование KeyboardNavigation.TabNavigation="None" на самом деле фокусирует верхний элемент только один раз (как и следовало ожидать от Once). Ответ Гимно работает, потому что он / она также установил 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>
...