2009-11-12 13 views
6

Ich brauche ein Gremium fokussierbare in WPF zu machen, so dass es Tastaturereignisse erfasst wie jede andere fokussierbarem Kontrolle:Fokussierbare-Panel in WPF

  • klickt der Benutzer innerhalb des Panel durch
  • zu geben, konzentrieren alle KeyDown oder KeyUp Ereignis wird auf Panel-Ebene angehoben
  • , wenn ein anderes fokussierbare Element außerhalb der Platte angeklickt wird, verliert das Panel

ich experimentiertekonzentrierenauf dem Panel und myPanel.Focus() gibt true zurück, aber der Ereignishandler Panel KeyUp wird noch nicht aufgerufen.

Fehle ich etwas?

Antwort

2

Nach weiteren Untersuchungen hat das Panel den Fokus der Tastatur und behält es bei, bis eine Pfeiltaste oder TAB gedrückt wird (wodurch der Fokuszyklus beginnt).

Ich habe gerade einen Handler für das Ereignis KeyDown mit `e.Handled = true; ' und jetzt funktioniert alles richtig.

Um es zusammenzufassen, einen fokussierbarem Panel hat:

  • hinzufügen FocusManager.IsFocusScope="True" zum Panel
  • auf Pfeile zu verlieren Fokus verhindern und Tab-Taste mit:
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; 
    } 
); 

Schließlich geben Sie den Fokus mit myPanel.Focus();.

1

Wenn Ihre Anzeige keine untergeordneten Elemente enthält, wird auch bei Verwendung von FocusManager.IsFocusScope="True" das GotFocus-Ereignis nicht ausgelöst. Das Bedienfeld ist nicht für Tastatureingabe oder -fokussierung ausgelegt. Stattdessen wird die meiste Zeit (wie wenn das untergeordnete Element ein Button-Steuerelement ist) FocusManager.IsFocusScope="True" sogar die KeyUp/KeyDown-Ereignisse auffressen. Das Ereignis wird weder für Ihre Kontrolle noch für Ihr Panel ausgelöst.

+0

Das habe ich verstanden, aber die Frage bleibt: Was brauche ich, um ein Panel fokussierbar zu machen? Ich möchte es erweitern (vielleicht, indem ich es ableite), um dieses Merkmal zu geben. – Mart

+0

Mart, müssen Sie möglicherweise ein Panel von IInputElement ableiten? Nur eine Vermutung – Schneider