代码之家  ›  专栏  ›  技术社区  ›  Sam

keyboard.focus(item)和item.focus()有什么区别?

  •  15
  • Sam  · 技术社区  · 16 年前

    在WPF中,有两种方法可以将焦点设置为元素。
    可以调用输入元素的.focus()方法,也可以使用输入元素作为参数调用keyboard.focus()。

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

    这两者有什么区别?在某些情况下,是否有特殊的理由使用其中一个而不是另一个?
    到目前为止,我没有注意到任何区别——无论我使用什么方法,这个项目总是得到逻辑焦点和键盘焦点。

    3 回复  |  直到 14 年前
        1
  •  24
  •   Joel B Fant    14 年前

    第一件事就是 item.Focus() 是呼叫 Keyboard.Focus( this ) . 如果失败了,它会打电话给 FocusManager 正如德克斯特劳所回答的。

    以下内容从中的Disassembler视图复制 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
  •  5
  •   Tomalak    16 年前

    按照 WPF documentation on MSDN :

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

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

        3
  •  -1
  •   decasteljau    16 年前

    另外,您可能希望知道item.focus()等同于调用:

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