键盘焦点和逻辑焦点(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. NO4——并查集

    int find(int x) { int r = x; while(father[r]!=r) r = father[r]; return r; } /* int find(int x) { if( ...

  2. ob_flush()和flush()的区别

    最近写定时任务,遇到ob_flush()和flush()混淆的问题... ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑- 其实, 他们 ...

  3. 习题:就是干(DP)

    洛谷2301 题目描述 眼看着老师大军浩浩荡荡的向机房前进.LOI 的同学们决定动用自己的力量来保卫他们的好朋友loidc.现在每个人都要挑选自己的武器——两根木棍.一根用做远距离投掷,另一根用做近距 ...

  4. 二分查找 Binaryserach

    二分查找: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升 ...

  5. hihocoder 1323 回文字符串(字符串+dp)

    题解: 比较水的题目 dp[i][j]表示[i...j]最少改变几次变成回文字符串 那么有三种转移 dp[i][j] = dp[i+1][j-1] + s[i] != s[j] dp[i][j] = ...

  6. BZOJ1293 [SCOI2009]生日礼物 【队列】

    题目 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩珠也可以出现在同一 ...

  7. 【BZOJ2134】单选错位 概率DP

    一句话:有一些看似有关系的期望在把事件全面发生之后就变得相互独立了 #include<cstdio> using namespace std; ]; double ans; int mai ...

  8. PHP正则匹配与替换的简单例子

    PHP正则匹配与替换的简单例子,含一个匹配获取加租字体例子和一个匹配替换超链接的例子. 1.查找匹配 <b> 与 </b> 标签的内容: <?php $str = &qu ...

  9. java 构造函数问题

    1.构造函数什么时候被调用,被谁调用? 转摘:http://bbs.csdn.net/topics/350231037 当然,只有在NEW的时候,才会真正的创建这个对象,只有在创建时才会调用该类的构造 ...

  10. windows 系统下git 的使用

    前言: 最新版本的git for windows也是有界面的,不再是以前的纯命令行操作,但是我习惯了乌龟,所以感觉还是直接用乌龟比较方便点~~ 前提,已安装以下: git for windows,未安 ...