Горячие клавиши в WPF

Я знаю об использовании _ вместо &, то, что я ищу, это все сочетания клавиш Ctrl +.

Ctrl + Z для отмены, Ctrl + S для сохранения и т. Д.

Существует ли «стандартный» способ реализации этих приложений в WPF? Или это случай, когда вы сворачиваете свои собственные и подключаете их к любой команде / управлению?

Я понимаю, что стандартный способ – создать команды, а затем добавить к ним свои сочетания клавиш как 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 :

  
  • Командная строка WPF
  • WPF ListView Неактивный цвет выделения
  • Назначить BitmapImage из Resource.resx в Image.Source?
  • Является ли атрибут CallerMemberName в 4.5 "способным подделаться"?
  • Каковы различные режимы привязки WPF?
  • Как установить стиль WPF Window Style в app.xaml?
  • Диспетчер WPF {«вызывающий stream не может получить доступ к этому объекту, потому что ему принадлежит другой stream».}
  • Стиль MenuItem со значком создает только один значок
  • Каков наилучший подход к печати / отчетности из WPF?
  • Как открыть всплывающее окно WPF при нажатии другого элемента управления, используя только разметку XAML?
  • Как я могу получить WPF EventTrigger в триггере View, если он требует диктует базовую модель Viewmodel?
  • Interesting Posts

    Как включить зависимость библиотечного модуля в проекте Android Studio?

    Есть ли название для кнопок закрытия, минимизации и восстановления?

    Как я могу автоматически загружать свой ноутбук с жесткого диска без необходимости нажимать F10 каждый раз?

    EF 4.1 загрузка фильтрованных дочерних коллекций, не работающих для многих-ко-многим

    Как инициализировать значения HashSet по построению?

    Как я могу заставить Visual Studio 2008 Window Forms создать форму, которая реализует абстрактный базовый class?

    PopupMenu с иконками

    Автоматически изменять размер canvasа, чтобы заполнить входящий родитель

    Список как объект поддержки формы с использованием весны 3 mvc, правильный синтаксис?

    как использовать Ontouch и Onclick для ImageButton?

    Что такое «обратный вызов» на C и как они реализованы?

    Получить перечисление из атрибута enum

    Как обслуживать статические файлы из другого каталога, чем статический путь?

    univot в spark-sql / pyspark

    Как удалить .htaccess защиту паролем из подкаталога

    Давайте будем гением компьютера.