我们提供安全,免费的手游软件下载!

安卓手机游戏下载_安卓手机软件下载_安卓手机应用免费下载-先锋下载

当前位置: 主页 > 软件教程 > 软件教程

WPF应用中鼠标、触摸屏触笔和触摸事件的封装

来源:网络 更新时间:2024-08-23 09:34:49

本文将主要介绍WPF应用对鼠标输入、触摸屏触笔以及触摸事件的封装。

之前的一篇博客已经简要说明了设备输入类型: WPF 屏幕点击的设备类型 - 唐宋元明清2188 - 博客园

1、鼠标 - 通过Mouse相关的事件参数MouseButtonEventArgs中的数据,e.StylusDecice==null表示没有触摸设备,所以设备为鼠标。

2、触笔 or 触摸 - 根据StylusDown事件参数StylusDownEventArgs,e.StylusDevice.TabletDevice.Type == TabletDeviceType.Stylus,True表示触摸设备为触笔,False则为触摸。

通过上述设备类型的判断,可以封装一套设备点击事件,包括DeviceDown、DeviceUp、DeviceMove。事件参数中添加设备类型DeviceType(鼠标、触笔、触摸),然后在具体业务中可以通过设备类型区分相关的交互操作。

有读者问及设备类型具体如何封装,本文将补充设备输入事件的封装使用,希望能为大家提供一定帮助,节省开发时间。

除了设备输入类型,输入事件也有多种状态。 简单介绍下事件区分,具体以鼠标事件为例:

上面区分了按钮与其它的FrameworkElement的鼠标事件,因为Button对冒泡事件是做了拦截再暴露Click事件,需要订阅路由事件来完成鼠标的监听。

如上方代码,对鼠标的左右键、按下抬起、移动以及冒泡隧道都做了完整的封装。

鼠标事件:

触摸面积获取:

返回新的触笔输入点集:

这里是直接把StylusPoint.Description舍弃, 防止在应用层未能统一好这个设备描述、导致异常。

当然这些获取信息根据业务需要来获取、此处设备事件封装不损耗处理延时,所以需要添加Lazy函数如:

PositionLazy = new Lazy(() => e.GetPosition(_element)),
PointsLazy = new Lazy(() => GetStylusPoints(e, _element)),

暴露的通用设备按下事件,可以看如下定义:

UI控件订阅DeviceDown、DeviceMove、DeviceUp事件,从事件参数DeviceInputArgs获取详细数据:

DeviceInputArgs继承Windows路由事件参数类RoutedEventArgs

为何要封装通用事件?因为2点原因:

1. 大部分业务并不需要区分鼠标、触笔、触摸类型

2. 有些业务如白板书写、多指操作需要区分鼠标、触笔、触摸类型,这类场景因为操作事件订阅太多,业务逻辑搞复杂了

通过将鼠标、触笔、触摸事件封装为通用输入事件,下游应用业务对设备输入事件处理逻辑就简单化了。

封装Demo可详见: kybs00/DeviceInputEventDemo (github.com)

关键字:鼠标、触笔、触摸