键盘焦点和逻辑焦点(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 静态方法仅仅只设置键盘焦点。而UIElementFocus 方法会尝试将键盘焦点设置给控件,如果控件获取键盘焦点失败,则将逻辑焦点设置给控件。

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

键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )的更多相关文章

  1. PyQt(Python+Qt)学习随笔:键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 Qt中的焦点有键盘焦点和逻辑焦点(Logic Focus与Keyboard Focus )的区分,键 ...

  2. Android中软键盘展示、EditText焦点获取及windowSoftInputMode属性探究

    2017-08-14 21:44:23 有很多中情况,分别展示. 1.Activity不做任何设置,布局使用LinearLayout 会自动滚动EditText之上的所有View,代码: <?x ...

  3. PyQt4控件失去焦点和获得焦点

    #QListView控件多选设置self.ui.listView.setSelectionMode(QAbstractItemView.ExtendedSelection) #初始化QListView ...

  4. (三)在js(jquery)中获得文本框焦点和失去焦点的方法

    在js(jquery)中获得文本框焦点和失去焦点的方法   文章介绍两个方法和种是利用javascript onFocus onBlur来判断焦点和失去焦点,加一种是利用jquery $(" ...

  5. easyUI文本框获得焦点,失去焦点

    easyUI帮助文档对于文本框的操作没有提供直接获得焦点,或者失去焦点的方法,我们可以采用以下写法来实现. 获得焦点: $('input',$('#文本框Id').next('span')).focu ...

  6. jquery得到焦点和失去焦点

    鼠标在搜索框中点击的时候里面的文字就消失了,经常会用到搜索框的获得焦点和失去焦点的事件,接下来介绍一下具体代码,感兴趣的朋友额可以参考下   input失去焦点和获得焦点 鼠标在搜索框中点击的时候里面 ...

  7. 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 ...

  8. apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard

    apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard 想在苹果电脑 mac 系统下使用 机械键盘,大部分机械键盘不是为mac设计的,所 ...

  9. Qt中的键盘事件,以及焦点的设置(比较详细)

    Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效.下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件.有输入焦点的窗口是活动窗口 ...

随机推荐

  1. IDE API SDK JDK

    一.IDE 英文全称:Integrated Development Environment 中文名称:集成开发环境 本质:应用程序 功能:提供程序开发环境 组成:代码编辑器.编译器.调试器.图形用户界 ...

  2. sql 条件插入

    原普通插入语句: insert into seriestable_upload values(New.SeriesID,0); 加条件后:(当不存在该条数据插入) insert into custom ...

  3. 【积累】根据CheckBox的不选中 ,用JQuery 清除 RidaoButtonList 的选中项

    如题,项目要求无刷新更新数据. 1)Web页面布局 Html以及效果图  

  4. 匿名内存 | shm

    page_is_file_cache是和swapbacked互斥的,所以说对于匿名页来说,分配的时候就就会把PageSwapBacked给设置上,page->mapping_address = ...

  5. 颜色采集器colpick Color Picker

    简单 RGB.HSB.十六进制颜色选取器 jQuery 插件. 非常直观类似 Photoshop 的界面. 光明和黑暗很容易自定义 CSS3 外观. 28 KB 总由浏览器加载看起来不错甚至在 IE7 ...

  6. 统计无符号整数二进制中1的个数(Hamming weight)

    1.问题来源 之所以来记录这个问题的解法,是因为在在线编程中经常遇到,比如编程之美和京东的校招笔试以及很多其他公司都累此不疲的出这个考题.看似简单的问题,背后却隐藏着很多精妙的解法.查找网上资料,才知 ...

  7. 几个JQuery解析XML的程序例子

    用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 第一种方案: <script ty ...

  8. taotao用户登录springMVC拦截器的实现

    在springMVC中写拦截器,只需要两步: 一.写 java 拦截器类,实现 interceptor 拦截器接口. 二.在 springMVC 的xml配置文件中,配置我们创建的拦截器对象及其拦截目 ...

  9. 状压DP初识~~炮兵阵地

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31718   Accepted: 12253 Descriptio ...

  10. 把java的class文件打成jar包的步骤

    现在我的文件夹的目录在: C:\Users\linsenq\Desktop\cglibjar 我要把位于这个目录下的所有文件夹以及这个文件夹下的.class文件打成jar包 第一步:用win+R 打开 ...