.net - tutorial - wpf vs winforms
¿Cuál es la diferencia entre Keyboard.Focus(elemento) y item.Focus()? (3)
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.
// 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 el momento, no noté ninguna diferencia: cualquiera que sea el método que use, el elemento siempre tiene un enfoque lógico y también un enfoque en el teclado.
Además, es posible que desee saber ese elemento. Foco () es el equivalente a llamar:
DependencyObject focusScope = FocusManager.GetFocusScope(item);
if (FocusManager.GetFocusedElement(focusScope) == null)
{
FocusManager.SetFocusedElement(focusScope, item);
}
Según la documentación de WPF en MSDN :
En WPF hay dos conceptos principales que se relacionan con el enfoque: enfoque del teclado y 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á un enfoque lógico, pero un elemento que tiene un enfoque lógico no necesariamente tiene el foco del teclado.
Una de las primeras cosas que el item.Focus()
hace es llamar a Keyboard.Focus( this )
. Si eso falla, realiza llamadas a FocusManager
, ya que decasteljau ha respondido.
Lo siguiente se copia de la vista del desarmador en Reflector .
Esto es de UIElement
( UIElement3D
es el 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);
}