2011-10-17 17 views
11

me gustaría invocar un comando usando EventTrigger cuando se toca una tecla en particular (por ejemplo, la barra espaciadora)Uso EventTrigger en una determinada clave

Actualmente tengo:

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

Ahora, ¿cómo puede Especifico que esto debería ocurrir solo cuando el KeyDown ocurre con la barra espaciadora?

Respuesta

12

que tendría que construir un disparador personalizada para controlar que:

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); 
    } 
} 
+0

gracias por su respuesta, aunque todavía no puedo hacer que funcione. Cambié mi XAML para usar 'SpaceKeyDownEventTrigger' (en lugar de solo' EventTrigger') pero 'OnEvent' no se ingresó. ¿Hay algo más que deba cambiar en mi XAML? Thx otra vez –

+0

@ lost_bits1110 - ¿Puedes actualizar tu pregunta para incluir un ejemplo completo? ¿Estás seguro de que el evento KeyDown está activando para el control asociado? – CodeNaked

+0

sí, en mi publicación original, el evento se está disparando para el control asociado, pero estaba sucediendo para cada evento de pulsación de tecla. Me gustaría que sucediera en una clave específica. Añadí una clase EventTrigger personalizada como la que has publicado, y simplemente cambié mi XAML para reemplazar EventTrigger con SpakeKeyDownEventTrigger, pero parece que necesito algo más –

11

Otro enfoque sería utilizar KeyBindings y se unen a su ventana, control de usuario, FrameworkElement, etc. Eso no activarán un botón, pero digamos que tiene un comando "MyCommand" que se llama desde el botón, puede invocar el comando desde 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> 

También podría vincular estos KeyBindings a un TextBox.

+1

Prefiero esta solución ya que me permite mantener casi todo mi código en el xaml para manejar las interacciones clave. Actualmente estoy trabajando en una etiqueta editable TextBlock/TextBox y hacerlo de esta manera me permitió crear un nuevo estilo editable que puedo aplicar a cualquier etiqueta en el futuro. Simple y elegante. Gracias Kalisohn !! –

Cuestiones relacionadas