2013-08-09 8 views
10

Was ist der Unterschied (s) zwischen GotFocus und GotKeyboardFocus -und ähnlich LostFocus und LostKeyboardFocus?Der Unterschied zwischen GotFocus und GotKeyboardFocus

Sorry für die einfache Frage, aber ich habe es gegooglet und viele Blogposts gelesen, aber ich bin immer noch verwirrt. Es scheint, niemand weiß genau, was der Unterschied ist):

UPDATE:

Meine Nutzung:

Ich erstelle eine benutzerdefinierte Steuerung durch Control-Klasse erweitern. Etwas wie ComboBox aber mit einigen anderen Effekten. Ich versuche, eine Popup zu öffnen und zu schließen, indem Sie eine Eigenschaft festlegen: IsDropDownOpen genau wie eine ComboBox durch die GotFocus und LostFocus Ereignisse. Ich will nicht Popup werden geschlossen, wenn ich die Alt+Tab ed die Fenster, aber werde geschlossen, wenn ich auf eine Button zum Beispiel klicke oder ich gehe zu einem TextBox. Ich tat:

private static void OnGotFocusHandler(object sender, RoutedEventArgs e) { 
    if (e.Handled) 
     return; 
    ((SearchBox)sender).IsDropDownOpen = true; 
    e.Handled = true; 
} 

private static void OnLostFocusHandler(object sender, RoutedEventArgs e) { 
    if (e.Handled) 
     return; 
    ((SearchBox)sender).IsDropDownOpen = false; 
    e.Handled = true; 
} 

Die GotFocus funktioniert. Aber die Lost hat man nicht. Wenn ich die Lost Sachen in LostKeyboardFocus dann wenn ich Alt+Tab die Windows oder Window geht inaktiv, dann wird die Methode aufgerufen, während ich nicht will. Wie kann ich es lösen?

Antwort

12

MSDN hat einen Überblick über den Fokus, aber ich werde versuchen, es hier zu erklären.

WPF hat 2 Konzepte in Bezug auf den Fokus. Es gibt den physischen Tastaturfokus und es gibt einen logischen Fokus. Nur ein Element kann den Tastaturfokus haben (und wenn die Anwendung nicht die aktive Anwendung ist, hat kein Element den Tastaturfokus).

Mehrere Objekte können logischen Fokus haben. Tatsächlich können Sie neue "Fokusbereiche" erstellen. Nach MSDN:

Wenn der Tastaturfokus einen Fokusbereich verlässt, verliert das fokussierte Element den Tastaturfokus, behält jedoch den logischen Fokus bei. Wenn der Tastaturfokus zum Fokusbereich zurückkehrt, erhält das fokussierte Element den Tastaturfokus. Dies ermöglicht das Ändern des Tastaturfokus zwischen mehreren Fokusbereichen, stellt jedoch sicher, dass das fokussierte Element im Fokusbereich den Tastaturfokus wiedererlangt, wenn der Fokus zum Fokusbereich zurückkehrt.

Sie können Ihren eigenen Fokusbereich auf ein Element (in der Regel ein Panel), indem FocusManager.IsFocusScope="True" definieren. Die Steuerelemente in WPF, die standardmäßig Fokusbereiche sind, sind Window, MenuItem, ToolBar und ContextMenu.

Dies ist sinnvoll, wenn Sie daran denken, mehrere Window s in Ihrer Anwendung zu haben. Wenn Sie zwischen ihnen Alt-Tab sind, erwarten Sie, dass Ihr Tastaturfokus an den gleichen Ort zurückkehrt, an dem sich der Window zuletzt befand. Indem Sie Tastaturfokus und logischen Fokus getrennt halten, können Sie dies erreichen.

+1

+1 danke, gute Erklärung. eigentlich besser als MSDNs. Danke vielmals. Ich warte eine Weile auf weitere Antworten und akzeptiere dann - wenn kein besserer erhalten wird - deine. –

+0

Nun, ich versuche ein 'Popup' zu öffnen (in einem benutzerdefinierten Steuerelement geerbt von' Control' Klasse), indem Sie eine 'IsDropDownOpen'-Eigenschaft festlegen.Ich setze es in "GotFocus" auf "wahr", es funktioniert. Ich möchte es auf 'false' im' LostFocus' Event setzen. Aber es funktioniert nicht. Ich möchte es nicht in 'LostKeyboardFocus', sondern in' LostFocus' machen. Irgendeine Idee bitte? –

+0

Ich denke, dass Sie eine neue Frage mit einigen Codebeispielen erstellen müssen. Ich kann Ihr Szenario nicht anhand dieser kurzen Beschreibung debuggen. –