Создайте единственную привязку клавиш, которая запускает команду, каждый контроль времени нажимается с каким-либо числом и затем передает число в качестве параметра?

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

8
задан Cœur 6 August 2017 в 11:33
поделиться

2 ответа

Если я правильно понял ваш вопрос, у вас есть одна команда, скажем MyCommand, и вы хотите выполнить ее, если пользователь нажмет CTRL+0 до CTRL+9, и дать команде разные параметры для каждой комбинации.

В этом случае просто создайте 10 привязок клавиш в вашем окне, все привязанные к MyCommand, и задайте им параметр:

<Window.InputBindings>
    <KeyBinding Command="MyCommand" Gesture="Ctrl+0" CommandParameter="0"/>
    <KeyBinding Command="MyCommand" Gesture="Ctrl+1" CommandParameter="1"/>
    <KeyBinding Command="MyCommand" Gesture="Ctrl+2" CommandParameter="2"/>
    <KeyBinding Command="MyCommand" Gesture="Ctrl+3" CommandParameter="3"/>
    <KeyBinding Command="MyCommand" Gesture="Ctrl+4" CommandParameter="4"/>
    <KeyBinding Command="MyCommand" Gesture="Ctrl+5" CommandParameter="5"/>
    <KeyBinding Command="MyCommand" Gesture="Ctrl+6" CommandParameter="6"/>
    <KeyBinding Command="MyCommand" Gesture="Ctrl+7" CommandParameter="7"/>
    <KeyBinding Command="MyCommand" Gesture="Ctrl+8" CommandParameter="8"/>
    <KeyBinding Command="MyCommand" Gesture="Ctrl+9" CommandParameter="9"/>
</Window.InputBindings>
12
ответ дан 5 December 2019 в 09:25
поделиться

Да, вы можете создать настраиваемую привязку KeyBinding, которая сделает это. Код будет выглядеть примерно так:

[ContentProperty("Keys")]
public class MultiKeyBinding : InputBinding
{
  public ModifierKeys Modifiers;
  public List<Key> Keys = new List<Key>();

  private Gesture _gesture;

  public override InputGesture Gesture
  {
    get
    {
      if(_gesture==null) _gesture = new MultiKeyGesture { Parent = this };
      return _gesture;
    }
    set { throw new InvalidOperationException(); }
  }

  class MultiKeyGesture : InputGesture
  {
    MultiKeyBinding Parent;

    public override bool Matches(object target, InputEventArgs e)
    {
      bool match =
        e is KeyEventArgs &&
        Parent.Modifiers == Keyboard.Modifiers &&
        Parent.Keys.Contains( ((KeyEventArgs)e).Key );

      // Pass actual key as CommandParameter
      if(match) Parent.CommandParameter = ((KeyEventArgs)e).Key;

      return match;
    }
  }
}

Он будет использоваться так:

<local:MultiKeyBinding Command="..." Modifiers="Control">
  <Key>D0</Key>
  <Key>D1</Key>
  ...
</local:MultiKeyBinding>

Надеюсь, это поможет.

6
ответ дан 5 December 2019 в 09:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: