Сочетания клавиш в WPF



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



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



существует ли "стандартный" способ их реализации в приложениях WPF? Или это случай свернуть свой собственный и подключить их к любой команде / управлению?

582   8  

8 ответов:

Я понимаю, что стандартный способ-это создание команд, а затем добавление к ним ярлыков в качестве InputGestures. Это позволяет сочетания клавиш работать, даже если они не подключены к каким-либо элементам управления. И поскольку элементы меню понимают жесты клавиатуры, они автоматически отобразят вашу комбинацию клавиш в тексте элементов меню, если вы подключите эту команду к своему элементу меню.

A. создайте статический атрибут для удержания команды (предпочтительно как свойство в статическом классе, который вы создаете для команды - но для простого примера, просто используя статический атрибут в окно .cs):

public static RoutedCommand MyCommand = new RoutedCommand( );

B. добавьте комбинацию клавиш, которая должна вызывать метод:

MyCommand.InputGestures.Add( new KeyGesture( Key.S , ModifierKeys.Control ));

C. создайте привязку команд, которая указывает на ваш метод для вызова execute, поместите их в привязки команд для элемента пользовательского интерфейса, под которым он должен работать (например, окно) & метод:

<Window.CommandBindings>
    <CommandBinding Command="{x:Static local:MyWindow.MyCommand}" Executed="MyCommandExecuted"/>
</Window.CommandBindings>

private void MyCommandExecuted( object sender, ExecutedRoutedEventArgs e ) { ... }

Я обнаружил, что это именно то, что я искал, связанное с привязкой ключа в WPF.

<Window.InputBindings>
        <KeyBinding Modifiers="Control"
                    Key="N"
                    Command="{Binding CreateCustomerCommand}" />
</Window.InputBindings>

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 производные элементы управления уже реализуют эти ярлыки. Если вы хотите использовать пользовательские сочетания клавиш, вы должны взглянуть на команды и жесты ввода. Вот небольшой туториал от Switch on The Code:учебник WPF-привязки команд и пользовательские команды

надеюсь, что это помогает.

документирование этого ответа для других, так как есть гораздо более простой способ сделать это, на который редко ссылаются, и не требует прикосновения к XAML вообще.

чтобы связать сочетание клавиш, в конструкторе окна просто добавьте новую привязку клавиш к коллекции InputBindings. В качестве команды передайте в свой произвольный класс command, который реализует ICommand. Для метода execute просто реализуйте любую логику, которая вам нужна. В моем примере ниже, мой класс 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)));
   ...
}

создайте простой класс 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. К сожалению, я получил следующую ошибку:

'1' не может использоваться в качестве значения для 'ключ'. Числа не являются допустимыми значениями перечисления.

С небольшим дальнейшим поиском я изменил ответ @aliwa на следующее:

<Window.InputBindings>
    <KeyBinding Gesture="Ctrl+1" Command="{Binding MyCommand}"/>
</Window.InputBindings>

Я нашел, что это отлично работает для хорошо любой мне нужна была комбинация.

VB.Net:

Public Shared SaveCommand_AltS As New RoutedCommand

внутри события Loaded:

SaveCommand_AltS.InputGestures.Add(New KeyGesture(Key.S, ModifierKeys.Control))

Me.CommandBindings.Add(New CommandBinding(SaveCommand_AltS, AddressOf Me.save))

xaml не требуется.

надеюсь, что это помогает.

Как связать команду с MenuItem:

<MenuItem Header="My command" Command="{x:Static local:MyWindow.MyCommand}"/>

Comments

    Ничего не найдено.