2008-10-13 6 views
14

Dans WPF, il y a deux façons de mettre l'accent sur un élément.
Vous pouvez soit appeler la méthode .Focus() de l'élément d'entrée, ou appeler Keyboard.Focus() avec l'élément d'entrée en tant que paramètre.Quelle est la différence entre Keyboard.Focus (point) et item.Focus()?

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

Quelle est la différence entre ces deux? Y a-t-il des raisons spéciales d'utiliser l'un d'entre eux plutôt que l'autre dans certains cas?
Jusqu'à présent, je n'ai remarqué aucune différence - quelle que soit la méthode que j'ai utilisée, l'élément a toujours eu la mise au point logique ainsi que la mise au point du clavier.

Répondre

23

L'une des premières choses que item.Focus() ne fait qu'appeler Keyboard.Focus(this). Si cela échoue, il fait appel à FocusManager, comme decasteljau a répondu.

Les éléments suivants sont copiés de la vue disassambler en Reflector.

Ceci est de UIElement (UIElement3D est le même):

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

Ceci est de ContentElement:

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

Comme par WPF documentation on MSDN:

En WPF, il y a deux principaux concepts qui se rapportent à se concentrer: focus clavier et focus logique. Le focus sur le clavier fait référence à l'élément qui reçoit une entrée au clavier et le focus logique à l'élément dans une portée de mise au point qui a le focus.

et

Un élément qui a le focus du clavier sera également mise au point logique, mais un élément qui a le focus logique ne doit pas nécessairement le focus du clavier.

+0

Il serait donc préférable d'utiliser Keyboard.Focus()? Étrange, cependant, quand j'utilisais item.Focus(), le focus du clavier avait toujours été sur l'objet aussi. – Sam

+0

Les autres ont dit à peu près la même chose que moi, juste avec des exemples de code (youpi!). Je ne sais pas pourquoi cela a été voté ... – Tomalak

+0

Je ne comprends pas le downvote non plus. La différence entre la logique et le clavier est une bonne information. –

-1

En outre, vous voudrez peut-être savoir que item.Focus() est l'équivalent d'appeler:

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

'setFocusedElement' ne définit que le focus logique. 'Focus()' peut faire à la fois le clavier et la logique – EricG

Questions connexes