Сочетания клавиш уровня приложения в WPF - PullRequest
6 голосов
/ 24 августа 2009

В приложении WPF я в настоящее время пытаюсь связать команду для запуска формы инструмента калькулятора в любом месте приложения с помощью сочетаний клавиш, я создал команду, но не понимаю, как сопоставить команды и сочетания клавиш для создания универсальных сочетаний клавиш в мое заявление. Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 24 августа 2009

Вы можете сделать это в xaml - см. Пример в документации для класса KeyBinding :

<Window.InputBindings>
  <KeyBinding Command="ApplicationCommands.Open"
              Gesture="CTRL+R" />
</Window.InputBindings>

Обновление: похоже, что вы не можете привязать связывание клавиш к ViewModel, используя только xaml, если вы используете MVVM: см. Здесь Связывание клавиш RelayCommand .

3 голосов
/ 05 августа 2016

В WPF для использования ярлыков необходимо сфокусировать соответствующий контроллер. Однако с InputManager вы можете захватывать все виды входных данных вашего приложения. Здесь вам не нужно фокусироваться на соответствующем контроллере.

Сначала вы должны подписать событие.

InputManager.Current.PreProcessInput -= Current_PreProcessInput;
InputManager.Current.PreProcessInput += Current_PreProcessInput;

Тогда

private void Current_PreProcessInput(object sender, PreProcessInputEventArgs args)
    {
        try
        {
            if (args != null && args.StagingItem != null && args.StagingItem.Input != null)
            {
                InputEventArgs inputEvent = args.StagingItem.Input;

                if (inputEvent is KeyboardEventArgs)
                {
                    KeyboardEventArgs k = inputEvent as KeyboardEventArgs;
                    RoutedEvent r = k.RoutedEvent;
                    KeyEventArgs keyEvent = k as KeyEventArgs;

                    if (r == Keyboard.KeyDownEvent)
                    {
                    }

                    if (r == Keyboard.KeyUpEvent)
                    {
                    }
                }
            }
        }
        catch (Exception ex)
        {

        }
    }

Таким образом, вы можете отфильтровать все ненужные вещи и получить необходимые данные. Так как это для приложения захвата ярлыков, я принял только события KeyDown и KeyUp.

Вы также можете получить всю информацию о нажатой клавише

keyEvent.Key.ToString()
...