Используйте EventTrigger по определенному ключу

Я хотел бы вызвать команду, используя EventTrigger, когда затрагивается конкретный ключ (например, клавиша пробела)

В настоящее время у меня есть:

  <i:Interaction.Triggers>
       <i:EventTrigger EventName="KeyDown">
            <i:InvokeCommandAction Command="{Binding DoCommand}" CommandParameter="{BindingText}"/>
       </i:EventTrigger>
  </i:Interaction.Triggers>

Теперь, как я могу указать, что это должно происходить только тогда, когда KeyDown происходит с помощью пробела?

Ответ 1

Вам нужно будет создать настраиваемый триггер, чтобы обработать это:

public class SpaceKeyDownEventTrigger : EventTrigger {

    public SpaceKeyDownEventTrigger() : base("KeyDown") {
    }

    protected override void OnEvent(EventArgs eventArgs) {
        var e = eventArgs as KeyEventArgs;
        if (e != null && e.Key == Key.Space)
            this.InvokeActions(eventArgs);
    }
}

Ответ 2

Другим подходом будет использование KeyBindings и привязка их к вашему окну, UserControl, FrameworkElement и т.д. Это не приведет к запуску кнопки, но скажите, что у вас есть команда "MyCommand", которая вызывается с помощью кнопки, вы можете вызвать команды из InputBindings.

<UserControl.InputBindings>
   <KeyBinding Command="{Binding Path=ApplyCommand}" Key="Enter"/>
   <KeyBinding Command="{Binding Path=NextPage}" Modifiers="Ctrl" Key="Left"/>
</UserControl.InputBindings>

<StackPanel> 
    <Button IsDefault="True" Content="Apply">
        <i:Interaction.Triggers>
           <i:EventTrigger EventName="Click">
               <i:InvokeCommandAction Command="{Binding Path=ApplyCommand}" />                            
           </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>
 </StackPanel>

Вы также можете привязать эти KeyBindings к TextBox.