2010-03-10 17 views
5

He follwing el código (que no está funcionando):Atajo de teclado WPF - ¿Por qué no funciona?

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) { 
    e.Handled = true; 
    if ((e.Key == Key.P) && (Keyboard.Modifiers == ModifierKeys.Alt)) { 
     MessageBox.Show("Thanks!"); 
    }    
} 

Por qué no funciona? El evento se está disparando, pero

(e.Key == Key.P) && (Keyboard.Modifiers == ModifierKeys.Alt)) 

nunca se evalúa como verdadero. Mis eventos similares usando Ctrl en lugar de Alt de esta manera trabajo. También mis eventos que incluyen CtrlyAlt funcionan también.

+0

¿El evento en sí no está disparando, o el condicional no está evacuando a verdadero? –

+0

Opps! Arreglaré mi pregunta. ¡Gracias! – Justin

+0

¿No es esta una aplicación de WPF? Si es así, ¿qué evento/fuente es este, WPF 3.5 KeyEventArgs no tiene propiedad Modificadores ??? –

Respuesta

3

Una mejor manera de trabajar con claves en WPF es Key Gestures

por ej. nota que este es un ejemplo, no una solución

<Window.InputBindings> 
    <KeyBinding Command="ApplicationCommands.Open" Gesture="ALT+P" /> 
</Window.InputBindings> 

Hay más a él que eso, sino que va a trabajar con bastante facilidad. ¡Esa es la manera de manejar las llaves de WPF!

PK :-)

+0

He leído un poco sobre KeyBinding, pero ¿por qué es mejor que usar keyevents? – Justin

+1

La solución completa es usar junto con ApplicationCommands, etc. Es solo un patrón más ordenado. También puede abstraer comandos, etc. Hay un poco de esto, pero no creo que realmente logre la forma original de trabajar debido a cómo se desencadenan los eventos. –

+1

Consulte http://msdn.microsoft.com/en-us/library/ms752308.aspx para obtener información oficial. También eche un vistazo a http://en.csharp-online.net/WPF_Concepts%E2%80%94Controls_with_Built-In_Command_Bindings - puede ayudar con el "por qué?" :-) –

2

que tiene que hacer un 'bit a bit y' con el ModifierKeys como se muestra a continuación ...

 
    private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     if ((e.Key == Key.P) && ((e.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)) 
     { 
      MessageBox.Show("Thanks!"); 
      e.Handled = true; 
     } 
    } 

Además, no se olvide de establecer la propiedad Handled del parámetro e ...

+0

Accidentalmente utilicé e.Modifiers en mi código de ejemplo en lugar de Keyboard.Modifiers, que es lo que realmente estoy usando en mi aplicación. Me disculpo. No he podido conseguir que tu ejemplo funcione con Keyboard.Modifiers. – Justin

+0

realmente no puedo hacer que funcione? –

0

MSDN nos da este ejemplo:

if(e.Key == Key.P && e.Modifiers == Keys.Alt) 

hace este trabajo para usted?

+0

Según lo dicho por Paul Kohler: "WPF 3.5 KeyEventArgs no tiene propiedad Modifiers" He utilizado erróneamente e.Modifiers en mi código de ejemplo. Me disculpo por la confusión. – Justin

+0

¡Creo que a algunos de nosotros nos dejó atónitos!Pensé que era una pregunta de WinForms al principio :) –

+0

ídem :-) * memo to myself: leer las etiquetas * –

Cuestiones relacionadas