在WPF中,有两种方法可以将焦点设置为元素 您可以调用input元素的.Focus()方法,也可以使用input元素作为参数调用Keyboard.Focus()。
// first way:
item.Focus();
// alternate way:
Keyboard.Focus(item);
这两者有什么区别?在某些情况下,是否有特殊原因使用其中一个而不是另一个? 到目前为止,我注意到没有区别 - 无论使用哪种方法,该项目始终具有逻辑焦点以及键盘焦点。
答案 0 :(得分:24)
item.Focus()
所做的第一件事就是致电Keyboard.Focus( this )
。如果失败,则会调用FocusManager
,因为decasteljau已经回答了。
以下内容是从Reflector中的disassambler视图中复制的。
这来自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);
}
答案 1 :(得分:6)
在WPF中,焦点有两个主要概念:键盘焦点和逻辑焦点。键盘焦点是指接收键盘输入的元素,而逻辑焦点是指具有焦点的焦点范围中的元素。
和
具有键盘焦点的元素也将具有逻辑焦点,但具有逻辑焦点的元素不一定具有键盘焦点。
答案 2 :(得分:0)
此外,您可能想知道item.Focus()等同于调用:
DependencyObject focusScope = FocusManager.GetFocusScope(item);
if (FocusManager.GetFocusedElement(focusScope) == null)
{
FocusManager.SetFocusedElement(focusScope, item);
}