WPF: Как отключить навигацию вклады, не отключающую навигацию клавиши со стрелкой?
-
25-09-2019 - |
Вопрос
Я установил IsTabStop
Чтобы ложь на всех элементах управления в моем окне, так что, когда я нажимаю клавишу Tab, фокус не двигается (мне нужен ключ вкладки для чего-то другого). Но делает это перерывы навигации навигации со стрелкой - я нажимаю на элемент в ListView
а затем нажатие вверх / вниз не меняет выбранный элемент больше.
Есть ли способ отключить навигацию вклады, но без прикосновения ключей стрелки навигации? Кажется, они связаны.
Я пытался установить IsTabStop
правда и TabNavigation
до false, но это тоже не работает.
<ListView ItemContainerStyle="{StaticResource ItemCommon}" IsTabStop="False">
<ListView.Resources>
<Style x:Key="ItemCommon">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
<Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle"/>
</Style>
</ListView.Resources>
</ListView>
Решение
В вашем окне (или некоторое предку элементов управления вы не хотите работать на) проглотить клавишу вкладки.
Вы можете проглотить его, прикрепив к событию предыдущего проявления и установите E.chandled = True, когда ключ представляет собой вкладку.
Чистый код позади:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.PreviewKeyDown += MainWindowPreviewKeyDown;
}
static void MainWindowPreviewKeyDown(object sender, KeyEventArgs e)
{
if(e.Key == Key.Tab)
{
e.Handled = true;
}
}
}
Вы также можете установить обработчик клавиатуры как таковой:
<Window x:Class="TabSwallowTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
Keyboard.PreviewKeyDown="Window_PreviewKeyDown" >
<StackPanel>
<TextBox Width="200" Margin="10"></TextBox>
<TextBox Width="200" Margin="10"></TextBox>
</StackPanel>
</Window>
Но вам понадобится соответствующий обработчик событий:
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Tab)
{
e.Handled = true;
}
}
Другие советы
Я верю, что вы хотите, это установить Keyboardnavigation.tabnavigation. Прилагается свойство To Один раз В вашем списке. Я сделал это с помощью шаблонных элементовControl, и, похоже, дает мне поведение, которое я ожидаю, что он ожидал, как список ListBox, где вкладка в управление выберет первый элемент, но вкладка «Дополнительная вкладка» вкладка вкладка прямо из списка и на Следующий контроль.
Таким образом, следуя этот метод, ваш пример может быть в состоянии по договорной цене для этого.
<ListView ItemContainerStyle="{StaticResource ItemCommon}"
KeyboardNavigation.TabNavigation="Once" />
Однако я не проверял это с помощью элемента управления ListView, но я не был бы удивлен, если это работает для вас.