2010-01-20 4 views
14

l'application Mon WPF a un comportement déclenché par les touches de fonctions (F1 - F12).l'utilisateur Détection appuyant sur F10 dans WPF

Mon code est le long de ces lignes:

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

Cela fonctionne pour toutes les touches F, sauf F10. Débogage, je trouve que e.Key == Key.System lorsque l'utilisateur appuie sur F10.

Dans la définition enum, F10 = 99 et System = 156, je peux donc exclure qu'il s'agisse d'une valeur enum dupliquée (comme PageDown = Next = 20). Ainsi, comment savoir quand l'utilisateur appuie sur F10?

Est-il sûr de vérifier Key.System à la place? Cela semble un peu sale - est-il possible que Key.System résulterait d'une autre touche pressée? Ou y a-t-il un réglage quelque part qui fera F10 comme Key.F10?

Répondre

15

En plus de la réponse Yacoder, utilisez les touches suivantes pour vérifier la F10 clé:

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

La propriété SystemKey vous dira quelle touche système a été pressé.

+0

C'est cool. Je trouve que je dois aussi mettre 'e.Handled = true' quand' e.Key == Key.System', pour s'assurer que le focus ne reste pas sur le contrôle. (La boîte de contrôle est invisible dans mon application car j'utilise 'WindowStyle = None', ce qui rend le comportement F10 par défaut encore plus déroutant pour l'utilisateur.) Aussi,' e.Key == Key.System' quand l'utilisateur appuie sur la touche Alt aussi - et peut-être dans d'autres cas - donc 'e.SystemKey' est définitivement la solution, au lieu de supposer que c'est F10. Merci! – teedyay

1

Réponse avec 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

Cela a fonctionné pour moi, pour 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 
Questions connexes