键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )

键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )post

1.定义
Keyboard Focus能够理解为物理焦点。就是整个桌面上能够响应键盘输入的地方,整个桌面在某个时刻只可能有一个地方能接受键盘的输入,所以整个桌面在某个时刻只可能有一个Keyboard Focus.spa

Logic Focus从字面上理解是逻辑焦点。通常带“逻辑”字眼的东西都有多是“虚”的,在这里也不例外。
Logic Focus并非真正的焦点。它只是在桌面上某个范围内,在该范围未得到物理焦点以前,该范围默认的在该范围以内的“焦点”,当该范围得到物理焦点时,会首先将物理焦点分配给逻辑焦点所在的地方。这个“范围”称做Focus Scope.  在WPF中默认被设置成的Focus Scope有 Window, MenuItem, ToolBar, and ContextMenu。也能够手动设置某个控件成为Focus Scope(经过设置FocusManager.IsFocusScope附加属性或调用FocusManager.SetFocusScope方法)。和Keyboard Focus对应,每个Focus Scope内只有一个Logic Focus.对象

综上所述Keyboard Focus与Logic Focus不是任什么时候候都相等,Keyboard Focus只和同一个Focus Scope内的Logic Focus相等。理论上Logic Focus好像并无什么实际意义。
2.API
WPF中提供Keyboard类和FocusManager类来分别管理Keyboard Focus和Logic Focus.经过这个两个类能够Set和Get相应类型的Focus(FocusManager还能够Set和Get Focus Scope)以及提供相应类型Event.
3. Focus的改变
1)用户的操做会改变Keyboard Focus,同时也会改变同一个Focus Scope内的Logic Focus。
2)经过Keyboard和FocusManager中提供的API能够改变相应类型的Focus。
3)经过控件的Focus方法能够改变Focus Scope内的Logic Focus,若是Keyboard Focus也在此Focus Scope中则同时也会改变Keyboard Focus.
4)经过控件的MoveFocus方法能够改变Keyboard Focus(调用该方法时须要传递一个TraversalRequest来指示移动的方向,TraversalRequest中包含指示移动方向的FocusNavigationDirection 枚举对象)blog

在WPF中,有两种焦点:键盘焦点和逻辑焦点。get

若是一个控件得到了键盘焦点,那么该控件就是当前能够得到键盘输入的控件。每一个程序只能有一个控件能得到键盘焦点。io

若是一个控件得到了逻辑焦点,那么说明该控件得到了当前焦点域(focus scope )内的逻辑焦点。WPF会记录一组或多组控件,每一个组被看作是一个焦点域(focus scope )。在每一个焦点域内只有一个控件能够得到逻辑焦点。逻辑焦点帮助WPF记住每一个组中上一次得到焦点的控件,并在这个组从新变为得到焦点的时候,将键盘焦点返回给组中合适的控件。class

得到键盘焦点的控件必定得到了逻辑焦点,得到了逻辑焦点的控件不必定得到了键盘焦点。sed

关于焦点域(focus scope )能够举个例子:好比一个Panel里面有若干个CheckBox,这些CheckBox能够认为构成了一个焦点域,当鼠标选中某个CheckBox的时候,这个CheckBox得到了键盘焦点和逻辑焦点。当鼠标移出这个Panel而且选中了外面的某个能够得到键盘焦点的控件的时候,以前得到键盘焦点的CheckBox就失去了键盘焦点,可是仍然保留着逻辑焦点。能够理解为WPF记住了这个组中,上一次得到键盘焦点的是这个CheckBox。若是再次将鼠标移动到Panel里面,并使Panel得到焦点(不点击任何CheckBox),那么这个时候当前组中得到逻辑焦点的CheckBox会再次得到键盘输入焦点。命名空间

你可使用Keyboard.Focus 静态方法设置控件得到键盘焦点,使用FocusManager.SetFocusedElement 静态方法使控件得到逻辑焦点。(System.Windows.Input 命名空间中)rsa

固然,你也可使用控件自身(UIElement )的Focus 方法给控件自身设置焦点。它和Keyboard.Focus 静态方法的区别是:Keyboard.Focus 静态方法仅仅只设置键盘焦点。而UIElementFocus 方法会尝试将键盘焦点设置给控件,若是控件获取键盘焦点失败,则将逻辑焦点设置给控件。

注:原文地址https://wpf.2000things.com/2011/05/27/309-keyboard-focus-vs-logical-focus/

相关文章
相关标签/搜索