2010-02-04 6 views
2

J'ai récemment commencé à utiliser WPF pour développer mes applications. Maintenant j'en suis à un point où j'ai besoin de quelques conseils sur la bonne conception quand il s'agit de la gestion des combinaisons de touches.Bonne conception de gestion des clés

C'est ce que j'utilise au moment:

private void Grid_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (Keyboard.Modifiers == ModifierKeys.Control) 
    { 
     switch (e.Key) 
     { 
      case Key.Up: PreviousLine(); break; 
      case Key.Down: NextLine(); break; 
      case Key.Return: NextLine(); break; 
     } 
    } 
    else if (Keyboard.Modifiers == ModifierKeys.Shift) 
    { 
     switch (e.Key) 
     { 
      case Key.Return: PreviousLine(); break; 
     } 
    } 
} 

Comme vous pouvez l'imaginer, cela va commencer à être vraiment laid, très vite.

Avez-vous des suggestions qui pourraient améliorer le code?

+0

Cela ne résoudra pas votre problème spécifique, mais peut empêcher des problèmes plus tard: vous ne devez définir 'e.Handled = true' que lorsque vous avez traité efficacement l'événement KeyDown. –

+0

Ouais, je sais, c'était juste un test pour voir si ça marcherait. –

Répondre

3

IMVHO Il n'y a rien de trop mauvais avec ce que vous faites, tant qu'il est confiné à la vue.

La seule chose à discuter est de savoir comment lisser les tests des états clés. La façon dont vous structurez cela dépend en grande partie de vos préférences personnelles, tout le monde aura un point de vue légèrement différent. Bien que vous ne voulez pas d'instructions sans fin else if, ou beaucoup d'instructions dupliquées, et vous ne voulez pas que le gestionnaire soit de 1000 lignes.

Qu'en est-ce qui suit:

private void Grid_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    bool shiftPressed = Keyboard.Modifiers == ModifierKeys.Shift; 
    bool ctrlPressed = Keyboard.Modifiers == ModifierKeys.Control; 

    switch (e.Key) 
    { 
     case Key.Up: 
      e.Handled = ctrlPressed ? PreviousLine() : false; 
      break; 
     case Key.Down: 
      e.Handled = ctrlPressed ? NextLine() : false; 
      break; 
     case Key.Return: 
      e.Handled = ctrlPressed ? NextLine() : shiftPressed ? PreviousLine() : false; 
      break; 
    } 
    e.Handled = false; 
} 

J'ai créé les shiftPressed et ctrlPressed bools pour que je puisse éliminer la déclaration if entourant (et tout double emploi qui va avec) et d'utiliser plutôt la déclaration ternaire. Pour que cela fonctionne, vous devrez renvoyer un bool de vos fonctions NextLine() et PreviousLine() - cela peut sembler stupide mais ils ne peuvent pas toujours faire ce qu'ils devraient faire, ie NextLine() peut retourner false si vous êtes sur la rangée du bas la grille.

Questions connexes