2008-10-13 25 views
14

在WPF中,有两种方法可将焦点设置为元素。
您可以调用input元素的.Focus()方法,也可以使用input元素作为参数调用Keyboard.Focus()。Keyboard.Focus(item)和item.Focus()之间的区别是什么?

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

这两个有什么区别?在某些情况下,是否有特殊的理由使用其中一个而不是另一个?
到目前为止,我注意到没有什么区别 - 我曾经使用过什么方法,该项目总是获得逻辑焦点以及键盘焦点。

回答

23

一个是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); 
} 
5

作为每WPF documentation on MSDN

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

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

+0

因此,这将是更好的使用Keyboard.Focus()?奇怪的是,当我使用item.Focus()时,键盘焦点也一直在物品上。 – Sam 2008-10-13 09:34:32

+0

其他人说的和我一样,只是代码示例(耶!)。不知道为什么这是投票... – Tomalak 2008-10-13 14:42:08

-1

此外,你可能想知道,item.Focus()调用是等价的:

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