Один из способов - добавить сочетания клавиш к самим командам, как InputGestures
. Команды реализованы как RoutedCommands
.
Это позволяет сочетаниям клавиш работать, даже если они не подключены к каким-либо элементам управления. А поскольку элементы меню понимают жесты клавиатуры, они автоматически отображают вашу комбинацию клавиш в тексте элементов меню, если вы подключите эту команду к своему элементу меню.
Создайте статический атрибут для хранения команды (желательно как свойство в статическом классе, который вы создаете для команд, но для простого примера, просто используя статический атрибут в window.cs):
public static RoutedCommand MyCommand = new RoutedCommand();
Добавьте горячие клавиши, которые должны вызывать метод:
MyCommand.InputGestures.Add(new KeyGesture(Key.S, ModifierKeys.Control));
Создайте привязку команды, которая указывает на ваш метод для вызова при выполнении. Поместите их в привязки команд для элемента пользовательского интерфейса, для которого он должен работать (например, окна) и метода:
<Window.CommandBindings>
<CommandBinding Command="{x:Static local:MyWindow.MyCommand}" Executed="MyCommandExecuted"/>
</Window.CommandBindings>
private void MyCommandExecuted(object sender, ExecutedRoutedEventArgs e) { ... }
Executed
код для команды будет находиться в коде программной части (окна или пользовательского элемента управления), а не в модели представления, в отличие от использования обычной команды (пользовательскаяICommand
реализация).Я обнаружил, что это именно то, что я искал, связанный с привязкой клавиш в WPF:
См. Сообщение в блоге MVVM CommandReference и KeyBinding
источник
Попробуйте этот код ...
Сначала создайте объект RoutedComand
источник
Это зависит от того, где вы хотите их использовать.
TextBoxBase
производные элементы управления уже реализуют эти ярлыки. Если вы хотите использовать собственные сочетания клавиш, вам следует взглянуть на «Команды» и «Жесты ввода». Вот небольшой учебник от Switch on the Code : WPF Tutorial - Command Bindings and Custom Commandsисточник
Документирование этого ответа для других, так как есть гораздо более простой способ сделать это, на который редко ссылаются и не требует вообще касаться XAML.
Чтобы связать сочетание клавиш, в конструкторе Window просто добавьте новый KeyBinding в коллекцию InputBindings. В качестве команды передайте произвольный класс команд, реализующий ICommand. Для метода execute просто реализуйте любую нужную логику. В моем примере ниже мой класс WindowCommand принимает делегат, который будет выполняться при каждом вызове. Когда я создаю новую WindowCommand для передачи с моей привязкой, я просто указываю в моем инициализаторе метод, который я хочу, чтобы WindowCommand выполнялась.
Вы можете использовать этот шаблон для создания собственных быстрых сочетаний клавиш.
Создайте простой класс WindowCommand, который принимает делегат выполнения для запуска любого установленного для него метода.
источник
У меня была аналогичная проблема, и я нашел ответ @aliwa самым полезным и элегантным решением; однако мне нужна была особая комбинация клавиш Ctrl+ 1. К сожалению, я получил следующую ошибку:
Путем дальнейшего поиска я изменил ответ @aliwa на следующее:
Я обнаружил, что это отлично подходит для любой комбинации, которая мне нужна.
источник
<UserControl.InputBindings> <KeyBinding Gesture="Enter" Command="{Binding someCommand}"/> </UserControl.InputBindings>
VB.NET:
Внутри загруженного события:
XAML не требуется.
источник
Хотя основные ответы верны, мне лично нравится работать с прикрепленными свойствами, чтобы решение можно было применить к любому
UIElement
, особенно когдаWindow
элемент не знает, какой элемент должен быть сфокусирован. По своему опыту я часто вижу композицию из нескольких моделей представления и пользовательских элементов управления, где окно часто является не чем иным, как корневым контейнером.отрывок
С помощью этого присоединенного свойства вы можете определить ярлык фокуса для любого UIElement. Он автоматически зарегистрирует входную привязку в окне, содержащем элемент.
Использование (XAML)
Исходный код
Полный пример, включая реализацию FocusElementCommand, доступен как суть: https://gist.github.com/shuebner20/c6a5191be23da549d5004ee56bcc352d
Отказ от ответственности: вы можете использовать этот код везде и бесплатно. Имейте в виду, что это образец, который не подходит для интенсивного использования. Например, отсутствует сборка мусора для удаленных элементов, потому что команда будет содержать сильную ссылку на элемент.
источник
Как связать команду с
MenuItem
:источник