Create a single key-binding that fires a command every time control is pressed with any number and then passes the number as a parameter?

这一生的挚爱 提交于 2019-12-05 20:52:34

问题


I need to create hot-keys for every control + number combination and would prefer not to have create ten commands. Is there any way to do this?


回答1:


If I understand your question, you have a single command, say MyCommand, and you want to fire it if the user presses CTRL+0 through CTRL+9, and give the command a different parameter for each combination.

In that case, just create 10 key bindings in your window, all bound to MyCommand, and give them a parameter:

<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>



回答2:


Yes, you can create a custom KeyBinding that does this. The code would look something like this:

[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;
    }
  }
}

It would be used like this:

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

Hope this helps.



来源:https://stackoverflow.com/questions/2437289/create-a-single-key-binding-that-fires-a-command-every-time-control-is-pressed-w

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!