本文告诉大家如何在触摸下给 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));
}

本文以上代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 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 添加点的更多相关文章

  1. 通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效的问题(问题篇)

    在 .NET Framework 4.7 以前,WPF 程序的触摸处理是基于操作系统组件但又自成一套的,这其实也为其各种各样的触摸失效问题埋下了伏笔.再加上它出现得比较早,触摸失效问题也变得更加难以解 ...

  2. WPF 触摸到事件

    原文:WPF 触摸到事件 本文从代码底层告诉大家,在触摸屏幕之后是如何拿到触摸点并且转换为事件 在 WPF 界面框架核心就是交互和渲染,触摸是交互的一部分.在 WPF 是需要使用多个线程来做触摸和渲染 ...

  3. WPF 多点触摸开发[2]:WPF触摸的几个手势的执行顺序

    原文:WPF 多点触摸开发[2]:WPF触摸的几个手势的执行顺序 前面我讲了在win7下使用模拟器,进行调试模拟多点触摸,其实际开发中这样也比较麻烦.. 要拿几个鼠标. 所以更多的人会 买个触摸套 套 ...

  4. 水晶报表在vs2010 WPF环境下的尝试

    原文:水晶报表在vs2010 WPF环境下的尝试 由于VS2010没有集成水晶报表组件,尝试前必须先安装 水晶报表 for VS2010,若机器未安装的可点击这里>>>下载安装 新建 ...

  5. WPF dataGrid下的ComboBox的绑定

    WPF dataGrid下的ComboBox的绑定 Wpf中dataGrid中的某列是comboBox解决这个问题费了不少时间,不废话了直接上代码 xaml 代码 <DataGridTempla ...

  6. WPF环境下多点触屏开发的一些经验(转)

    本系列将介绍Multi-Touch(MT)多点触控技术的相关内容,使开发人员了解如何在Windows 平台中开发出具有MT 功能的应用程序.众所周知Windows 7 操作系统自身已经支持具有MT 功 ...

  7. WPF/Silverlight 下的图片局部放大

    最近的项目中也要用到一个局部图片放大的功能,园子里面一搜,发现(菩提下的杨过)杨大侠已经实现了. 请参见这里:http://www.cnblogs.com/yjmyzz/archive/2009/12 ...

  8. C# WPF Application 下的文件操作

    好气哦,电脑好烂,每天花大把的时间在等电脑反应上. 没有钱买新电脑,连组台式机的钱都没有.好气哦. 啊啊啊啊文件操作是什么鬼???C++下我都懵了,C#下好多东西要学!!!我不会!我不会!我不会!!! ...

  9. 原生js手机端触摸下拉刷新

    废话不多说,直接上代码,这里感谢我的好朋友,豆姐 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  10. WPF MVVM下做发送短信小按钮

    最近做一个项目,因为涉及到注册,因此需要发送短信,一般发送短信都有一个倒计时的小按钮,因此,就做了一个,在此做个记录. 一.发送消息 没有调用公司的短信平台,只是模拟前台生成一串数字,将此串数字输出一 ...

随机推荐

  1. .NET开源免费的Windows快速文件搜索和应用程序启动器

    前言 今天大姚给大家分享一款.NET开源(MIT License).免费.功能强大的Windows快速文件搜索和应用程序启动器:Flow Launcher. 工具介绍 Flow Launcher 是一 ...

  2. PyQt5报错:This application failed to start because no Qt platform plugin could be initialized

    问题背景: 想使用PyQt5来创建一个可视化窗口,先在pycharm里面安装PyQt5,版本为5.14.0.之后在代码中调用此包:from PyQt5 import QtCore, QtGui, Qt ...

  3. rust结构体包含另一个结构体引用时,serde序列化问题

    代码如下 use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] struct Person { id: Stri ...

  4. C# OpenCvSharp 轮廓检测

    效果 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...

  5. AXI自定义IP之UART调试

    AXI自定义IP之UART调试 1.实验原理 前面的自定义IP中已经将AXI总线的大部分接口设置都一一验证了.基本掌握了关键接受寄存器slv_reg和发送寄存器data_reg_out,可以基本实现简 ...

  6. 复现YOLO-of-RoboMaster-Keypoints-Detection-2023

    开源仓库地址: https://github.com/zRzRzRzRzRzRzR/YOLO-of-RoboMaster-Keypoints-Detection-2023 该仓库提供了数据集,目前只是 ...

  7. HashMap的三种遍历方式--Java--小白必懂

    初学Hash Map总感觉它的遍历很麻烦,其实看懂后总结一下就是:集合+泛型,没啥特别的 总结一下HashMap的三种遍历方法如下: 保证一看就会>>> 1 // 对HashMap的 ...

  8. html中怎样获取子元素的索引位置

    jQuery 的 index() 方法返回指定元素相对于其他指定元素的索引值, 注意:索引值是从0开始计数的. 获得当前元素的索引值可用click事件触发 1 $(selector).click(fu ...

  9. Windows和Linux系统下的Conda环境迁移

    Motivation ​ 大家在学习Python的过程中,可能经常会遇到下面两种情况: 同一份代码,别人配置conda环境可以跑通,但你配置了N天,还不知道哪一步出现了差错,仍然跑不通代码,conda ...

  10. 突然连不上Github或者连接超时的解决办法

    问题描述当进行仓库pull或者push时,报错如下(连接失败/被拒绝/超时等): Failed to connect to github.com port 443: Connection refuse ...