В WPF есть два способа установить фокус на элемент. Вы можете вызвать метод .Focus () элемента ввода или вызвать Keyboard.Focus () с элементом ввода в качестве параметра.
// first way:
item.Focus();
// alternate way:
Keyboard.Focus(item);
В чем разница между этими двумя? Есть ли особые причины использовать один из них вместо другого в некоторых случаях?
Пока я не заметил никакой разницы - какой бы метод я ни использовал, элемент всегда имел логический фокус, а также фокус клавиатуры.





Согласно Документация WPF в MSDN:
In WPF there are two main concepts that pertain to focus: keyboard focus and logical focus. Keyboard focus refers to the element that receives keyboard input and logical focus refers to the element in a focus scope that has focus.
и
An element that has keyboard focus will also have logical focus, but an element that has logical focus does not necessarily have keyboard focus.
Остальные сказали примерно то же самое, что и я, только с примерами кода (ура!). Не знаю, почему это было отклонено ...
Я тоже не получил голоса против. Разница между логическим фокусом и фокусом клавиатуры - хорошая информация.
Кроме того, вы можете узнать, что item.Focus () эквивалентен вызову:
DependencyObject focusScope = FocusManager.GetFocusScope(item);
if (FocusManager.GetFocusedElement(focusScope) == null)
{
FocusManager.SetFocusedElement(focusScope, item);
}
setFocusedElement только устанавливает логический фокус. Focus() может работать как с клавиатурой, так и с логической
Одно из первых действий, которые выполняет item.Focus(), - это вызов Keyboard.Focus( this ). Если это не удается, он обращается к FocusManager, поскольку decasteljau ответил.
Следующее скопировано из представления дизассамблера в Отражатель.
Это от 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);
}
Так что лучше было бы использовать Keyboard.Focus ()? Как ни странно, когда я использовал item.Focus (), фокус клавиатуры всегда был на элементе.