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下做发送短信小按钮
最近做一个项目,因为涉及到注册,因此需要发送短信,一般发送短信都有一个倒计时的小按钮,因此,就做了一个,在此做个记录. 一.发送消息 没有调用公司的短信平台,只是模拟前台生成一串数字,将此串数字输出一 ...
随机推荐
- CSS(复合选择器、显示模式、背景属性)
一.emmet语法 1.简介 Emmet语法的前身是Zen coding,它使用缩写,来提高html/css的编写速度, Vscode内部已经集成该语法. 快速生成HTML结构语法 快速生成CSS样式 ...
- Deeplink实践原理分析
目录介绍 01.先看一个场景 02.什么是DeepLink 03.什么是Deferred DeepLink 04.什么是AppLink 05.DeepLink和AppLink核心技术 06.DeepL ...
- Clang RecursiveASTVisitor & ASTFrontendActions based on it
RecursiveASTVisitor Basics 类声明 template<typename Derived> class clang::RecursiveASTVisitor< ...
- 提升团队协作效率:欧奥PicHome打造无缝资料共享平台
1. 引言 在快节奏的工作环境中,团队成员需要快速访问和共享信息.有效的资料共享不仅提高工作效率,还能促进团队协作和创新.然而,许多团队仍在使用传统的文件共享方法,这些方法往往效率低下,难以满足现代工 ...
- C# 平台调用过程
(1)调用LoadLibrary加载非托管DLL到内存中,并调用GetProcAddress 获得内存中非托管函数的指针. (2) 为包含非托管函数地址的托管签名生成一个DllImport存根(st ...
- ssh登录太慢了,每次都要20s
背景 大家工作时,少不了ssh登录各个服务器,我这边手里也有很多服务器,有一些登录很快就进去了,有些要卡半天才能进去.之前以为是公司网络问题,每次也就忍了,这次突然不想忍了,决定定位一下. 我这边的服 ...
- #线段树合并、树上启发式合并#CF600E Lomsat gelral
题目 一棵树有\(n\)个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和 分析1 线段树合并,记录\(w,sum\)分别表示编号和以及颜色和,当颜色和相同时两个编号 ...
- #三分,分治,计算几何,prim#JZOJ 3860 地壳运动
题目 \(q\)组询问查询最小生成树,边权为\(u*k1+v*k2\)(\(k1,k2\)每次询问都不同) \(n\leq 35,m\leq 25000,q\leq 200000\) 分析 纯\(\t ...
- OpenHarmony中的HDF单链表及其迭代器
概念 为了性能考虑,嵌入式系统一般使用C语言进行开发,由于C语言标准库没有封装链表,所以嵌入式系统一般自己设计和实现链表这种数据结构.单链表是链表中的一种,本文描述OpenAtom OpenHarmo ...
- Matplotlib绘图设置---图形颜色和风格调整
绘图函数 plt.plot()函数可以通过相应的参数设置绘图风格. plt.plot(*args, scalex=True, scaley=True, data=None, **kwargs) Doc ...