2008-10-13 4 views
14

In WPF gibt es zwei Möglichkeiten, den Fokus auf ein Element zu setzen.
Sie können entweder die Methode .Focus() des Eingabeelements aufrufen oder Keyboard.Focus() mit dem Eingabeelement als Parameter aufrufen.Was ist der Unterschied zwischen Keyboard.Focus (Element) und item.Focus()?

// first way: 
item.Focus(); 
// alternate way: 
Keyboard.Focus(item); 

Was ist der Unterschied zwischen diesen beiden? Gibt es besondere Gründe, einen von ihnen anstelle des anderen zu verwenden?
Bis jetzt habe ich keinen Unterschied bemerkt - was auch immer ich verwendete, das Objekt bekam immer einen logischen Fokus sowie einen Tastaturfokus.

Antwort

23

Eines der ersten Dinge, die item.Focus() tut, ist Aufruf Keyboard.Focus(this). Wenn das fehlschlägt, dann ruft es an FocusManager, wie decasteljau beantwortet hat.

Folgendes wird aus der Disassamblersicht in Reflector kopiert.

Dies ist von UIElement (UIElement3D gleich ist):

public bool Focus() 
{ 
    if (Keyboard.Focus(this) == this) 
    { 
     return true; 
    } 
    if (this.Focusable && this.IsEnabled) 
    { 
     DependencyObject focusScope = FocusManager.GetFocusScope(this); 
     if (FocusManager.GetFocusedElement(focusScope) == null) 
     { 
      FocusManager.SetFocusedElement(focusScope, this); 
     } 
    } 
    return false; 
} 

Dies ist von ContentElement:

public bool Focus() 
{ 
    return (Keyboard.Focus(this) == this); 
} 
5

Per WPF documentation on MSDN:

In WPF gibt es zwei Hauptkonzepte, die konzentrieren beziehen sich auf: Tastaturfokus und den logischen Fokus. Der Tastaturfokus bezieht sich auf das Element, das die Tastatureingabe empfängt, und der logische Fokus bezieht sich auf das Element in einem Fokusbereich, der den Fokus hat.

und

Ein Element, das den Tastaturfokus hat auch den logischen Fokus haben, sondern ein Element, das den logischen Fokus hat nicht unbedingt den Tastaturfokus haben.

+0

So wäre es besser, Keyboard.Focus() verwenden? Seltsam aber, wenn ich item.Focus() benutzte, war der Tastaturfokus immer auch auf dem Gegenstand. – Sam

+0

Die anderen sagten ziemlich genau dasselbe wie ich, nur mit Codebeispielen (yay!). Weiß nicht, warum das hier abgelehnt wurde ... – Tomalak

+0

Ich bekomme den Downvote auch nicht. Der Unterschied zwischen logischem und Tastaturfokus ist eine gute Information. –

-1

Auch können Sie wollen wissen, dass item.Focus() ist das Äquivalent des Aufrufs:

DependencyObject focusScope = FocusManager.GetFocusScope(item); 
if (FocusManager.GetFocusedElement(focusScope) == null) 
{ 
    FocusManager.SetFocusedElement(focusScope, item); 
} 
+0

'setFocusedElement' setzt nur den logischen Fokus. 'Focus()' kann sowohl Tastatur- als auch logische Funktionen ausführen – EricG

Verwandte Themen