WPF - сочетания клавиш для захвата управления, даже если они не сфокусированы
Я хочу, чтобы пользователь нажимал вверх / вниз для перемещения по списку, даже считая, что просмотр списка не в фокусе. Но если пользователь печатает в текстовом поле и нажимает вверх, чтобы больше не перемещаться по списку. Возможное решение состоит в том, чтобы добавить событие PreviewKeyDown для каждого элемента, и если захваченный ключ находится вверх / вниз, тогда передайте его дальше вниз по дереву, но это решение не кажется очень практичным, так как у меня много элементов.
Пример кода:
<StackPanel>
<ListView x:Name="capturesUpDownWhenTextBoxNotFocused" ItemsSource="{Binding list}" ItemTemplate="{StaticResource template}">
<ListView.InputBindings>
<KeyBinding Key="Up" Command="{Binding upCommand}"></KeyBinding>
<KeyBinding Key="Down" Command="{Binding downCommand}"></KeyBinding>
</ListView.InputBindings>
</ListView>
<TextBox Text="random text"></TextBox>
<Button Content="button"></Button>
<ListView x:Name="doesNotCaptureUpDownEvenIfFocused" ItemsSource="{Binding activeFile.activeFilters}" ItemTemplate="{StaticResource template}"></ListView>
</StackPanel>
1 ответ
Решение
Вы могли бы справиться с PreviewKeyDown
только событие родительского окна:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
PreviewKeyDown += (s, e) =>
{
var viewModel = DataContext as YourViewModel;
if(viewModel != null)
{
if (e.Key == System.Windows.Input.Key.Up)
{
viewModel.upCommand.Execute(null);
e.Handled = true;
}
else if(e.Key == System.Windows.Input.Key.Down)
{
viewModel.downCommand.Execute(null);
e.Handled = true;
}
}
};
}
Тогда вам не нужно обрабатывать это для любого другого элемента.
И нет, для этого не существует чистого решения XAML.