Горячие клавиши в WPF
Я знаю об использовании _ вместо &, то, что я ищу, это все сочетания клавиш Ctrl +.
Ctrl + Z для отмены, Ctrl + S для сохранения и т. Д.
Существует ли «стандартный» способ реализации этих приложений в WPF? Или это случай, когда вы сворачиваете свои собственные и подключаете их к любой команде / управлению?
- Конвертер связыванияПараметр
- WPF C #: переупорядочить элементы в списке с помощью перетаскивания
- Как я могу использовать автоматическую прокрутку ListBox при добавлении нового элемента?
- Изображение кнопки мыши WPF
- Как я могу получить DPI в WPF?
- Ленивая загрузка содержимого вкладки WPF
- Как я могу получить положение текстового поля, которое было нажато?
- Bind TextBox при нажатии клавиши Enter
- Конфликты Datacontext
- Ужасная работа пользовательского контроля
- .NET Проблемы с памятью загружаются ~ 40 изображений, память не регенерирована, потенциально из-за fragmentации LOH
- Преобразование массива байтов в изображение в wpf
- KeyBinding в UserControl не работает, когда TextBox имеет фокус
Я понимаю, что стандартный способ – создать команды, а затем добавить к ним свои сочетания клавиш как InputGestures. Это позволяет сочетать клавиши быстрого доступа, даже если они не подключены к каким-либо элементам управления. И поскольку пункты меню понимают жесты клавиатуры, они автоматически отображают вашу комбинацию клавиш в тексте пунктов меню, если вы подключите эту команду до вашего пункта меню.
A. Создайте статический атрибут для удержания команды (желательно как свойство в статическом classе, создаваемом для команд, но для простого примера, просто используя статический атрибут в окне .cs):
public static RoutedCommand MyCommand = new RoutedCommand( );
B. Добавьте сочетания клавиш, которые должны вызвать метод:
MyCommand.InputGestures.Add( new KeyGesture( Key.S , ModifierKeys.Control ));
C. Создайте привязку команд, указывающую на ваш метод для вызова execute, поместите их в командные привязки для элемента пользовательского интерфейса, под которым он должен работать (например, окно) и метода:
private void MyCommandExecuted( object sender, ExecutedRoutedEventArgs e ) { ... }
Я обнаружил, что это именно то, что я искал, связанный с привязкой ключей в WPF.
http://joyfulwpf.blogspot.com/2009/05/mvvm-commandreference-and-keybinding.html
Попробуйте этот код …
Сначала создайте объект RoutedComand
RoutedCommand newCmd = new RoutedCommand(); newCmd.InputGestures.Add(new KeyGesture(Key.N, ModifierKeys.Control)); CommandBindings.Add(new CommandBinding(newCmd, btnNew_Click));
Это зависит от того, где вы хотите их использовать. TextBoxBase
основе TextBoxBase
уже реализуют эти ярлыки. Если вы хотите использовать пользовательские сочетания клавиш, вы должны взглянуть на команды и жесты ввода. Ниже приведен небольшой учебник по Switch on the Code: Учебное пособие WPF – Командные привязки и пользовательские команды
Надеюсь это поможет.
Документирование этого ответа для других, так как существует гораздо более простой способ сделать это, на который редко ссылаются, и вообще не требует прикосновения к XAML.
Чтобы связать сочетание клавиш, в конструкторе Window просто добавьте новый KeyBinding в коллекцию InputBindings. В качестве команды передайте свой произвольный командный class, который реализует ICommand. Для метода execute просто реализуйте любую логику, в которой вы нуждаетесь. В моем примере ниже мой class WindowCommand принимает делегата, который он будет выполнять при каждом вызове. Когда я создаю новый WindowCommand для передачи с моей привязкой, я просто указываю в своем инициализаторе метод, который я хочу, чтобы WindowCommand выполнял.
Вы можете использовать этот шаблон, чтобы придумать свои быстрые быстрые клавиши.
public YourWindow() //inside any WPF Window constructor { ... //add this one statement to bind a new keyboard command shortcut InputBindings.Add(new KeyBinding( //add a new key-binding, and pass in your command object instance which contains the Execute method which WPF will execute new WindowCommand(this) { ExecuteDelegate = TogglePause //REPLACE TogglePause with your method delegate }, new KeyGesture(Key.P, ModifierKeys.Control))); ... }
Создайте простой class WindowCommand, который принимает делегата выполнения, чтобы запустить любой установленный на нем метод.
public class WindowCommand : ICommand { private MainWindow _window; //Set this delegate when you initialize a new object. This is the method the command will execute. You can also change this delegate type if you need to. public Action ExecuteDelegate { get; set; } //You don't have to add a parameter that takes a constructor. I've just added one in case I need access to the window directly. public WindowCommand(MainWindow window) { _window = window; } //always called before executing the command, mine just always returns true public bool CanExecute(object parameter) { return true; //mine always returns true, yours can use a new CanExecute delegate, or add custom logic to this method instead. } public event EventHandler CanExecuteChanged; //i'm not using this, but it's required by the interface //the important method that executes the actual command logic public void Execute(object parameter) { if (ExecuteDelegate != null) { ExecuteDelegate(); } else { throw new InvalidOperationException(); } } }
У меня была аналогичная проблема, и я нашел ответ @ aliwa самым полезным и самым элегантным решением; однако мне понадобилась конкретная комбинация Ctrl + 1
, Ctrl + 1
. К сожалению, я получил следующую ошибку:
«1» не может использоваться как значение для «Ключ». Числа не являются допустимыми значениями enums.
С небольшим продолжением поиска я изменил ответ @ aliwa на следующее:
Я нашел, что это отлично работает для любой комбинации, в которой я нуждался.
VB.Net:
Public Shared SaveCommand_AltS As New RoutedCommand
Внутри загруженного события:
SaveCommand_AltS.InputGestures.Add(New KeyGesture(Key.S, ModifierKeys.Control)) Me.CommandBindings.Add(New CommandBinding(SaveCommand_AltS, AddressOf Me.save))
Нет необходимости в xaml.
Надеюсь это поможет.
Как связать команду с MenuItem
: