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.

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