Подтвердить что ты не робот

В чем разница между Keyboard.Focus(item) и item.Focus()?

В WPF существует два способа установки фокуса на элемент.
Вы можете вызвать метод .Focus() входного элемента или вызвать Keyboard.Focus() с входным элементом в качестве параметра.

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

В чем разница между этими двумя? Существуют ли особые причины использовать один из них вместо другого в некоторых случаях?
До сих пор я не заметил никакой разницы - какой бы метод я ни использовал, элемент всегда получал логический фокус, а также фокус клавиатуры.

4b9b3361

Ответ 1

Одной из первых вещей, которые делает 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);
}

Ответ 2

По Документация WPF на MSDN:

В WPF есть две основные концепции, которые относятся к фокусу: фокус клавиатуры и логический фокус. Фокус клавиатуры относится к элементу, который получает ввод с клавиатуры, а логический фокус относится к элементу в фокусе фокуса, который имеет фокус.

и

Элемент с фокусом клавиатуры также будет иметь логическую фокусировку, но элемент с логической фокусировкой не обязательно имеет фокус клавиатуры.

Ответ 3

Кроме того, вы можете знать, что item.Focus() является эквивалентом вызова:

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