什么是Keyboard.Focus(item)和item.Focus()之间的区别?

时间:2008-10-13 09:25:13

标签: .net wpf

在WPF中,有两种方法可以将焦点设置为元素 您可以调用input元素的.Focus()方法,也可以使用input元素作为参数调用Keyboard.Focus()。

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

这两者有什么区别?在某些情况下,是否有特殊原因使用其中一个而不是另一个? 到目前为止,我注意到没有区别 - 无论使用哪种方法,该项目始终具有逻辑焦点以及键盘焦点。

3 个答案:

答案 0 :(得分:24)

item.Focus()所做的第一件事就是致电Keyboard.Focus( this )。如果失败,则会调用FocusManager,因为decasteljau已经回答了。

以下内容是从Reflector中的disassambler视图中复制的。

这来自UIElementUIElement3D是相同的):

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);
}

答案 1 :(得分:6)

根据WPF documentation on MSDN

  

在WPF中,焦点有两个主要概念:键盘焦点和逻辑焦点。键盘焦点是指接收键盘输入的元素,而逻辑焦点是指具有焦点的焦点范围中的元素。

  

具有键盘焦点的元素也将具有逻辑焦点,但具有逻辑焦点的元素不一定具有键盘焦点。

答案 2 :(得分:0)

此外,您可能想知道item.Focus()等同于调用:

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