В чем разница между Keyboard.Focus(item) и item.Focus()?
В WPF есть два способа установить фокус на элемент.
Вы можете либо вызвать метод.Focus() элемента input, либо вызвать Keyboard.Focus() с элементом input в качестве параметра.
// first way:
item.Focus();
// alternate way:
Keyboard.Focus(item);
В чем разница между этими двумя? Существуют ли особые причины для использования одного из них вместо другого в некоторых случаях?
До сих пор я не заметил никакой разницы - какой бы метод я ни использовал, предмет всегда получал логический фокус, а также фокус клавиатуры.
3 ответа
Одна из первых вещей, которые item.Focus()
делает это вызов Keyboard.Focus( this )
, Если это не удается, то он звонит FocusManager
, как ответил Декастеляу.
Следующее скопировано из вида дизассемблера в Reflector.
Это из UIElement
(UIElement3D
та же):
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;
}
Это из ContentElement
:
public bool Focus()
{
return (Keyboard.Focus(this) == this);
}
Согласно документации WPF на MSDN:
В WPF есть две основные концепции, которые относятся к фокусу: клавиатурный фокус и логический фокус. Фокус клавиатуры относится к элементу, который получает ввод с клавиатуры, а логический фокус относится к элементу в области фокусировки, которая имеет фокус.
а также
Элемент с фокусом клавиатуры также будет иметь логический фокус, но элемент с логическим фокусом не обязательно должен иметь фокус клавиатуры.
Кроме того, вы можете знать, что item.Focus() является эквивалентом вызова:
DependencyObject focusScope = FocusManager.GetFocusScope(item);
if (FocusManager.GetFocusedElement(focusScope) == null)
{
FocusManager.SetFocusedElement(focusScope, item);
}