TabNavigation на элементы окна в WPF

В моем приложении для рабочего стола WPF 4.0 я хочу добавить возможность проходить через элементы окна, нажимая кнопку Tab.

Вот фрагмент моего XAML:

<!--main body layout-->
<StackPanel x:Name="BodyLayout"
        Style="{StaticResource Body_Block}">

    <!--teaser block-->
    <Grid x:Name="TeaserGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>

        <TextBlock Grid.Column="0"
               Grid.Row="0"
               Style="{StaticResource Body_Teaser_Centering}">
                <Hyperlink Style="{StaticResource Body_Teaser_Hyperlink}"
                       Focusable="True"
                       KeyboardNavigation.TabIndex="0"
                       Click="Call_WinOffences_Click">
                    <Image Source="Resources/teaser_offences.png"
                           Style="{StaticResource Body_Teaser_Image}" />
                    <LineBreak />
                    <TextBlock Text="Offences"
                            Style="{StaticResource Body_Title}" />
                </Hyperlink>
        </TextBlock>

        <TextBlock Grid.Column="1"
               Grid.Row="0"
               Style="{StaticResource Body_Teaser_Centering}">
            <Hyperlink Style="{StaticResource Body_Teaser_Hyperlink}"
                   Focusable="True"
                   KeyboardNavigation.TabIndex="1"
                   Click="Call_WinEvents_Click">
                <Image Source="Resources/teaser_events.png"
                       Style="{StaticResource Body_Teaser_Image}" />
                <LineBreak />
                <TextBlock Text="Events"
                       Style="{StaticResource Body_Title}" />
            </Hyperlink>
        </TextBlock>
    </Grid>
</StackPanel>

Что именно мне нужно? Я хочу открыть это окно и нажав первый раз на клавиатуре вкладки, чтобы установить фокус на блоке гиперссылки (с Image а также TextBlock) с TabIndex="0" и второй нажатие Tab, чтобы переключить фокус на элемент с TabIndex="1"Также я хочу включить этот переключатель. Другими словами, я хочу, чтобы пользователь мог перемещаться по элементам в моем окне с помощью клавиатуры Tab, как мы обычно делаем это в любом другом обычном приложении WinForms.

Что на самом деле я сейчас? Когда я нажимаю на клавиатуре Tab, гиперссылки не получают фокус, и я не могу работать с моим окном без мыши.

Пожалуйста, дайте мне знать, что я делаю не так?

2 ответа

Решение

Обновить
Я скопировал ваш пример кода (за исключением стилей, которых у меня не было) в небольшой проект, и он, кажется, работает нормально для меня. Я могу запустить Окно, нажать Tab, чтобы сначала сосредоточить внимание на гиперссылке, нажать Enter и событие Click возникает, снова нажать Tab и т. Д. Единственное, что я могу думать, это то, что что-то в ваших стилях отменяет это поведение. Я загрузил мой пример проекта здесь.

Примечание: я изменил источник для изображений, поэтому вам придется изменить их обратно:)

Старый пост
Здесь есть две части. Первый, если FrameworkElement является Фокусируемым или нет. Второй - это TabIndex. TabIndex находится в Control, который является производным от FrameworkElement, и не все элементы являются производными от Control, такие как TextBlock, Rectangle и т. Д. Если вы по какой-то причине хотите добавить TabIndex к таким элементам, вы можете вместо этого использовать KeyboardNavigation.TabIndex. Вот простой пример с 6 элементами управления с установленным порядком табуляции и 1 прямоугольником, который нельзя сфокусировать (поскольку он не фокусируется по умолчанию).

<Grid ShowGridLines="True">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Button Grid.Row="0" Grid.Column="0"
            Content="Some Button"
            KeyboardNavigation.TabIndex="0"
            Margin="5"/>
    <TextBox Grid.Row="1" Grid.Column="0"
             Text="Some TextBox"
             KeyboardNavigation.TabIndex="2"
             Margin="5"/>
    <TextBox Grid.Row="2" Grid.Column="0"
             Text="Another TextBox"
             KeyboardNavigation.TabIndex="1"
             Margin="5"/>
    <TextBlock Grid.Row="0" Grid.Column="1"
               Text="Focusable TextBlock"
               Focusable="True"
               KeyboardNavigation.TabIndex="4"
               Margin="5"/>
    <Rectangle Grid.Row="1" Grid.Column="1"
               Fill="Blue"
               Margin="5"/>
    <Rectangle Grid.Row="2" Grid.Column="1"
               Fill="Red"
               Focusable="True"
               KeyboardNavigation.TabIndex="3"
               Margin="5"/>
</Grid>

Может быть, это поможет: WPF TabStop / TabIndex в ItemsControl

TabIndex - это то, как вы идете сюда. Когда вы нажимаете Tab, чтобы пройти через элементы управления, он будет идти в порядке TabIndex. Они даже не должны быть в последовательном порядке - 1, 2, 5 - это то же самое, что и 1, 2, 3, если нигде не определены 3 и 4.

Другие вопросы по тегам