2009-11-12 10 views
6

je dois faire un focalisable Groupe spécial WPF, afin qu'il capture les événements de clavier comme tout autre contrôle focalisable:Panel Focusable dans WPF

  • L'utilisateur clique à l'intérieur du panneau pour donner le focus
  • tout KeyDown ou d'un événement KeyUp est élevé au niveau du panneau
  • si un autre élément focusable extérieur du panneau est cliqué, le panneau désélectionné

Jeexpérimentésur le Panel et myPanel.Focus() renvoie true mais le gestionnaire d'événements Panel KeyUp n'est toujours pas appelé.

Ai-je raté quelque chose?

Répondre

2

Après plus d'investigation, le panneau a le focus sur le clavier et le garde jusqu'à ce qu'une touche fléchée ou TAB soit enfoncée (ce qui démarre le cycle de mise au point).

Je viens d'ajouter un gestionnaire pour l'événement KeyDown avec `e.Handled = true; ' et maintenant tout fonctionne correctement.

Pour résumer, d'avoir un groupe focalisable:

  • ajouter FocusManager.IsFocusScope="True" au panneau
  • empêchent de perdre l'accent sur les flèches et la touche Tab avec:
myPanel.KeyDown += new KeyEventHandler(
    delegate(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Left || 
      e.Key == Key.Up || 
      e.Key == Key.Right || 
      e.Key == Key.Down || 
      e.Key == Key.Tab) 
      e.Handled = true; 
    } 
); 

Enfin le mettre au point avec myPanel.Focus();.

1

Si votre panneau ne contient aucun élément enfant, même l'utilisation de FocusManager.IsFocusScope="True" ne déclenchera pas l'événement GotFocus. Le panneau n'est pas conçu pour prendre l'entrée ou la mise au point au clavier. Au lieu de cela, la plupart du temps (comme si l'élément enfant est un contrôle Button) FocusManager.IsFocusScope="True" va même jusqu'à manger les événements KeyUp/KeyDown. L'événement ne sera pas déclenché ni pour votre contrôle ni pour votre panel.

+0

C'est ce que j'ai compris, mais la question demeure: de quoi ai-je besoin pour rendre un panneau focalisable? Je souhaite l'étendre (peut-être en le dérivant) pour lui donner cette fonctionnalité. – Mart

+0

Mart, Vous devrez peut-être dériver un panneau de IInputElement? Juste une supposition – Schneider