TabNavigation на элементы окна в WPF - PullRequest
1 голос
/ 06 декабря 2010

В моем приложении 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>

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

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

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

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Обновление
Я скопировал ваш пример кода (за исключением стилей, которых у меня не было) в небольшой проект, и он, кажется, работает нормально для меня.Я могу запустить Окно, нажать 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>
0 голосов
/ 06 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...