2010-01-20 6 views
14

aplicación My WPF tiene un comportamiento provocada por las teclas de función (F1 - F12).La detección de la presión de usuario F10 en WPF

Mi código es a lo largo de estas líneas:

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    switch (e.Key) 
    { 
     case Key.F1: 
     ... 
     case Key.F2: 
     ... 
    } 
} 

Esto funciona para todas las teclas de función, excepto F10. La depuración, me parece que e.Key == Key.System cuando el usuario presiona F10.

En la definición de enum, F10 = 99 y System = 156, por lo que puedo descartar que sea un valor de enum duplicado (como PageDown = Next = 20).

Entonces, ¿cómo puedo saber cuándo el usuario presiona F10?

¿Es seguro buscar Key.System en su lugar? Esto se siente un poco sucio, ¿podría ser posible que Key.System alguna vez fuera el resultado de alguna otra tecla presionada? ¿O hay algún ajuste en algún lugar que hará que F10 informe como Key.F10?

Respuesta

15

Además de la respuesta de Yacoder, utilice el siguiente para comprobar si la tecla F10 :

case Key.System: 
    if (e.SystemKey == Key.F10) 
    { 
    // logic... 
    } 

La propiedad SystemKey le dirá qué tecla se presionó sistema.

+0

Eso está bien. Me parece que también tengo que establecer 'e.Handled = true' cuando' e.Key == Key.System', para asegurar que el foco no quede a la izquierda en la caja de control. (La casilla de control es invisible en mi aplicación porque estoy usando 'WindowStyle = None', lo que hace que el comportamiento predeterminado de F10 sea aún más confuso para el usuario.) Además,' e.Key == Key.System' cuando el usuario presiona la tecla Alt también, y tal vez en algunos otros casos, por lo que 'e.SystemKey' es definitivamente el camino a seguir en lugar de solo suponer que es F10. ¡Gracias! – teedyay

1

respuesta con DataContext:

 


    public partial class BankView : UserControl 
    { 
     public BankView() 
     { 
      InitializeComponent(); 

      this.KeyDown += new KeyEventHandler(BankView_KeyDown); 
     } 

     private void BankView_KeyDown(object sender, KeyEventArgs e) 
     { 
      try 
      { 
       switch (e.Key) 
       { 
        case Key.F4: 
         ((BankViewModel)DataContext).OpenAccount(); 
         break; 
       } 
      } 
      catch (Exception ex) 
      { 
       ... 
      } 
     } 

-1

Esto funcionó para mí, por F1

Private Sub Window_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 
    If (e.Key = Key.F1) Then 
     ShowHelp() 
    End If 
End Sub 
Cuestiones relacionadas