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.