В чем разница между Keyboard.Focus (item) и item.Focus ()? - PullRequest
15 голосов
/ 13 октября 2008

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

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

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

Ответы [ 3 ]

24 голосов
/ 13 октября 2008

Первое, что делает item.Focus(), это звонить Keyboard.Focus( this ). Если это не удается, то он звонит на FocusManager, как ответил декастель.

Следующее скопировано из вида дизассемблера в Отражатель .

Это от 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);
}
6 голосов
/ 13 октября 2008

Согласно документации WPF на MSDN :

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

и

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

0 голосов
/ 13 октября 2008

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

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