键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )
键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )
1.定义
Keyboard Focus可以理解为物理焦点。就是整个桌面上可以响应键盘输入的地方,整个桌面在某个时刻只可能有一个地方能接受键盘的输入,因此整个桌面在某个时刻只可能有一个Keyboard Focus.
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 枚举对象)
在WPF中,有两种焦点:键盘焦点和逻辑焦点。
如果一个控件获得了键盘焦点,那么该控件就是当前可以获得键盘输入的控件。每个程序只能有一个控件能获得键盘焦点。
如果一个控件获得了逻辑焦点,那么说明该控件获得了当前焦点域(focus scope )内的逻辑焦点。WPF会记录一组或多组控件,每个组被看做是一个焦点域(focus scope )。在每个焦点域内只有一个控件可以获得逻辑焦点。逻辑焦点帮助WPF记住每个组中上一次获得焦点的控件,并在这个组重新变为获得焦点的时候,将键盘焦点返回给组中合适的控件。
获得键盘焦点的控件一定获得了逻辑焦点,获得了逻辑焦点的控件不一定获得了键盘焦点。
关于焦点域(focus scope )可以举个例子:比如一个Panel里面有若干个CheckBox,这些CheckBox可以认为构成了一个焦点域,当鼠标选中某个CheckBox的时候,这个CheckBox获得了键盘焦点和逻辑焦点。当鼠标移出这个Panel并且选中了外面的某个可以获得键盘焦点的控件的时候,之前获得键盘焦点的CheckBox就失去了键盘焦点,但是仍然保留着逻辑焦点。可以理解为WPF记住了这个组中,上一次获得键盘焦点的是这个CheckBox。如果再次将鼠标移动到Panel里面,并使Panel获得焦点(不点击任何CheckBox),那么这个时候当前组中获得逻辑焦点的CheckBox会再次获得键盘输入焦点。
你可以使用Keyboard.Focus 静态方法设置控件获得键盘焦点,使用FocusManager.SetFocusedElement 静态方法使控件获得逻辑焦点。(System.Windows.Input 命名空间中)
当然,你也可以使用控件自身(UIElement )的Focus 方法给控件自身设置焦点。它和Keyboard.Focus 静态方法的区别是:Keyboard.Focus 静态方法仅仅只设置键盘焦点。而UIElement 的Focus 方法会尝试将键盘焦点设置给控件,如果控件获取键盘焦点失败,则将逻辑焦点设置给控件。
注:原文地址:https://wpf.2000things.com/2011/05/27/309-keyboard-focus-vs-logical-focus/
键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )的更多相关文章
- PyQt(Python+Qt)学习随笔:键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 Qt中的焦点有键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )的区分,键 ...
- Android中软键盘展示、EditText焦点获取及windowSoftInputMode属性探究
2017-08-14 21:44:23 有很多中情况,分别展示. 1.Activity不做任何设置,布局使用LinearLayout 会自动滚动EditText之上的所有View,代码: <?x ...
- PyQt4控件失去焦点和获得焦点
#QListView控件多选设置self.ui.listView.setSelectionMode(QAbstractItemView.ExtendedSelection) #初始化QListView ...
- (三)在js(jquery)中获得文本框焦点和失去焦点的方法
在js(jquery)中获得文本框焦点和失去焦点的方法 文章介绍两个方法和种是利用javascript onFocus onBlur来判断焦点和失去焦点,加一种是利用jquery $(" ...
- easyUI文本框获得焦点,失去焦点
easyUI帮助文档对于文本框的操作没有提供直接获得焦点,或者失去焦点的方法,我们可以采用以下写法来实现. 获得焦点: $('input',$('#文本框Id').next('span')).focu ...
- jquery得到焦点和失去焦点
鼠标在搜索框中点击的时候里面的文字就消失了,经常会用到搜索框的获得焦点和失去焦点的事件,接下来介绍一下具体代码,感兴趣的朋友额可以参考下 input失去焦点和获得焦点 鼠标在搜索框中点击的时候里面 ...
- How to remove focus without setting focus to another control?
How to remove focus without setting focus to another control? Ask Question up vote 67 down vote favo ...
- apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard
apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard 想在苹果电脑 mac 系统下使用 机械键盘,大部分机械键盘不是为mac设计的,所 ...
- Qt中的键盘事件,以及焦点的设置(比较详细)
Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效.下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件.有输入焦点的窗口是活动窗口 ...
随机推荐
- BZOJ 3925 ZJOI2015 地震后的幻想乡 状压dp+期望
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3925 题意概述: 给出一张N点M边的最小生成树,其中每条边的长度为[0,1]的实数,求最小 ...
- POJ 2082 Terrible Sets(栈)
Description Let N be the set of all natural numbers {0 , 1 , 2 , . . . }, and R be the set of all re ...
- java rmi浅谈
首先比较下RPC和RMI的差别: 首先java提供了RMI的api,jdk1.5之后虚拟机自动生成两个类:存根类stub和骨架类skelton. stub是给客户端的,当客户端调用远程对象的一个方法时 ...
- 【Python】Python内置函数dir详解
1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: 复制代码代码如下: >>> help(dir)Help on built-in function ...
- 在浏览器中从FTP下载文件
public static class FTPHelper { /// <summary> /// 得到特定FTP目录的文件列表 /// </summary> /// < ...
- c++ map 和 unordered_map的区别
unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value.不同的是unordered_map不会根据key的大小进行排序, 存储时是根据key的ha ...
- regex & form validation & phone
regex & form validation https://regexper.com/ https://gitlab.com/javallone/regexper-static https ...
- hihocoder 1457(后缀自动机+拓扑排序)
题意 给定若干组由数字构成的字符串,求所有不重复子串的和(把他们看成十进制),答案mod(1e9+7) 题解: 类似后缀数组的做法,把字符串之间用':'连接,这里用':'是因为':'的ascii码恰好 ...
- [BZOJ1283]序列
Description 给出一个长度为n的正整数序列Ci,求一个子序列,使得原序列中任意长度为m的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和最大. Input 第1行 ...
- GYM - 100814 C.Connecting Graph
题意: 初始有n个点,m次操作.每次操作加一条边或者询问两个点第一次连通的时刻(若不连通输出-1). 题解: 用并查集维护每个点所在连通块的根.对于每次加边,暴力的更新新的根. 每次将2个块合并时,将 ...