WPF 程序无法触摸操作
来源:互联网 发布:东海航空 知乎 编辑:程序博客网 时间:2024/05/21 11:23
WPF 自诞生以来就带着微软先生的傲慢。微软说 WPF 支持触摸,于是 WPF 就真的支持触摸了。对,我说的是“支持触摸”,那种摸上去能点能动的;偶尔还能带点儿多指的炫酷效果。但是,WPF 推出那会儿,绝大部分开发者都还没有触摸屏呢,开发个程序要怎么验证支不支持触摸呢?微软先生无奈地决定——你写鼠标的代码就好了,我帮你转换!于是……一大波 BUG 袭来……
WPF 的触摸失效有三种可能:
- 触摸下 Stylus/Touch 事件正常触发,但不提升为 Mouse 事件;导致仅使用 Mouse 事件的控件无法使用
- 触摸下无 Stylus/Touch 事件,也不提升为 Mouse 事件,但鼠标下有 Mouse 事件;导致整个界面完全无法触摸使用
- 触摸下 Stylus/Touch 有触发,但触发点位置在 (0, 0) 处或上一个触摸点处;导致即使触发了,当前控件也收不到
第一种情况
使用触摸或者触笔操作时,如果 Up
事件中发生了任何异常,会导致 StylusLogic.PostProcessInput
的后续逻辑不会正确执行,
这就包括了用于清理触控资源的 StylusTouchDevice.OnDeactivate 方法。
而在 StylusTouchDevice.OnDeactivate
方法中,会重置 StylusLogic.CurrentMousePromotionStylusDevice
属性
为 null
或 NoMousePromotionStylusDevice
。此方法不执行会直接导致 StylusLogic.ShouldPromoteToMouse
方法
对当前触控设备的判断出现错误,持续返回 false
,即不会再执行触控转鼠标的逻辑,出现触摸无效的现象。
第二种情况
WPF 程序在启动期间,如果触摸组件发生了异常,极有可能会使得触摸根本就没有初始化成功!
比如,System.Windows.Input.StylusLogic.RegisterStylusDeviceCore(StylusDevice stylusDevice)
方法在启动时抛出 System.InvalidOperationException
,虽然内部有 catch
,但实际获取到的 TabletDevice
个数是 0 个,根本无法获取触摸设备,于是触摸无效。
或者,在 WorkerOperationGetTabletsInfo.OnDoWork
方法中,获取到了错误的触摸设备个数:
IPimcManager pimcManager = UnsafeNativeMethods.PimcManager;uint count;pimcManager.GetTabletCount(out count);
第三种情况
如果 WPF 的 StylusUp 事件被阻断(例如 e.Handled = true
,或者在 StylusUp 事件中弹出一个模态窗口),则下一次触摸时获取到的点坐标将是上一次被阻断时的点坐标。于是,阻断后的第一次点击必将点钟之前点的那个点,而不管现在点中了什么。如果阻断时点在新窗口外,则几乎相当于触摸失效。
- WPF 程序无法触摸操作
- #747 –在WPF程序的触摸操作中使用惯性移动 (Implementing Inertia during Touch Manipulation)
- WPF程序长时间无人操作
- 解决WPF项目中无法创建程序集问题
- WPF程序启动后资源管理器应用程序无法显示
- WPF集合已修改;可能无法执行枚举操作 解决方案
- VS2010 类库程序集 无法添加WPF窗口、WPF用户控件
- WinForm与WPF互操作,在WPF的TextBox中无法输入文字
- WPF程序
- 多点触摸参考程序
- 多点触摸程序
- Cocos2d触摸操作
- Unity3D触摸操作
- Android多点触摸操作
- Unity触摸操作
- 多点触摸操作
- WPF多点触摸放大缩小旋转
- wpf无法加载程序集的元数据 可能已从web下载--解决办法!
- MacOS 开发
- Hexo + GitHub 博客搭建
- mtk led子系统概略
- Maven学习笔记(二)
- Android权限机制小结
- WPF 程序无法触摸操作
- 论文笔记:TextBoxes: A Fast Text Detector with a Single Deep Neural Network
- maven入门
- 搭建PHP开发环境(二)-PHP安装
- Object.defineProperty()的set方法除了用于双向绑定还能干嘛?
- faster-rcnn小刀
- Exception.Data 为异常添加更多调试信息
- js 获取页面宽度和高度
- curses库(LINUX/UNIX图形函数库)