2008-10-13 9 views
14

En WPF, hay dos formas de establecer el foco en un elemento.
Puede llamar al método .Focus() del elemento de entrada o llamar a Keyboard.Focus() con el elemento de entrada como parámetro.¿Cuál es la diferencia entre Keyboard.Focus (elemento) y item.Focus()?

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

¿Cuál es la diferencia entre estos dos? ¿Hay razones especiales para usar uno de ellos en lugar del otro en algunos casos?
Hasta ahora no he notado ninguna diferencia: cualquiera que sea el método que he usado, el elemento siempre tiene un enfoque lógico así como el foco del teclado.

Respuesta

23

Una de las primeras cosas que hace es item.Focus() llamada Keyboard.Focus(this). Si eso falla, entonces realiza llamadas al FocusManager, ya que decasteljau ha respondido.

Los siguientes se copian de la vista de disassambler en Reflector.

Esto es de UIElement (UIElement3D es lo mismo):

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

Esto es de ContentElement:

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

Según WPF documentation on MSDN:

En WPF hay dos conceptos principales que se refieren a concentrarse: el foco del teclado y de enfoque lógico. El enfoque del teclado se refiere al elemento que recibe la entrada del teclado y el enfoque lógico se refiere al elemento en un ámbito de enfoque que tiene enfoque.

y

Un elemento que tiene el foco del teclado también tendrá el foco lógico, sino un elemento que tiene el foco lógico no necesariamente tiene el foco del teclado.

+0

por lo que sería mejor usar Keyboard.Focus()? Extraño, sin embargo, cuando usé item.Focus() el foco del teclado siempre había estado en el ítem, también. – Sam

+0

Los otros dijeron más o menos lo mismo que yo, solo con muestras de código (¡yay!). No sé por qué esto no fue votado ... – Tomalak

+0

No recibo el voto en baja, tampoco. La diferencia entre el enfoque lógico y el del teclado es buena información. –

-1

Además, es posible que desee saber que item.Focus() es el equivalente a llamar:

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

'setFocusedElement' solo está configurando el enfoque lógico. 'Focus()' puede hacer tanto el teclado como la lógica – EricG

Cuestiones relacionadas