2008-10-13 10 views
14

W WPF istnieją dwa sposoby ustawiania fokusu na element.
Możesz wywołać metodę .Focus() elementu wejściowego lub wywołać funkcję Keyboard.Focus() z elementem wejściowym jako parametrem.Jaka jest różnica między Keyboard.Focus (pozycja) i item.Focus()?

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

Jaka jest różnica między tymi dwoma? Czy istnieją szczególne powody, aby w niektórych przypadkach użyć jednego z nich zamiast drugiego?
Do tej pory nie zauważyłem żadnej różnicy - jakąkolwiek metodę użyłem, przedmiot zawsze ma logiczne skupienie, a także ostrość klawiatury.

Odpowiedz

23

Jedną z pierwszych rzeczy, które item.Focus() robi to wezwanie Keyboard.Focus(this). Jeśli to się nie powiedzie, to będzie dzwonił pod numer FocusManager, na co decasteljau odpowiedział.

Następujące elementy są kopiowane z widoku disassambler w Reflector.

To z UIElement (UIElement3D jest taka sama):

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; 
} 

To z ContentElement:

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

Zgodnie WPF documentation on MSDN:

W WPF istnieją dwie główne koncepcje, które odnoszą się skupić: skupić się klawiatura i logiczne ostrości. Ostrość klawiatury odnosi się do elementu odbierającego dane z klawiatury, a fokus logiczny odnosi się do elementu w zasięgu ogniskowania, na którym ustawiono ostrość.

i

Element, który ma klawiaturę będzie również logiczne ostrości, ale to element, który ma logiczną ostrość niekoniecznie ma klawiaturę.

+0

Tak byłoby lepiej użyć Keyboard.Focus()? Dziwne jednak, gdy użyłem item.Focus() ostrość klawiatury zawsze była na przedmiocie. – Sam

+0

Inni mówili prawie tak samo jak ja, tylko z próbkami kodu (yay!). Nie wiem, czemu to było nieważne ... – Tomalak

+0

Ja też nie rozumiem. Różnica między ogniskiem logicznym i klawiaturowym to dobra informacja. –

-1

Ponadto, warto wiedzieć, że item.Focus() jest równoważne wywołaniu:

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

'setFocusedElement' ustawia tylko ostrość logiczną. 'Focus()' może wykonywać klawiaturę i logikę – EricG

Powiązane problemy