WPF 触摸下如何给 StylusPointCollection 添加点
本文告诉大家如何在触摸下给 WPF 的 StylusPointCollection 添加新的点
在自己默认创建的 StylusPointCollection 里面添加点是十分简单的,如以下代码,可以非常简单添加到集合
StylusPointCollection stylusPointCollection = new StylusPointCollection();
stylusPointCollection.Add(new StylusPoint(0, 0));
但是当你的 StylusPointCollection 是从 Stylus 事件里面获取的,比如以下代码的 StylusDown 事件里面获取的,那在添加点的时候可能你会收到 ArgumentException 异常
private void MainWindow_OnStylusDown(object sender, StylusDownEventArgs e)
{
StylusPointCollection stylusPointCollection = e.GetStylusPoints(this);
stylusPointCollection.Add(new StylusPoint(0, 0));
}
在一些触摸框下的设备,以上添加点的代码可能收到以下的异常信息
System.ArgumentException:“StylusPointDescriptions 不兼容。使用 StylusPointDescription.GetCommonDescription 方法查找公用 StylusPointDescription,然后调用 StylusPointCollection.Reformat,以返回兼容的 StylusPointCollection。 Arg_ParamName_Name”
这是因为从触摸拿到的 StylusPointCollection 预设了 StylusPointDescription 描述信息,而新创建的 StylusPoint 没有带上描述信息里面的内容,从而导致异常
在触摸下,收到的触摸点可以包含更多的信息,比如宽度高度、按钮点击状态等等。这些信息是要求整个 StylusPointCollection 里面的所有 StylusPoint 点都包含存在所声明的信息。想想,如果一个 StylusPointCollection 的描述里面说明点包含宽度信息,而如果其中某些点不包含,这要让 WPF 层如何能工作
这也就是为什么在一些触摸框下的设备才会抛出异常,一些触摸框下的设备不会抛出异常的原因。因为只有一些触摸框才会给触摸点带上更多的额外数据,如宽度高度等信息,在这些触摸框下的设备将由于创建的 StylusPoint 拿不到的额外描述信息,从而失败
可选的添加点到 StylusPointCollection 的方法有两个,一个是设置让 StylusPointCollection 去掉描述信息,另一个就是取现有的 StylusPoint 点复制其信息
先看第一个方法的实现
去掉 StylusPointCollection 的描述信息,可以通过 Reformat 方法设置一个空的 StylusPointDescription 去掉描述信息,如以下代码
private void MainWindow_OnStylusDown(object sender, StylusDownEventArgs e)
{
StylusPointCollection stylusPointCollection = e.GetStylusPoints(this);
stylusPointCollection = stylusPointCollection.Reformat(new StylusPointDescription());
stylusPointCollection.Add(new StylusPoint(0, 0));
}
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 5bbbe5643ee3fd484c1f36c79742399ba486fde6
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 5bbbe5643ee3fd484c1f36c79742399ba486fde6
获取代码之后,进入 RokelnejallwhuNeaferkairce 文件夹
第二个方法是通过在 StylusPointCollection 里面存在的点的信息创建新的点。第二个方法比较黑科技,只适合用来不便修改原有的 StylusPointCollection 对象的情况,代码例子如下
private void MainWindow_OnStylusDown(object sender, StylusDownEventArgs e)
{
StylusPointCollection stylusPointCollection = e.GetStylusPoints(this);
var stylusPoint = stylusPointCollection[0];
stylusPoint.X = 1;
stylusPoint.Y = 2;
stylusPointCollection.Add(stylusPoint);
}
由于 StylusPoint 是一个结构体,根据 C# 基础知识,结构体获取的时候都是一次浅拷贝,也就是通过 stylusPointCollection[0] 所获取返回的 StylusPoint 已经和原本在集合里面的点是两个不同的点了,对 stylusPoint 局部变量的任何更改都不会影响到原本的点
因此通过此方式即可方便的进行 StylusPoint 的拷贝,通过拷贝的方式获取到必要的额外描述信息。使用结构体特性进行拷贝而不是重新创建的方法,即可让点包含触摸点集合所描述的信息,从而可以正确加入到集合里面
但无论如何,新添加的点的信息肯定是模拟出来的,这就意味着对于模拟出来的点的额外信息在你的具体业务上的处理,是必须要符合你的预期的。假定你本身就拿着触摸的面积进行一些业务处理,那如果新加的点使用了诡异的数据,那自然将会让你这部分业务不能符合预期
当然了,自己创建点的时候,添加上足够的描述信息也是可以的,只不过这部分代码不好写,且实现效果和以上第二个方法差不多
WPF 触摸下如何给 StylusPointCollection 添加点的更多相关文章
- 通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效的问题(问题篇)
在 .NET Framework 4.7 以前,WPF 程序的触摸处理是基于操作系统组件但又自成一套的,这其实也为其各种各样的触摸失效问题埋下了伏笔.再加上它出现得比较早,触摸失效问题也变得更加难以解 ...
- WPF 触摸到事件
原文:WPF 触摸到事件 本文从代码底层告诉大家,在触摸屏幕之后是如何拿到触摸点并且转换为事件 在 WPF 界面框架核心就是交互和渲染,触摸是交互的一部分.在 WPF 是需要使用多个线程来做触摸和渲染 ...
- WPF 多点触摸开发[2]:WPF触摸的几个手势的执行顺序
原文:WPF 多点触摸开发[2]:WPF触摸的几个手势的执行顺序 前面我讲了在win7下使用模拟器,进行调试模拟多点触摸,其实际开发中这样也比较麻烦.. 要拿几个鼠标. 所以更多的人会 买个触摸套 套 ...
- 水晶报表在vs2010 WPF环境下的尝试
原文:水晶报表在vs2010 WPF环境下的尝试 由于VS2010没有集成水晶报表组件,尝试前必须先安装 水晶报表 for VS2010,若机器未安装的可点击这里>>>下载安装 新建 ...
- WPF dataGrid下的ComboBox的绑定
WPF dataGrid下的ComboBox的绑定 Wpf中dataGrid中的某列是comboBox解决这个问题费了不少时间,不废话了直接上代码 xaml 代码 <DataGridTempla ...
- WPF环境下多点触屏开发的一些经验(转)
本系列将介绍Multi-Touch(MT)多点触控技术的相关内容,使开发人员了解如何在Windows 平台中开发出具有MT 功能的应用程序.众所周知Windows 7 操作系统自身已经支持具有MT 功 ...
- WPF/Silverlight 下的图片局部放大
最近的项目中也要用到一个局部图片放大的功能,园子里面一搜,发现(菩提下的杨过)杨大侠已经实现了. 请参见这里:http://www.cnblogs.com/yjmyzz/archive/2009/12 ...
- C# WPF Application 下的文件操作
好气哦,电脑好烂,每天花大把的时间在等电脑反应上. 没有钱买新电脑,连组台式机的钱都没有.好气哦. 啊啊啊啊文件操作是什么鬼???C++下我都懵了,C#下好多东西要学!!!我不会!我不会!我不会!!! ...
- 原生js手机端触摸下拉刷新
废话不多说,直接上代码,这里感谢我的好朋友,豆姐 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- WPF MVVM下做发送短信小按钮
最近做一个项目,因为涉及到注册,因此需要发送短信,一般发送短信都有一个倒计时的小按钮,因此,就做了一个,在此做个记录. 一.发送消息 没有调用公司的短信平台,只是模拟前台生成一串数字,将此串数字输出一 ...
随机推荐
- 对象池Pools优化
目录介绍 01.什么是对象池 02.glide哪里用到对象池 03.多条件key缓存bitmap 3.1 多条件key创建 3.2 key值的复用 04.glide对象池总结 05.学以致用对象池 5 ...
- 记录--对于$off,Exclude 和 Extract的一点理解
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.typescript 高阶类型 Exclude 和 Extract Exclude<T, U> TypeScript 2. ...
- objective-c之Class底层结构探索
isa 走位图 在讲 OC->Class 底层类结构之前,先看下下面这张图: 通过isa走位图 得出的结论是: 1,类,父类,元类都包含了 isa, superclass 2,对象isa指向类对 ...
- ET8开发微信小游戏之部署云服务器Nginx代理
最近用ET8搞微信小游戏测试,部署到云服务器,手机上运行,必须要用https备案过得域名,客户端使用websocket创建必须要wss开头,服务端部分通过Nginx进行https通信之后转发到云服务器 ...
- System.gc 之后到底发生了什么 ?
本文基于 OpenJDK17 进行讨论 在 JDK NIO 针对堆外内存的分配场景中,我们经常会看到 System.gc 的身影,比如当我们通过 FileChannel#map 对文件进行内存映射的时 ...
- #点分治,树状数组#洛谷 5311 [Ynoi2011] 成都七中
题目 给你一棵 \(n\) 个节点的树,每个节点有一种颜色,有 \(m\) 次查询操作. 查询操作给定参数 \(l\) \(r\) \(x\),需输出: 将树中编号在 \([l,r]\) 内的所有节点 ...
- #排列组合#美团2018年CodeM大赛-决赛 A-Exam
题目 分析 因为第一名所在的学校一定会发喜报, 所以只有一个学校发喜报说明其它学校都没有发喜报 钦定第一名所在的学校为1,总方案要乘\(n\),那么两个1之间不可能出现两个相同的学校的学生 那么可以分 ...
- 详讲openGauss 5.0 单点企业版如何部署_Centos7_x86
本文分享自华为云社区<openGauss 5.0 单点企业版部署_Centos7_x86>,本文作者:董小姐 本文档环境:CentOS7.9 x86_64 4G1C40G python2. ...
- RabbitMQ 08 路由模式
路由模式 路由模式结构图: 定义配置类. import org.springframework.amqp.core.Binding; import org.springframework.amqp.c ...
- recover database until cancel
数据库演示版本为 12.1.0.2 该系列涉及恢复过程中使用的 5 个语句: 1. recover database 2. recover database until cancel 3. recov ...