2019-10-18-WPF-解决-StylusPlugIn-点击穿透问题
title | author | date | CreateTime | categories |
---|---|---|---|---|
WPF 解决 StylusPlugIn 点击穿透问题
|
lindexi
|
2019-10-18 20:55:35 +0800
|
2019-1-8 10:49:4 +0800
|
WPF 笔迹
|
在使用 StylusPlugIn 的时候会出现这样的坑,只要一个元素附加有 StylusPlugIn 加入到视觉树,在这个元素上面放另一个没有附加 StylusPlugIn 的元素,点击上面的元素,下面的元素的 StylusPlugIn 还是可以收到触摸的消息
如果写一个简单的 StylusPlugIn 附加到元素上,可以很快知道我说的问题
- public class JallsiniPeagelJurnarbe : StylusPlugIn
- {
- /// <inheritdoc />
- protected override void OnStylusDown(RawStylusInput rawStylusInput)
- {
- Trace();
- base.OnStylusDown(rawStylusInput);
- }
- /// <inheritdoc />
- protected override void OnStylusMove(RawStylusInput rawStylusInput)
- {
- Trace();
- base.OnStylusMove(rawStylusInput);
- }
- /// <inheritdoc />
- protected override void OnStylusUp(RawStylusInput rawStylusInput)
- {
- Trace();
- base.OnStylusUp(rawStylusInput);
- }
- private void Trace([CallerMemberName] string name = "")
- {
- Debug.WriteLine(name);
- }
- }
再创建一个 UIElement 附加这个 JallsiniPeagelJurnarbe 将 UIElement 添加到界面,就可以在触摸的时候看到输出
- public class MeexikelelHaiwurbe : UIElement
- {
- /// <inheritdoc />
- public MeexikelelHaiwurbe()
- {
- var dynamicRenderer = new JallsiniPeagelJurnarbe();
- StylusPlugIns.Add(dynamicRenderer);
- }
- }
现在摸一下屏幕,可以看到不断输出
但是如果在这个元素上面再放一个元素会怎样?
下面创建一个用户控件,这个用户控件非常简单,我就不放代码了
- <local:MeexikelelHaiwurbe></local:MeexikelelHaiwurbe>
- <local:NabayparKawquheTea HorizontalAlignment="Center" VerticalAlignment="Center"></local:NabayparKawquheTea>
此时摸到了 林德熙是逗比
的元素,在 JallsiniPeagelJurnarbe 还是可以收到触摸的消息,如果是通过 JallsiniPeagelJurnarbe 做书写,那么就会发现在 林德熙是逗比
的元素后面进行了书写,此时在 林德熙是逗比
的元素的 Down Move 函数使用 e.Handle = true
也没有用,因为 StylusPlugIn 走的不是路由事件
这个问题就是 StylusPlugIn 点击穿透问题,虽然在元素上面放了另一个元素,但是在触摸的时候就像上面的元素不存在一样
一个解决方法是在上面的元素上创建一个空白的 StylusPlugIn 这样就可以防止点击穿透
刚才创建的 林德熙是逗比
的元素,在这个元素的构造函数添加一个空白的 StylusPlugIn 就可以解决这个问题
- public partial class NabayparKawquheTea : UserControl
- {
- public NabayparKawquheTea()
- {
- InitializeComponent();
- StylusPlugIns.Add(new LihemtugeJootrasLeresu());
- }
- }
- public class LihemtugeJootrasLeresu : StylusPlugIn
- {
- }
现在的触摸将会很诡异,为了说明这时的触摸是怎样的,需要再添加一点代码
现在白色部分是底层的元素,灰色的说德熙是逗比的元素放在底层元素上面,然后进行一次触摸
从底层元素按下,然后移动到说德熙是逗比的元素上,接着移到底层元素上抬起
- 底层的元素OnStylusEnter
- 底层的元素OnStylusDown
- 说德熙是逗比的元素 OnStylusEnter
- 说德熙是逗比的元素 OnStylusLeave
- 说德熙是逗比的元素 OnStylusEnter
- 说德熙是逗比的元素 OnStylusLeave
- 底层的元素OnStylusUp
此时移动到说德熙是逗比的元素上在底层的元素依然可以接收到 Move 的消息
如果是从说德熙是逗比的元素上按下,然后移动到底层元素,请看下图
- 底层的元素OnStylusEnter
- 底层的元素OnStylusDown
- 说德熙是逗比的元素 OnStylusEnter
- 说德熙是逗比的元素 OnStylusDown
- 说德熙是逗比的元素 OnStylusLeave
- 说德熙是逗比的元素 OnStylusEnter
- 说德熙是逗比的元素 OnStylusLeave
- 底层的元素OnStylusUp
虽然说德熙是逗比的元素的层级比底层的元素高,但是首先命中的是底层的元素然后才是 说德熙是逗比
的元素收到 down 如果此时在底层的元素抬手,那么就会在底层的元素收到 up 而在说德熙是逗比的元素上没有收到消息
通过这个方法可以只要 说德熙是逗比
的元素有触摸,就设置底层的元素失去焦点,通过在 底层的元素 添加一个方法,调用这个方法就不处理当前的触摸
在使用 StylusPlugIns 集合,使用框架的方法判断是通过在 _plugInCollectionList
字段拿到所有的集合,也就是先添加到视觉树的控件,将会在 PenContexts.AddStylusPlugInCollection
加入到字段。所以遍历的顺序和视觉树顺序无关,而是和加入视觉树的顺序有关。详细请看 WPF 高速书写 StylusPlugIn 原理
那么在 WPF 的 DynamicRenderer 是如何处理的?
在 StylusPlugIn 有一个方法是 OnStylusDownProcessed 通过这个方法可以判断在 UI 线程命中测试的附加元素有没有收到输入,通过判断参数 targetVerified
的值就可以知道
如果在 UI 线程的元素刚好也收到了触摸的消息,这里的 targetVerified
就是 true 否则就是 false 当然这个方法要求在 down 的时候调用 NotifyWhenProcessed 方法才可以
- protected override void OnStylusDown(RawStylusInput rawStylusInput)
- {
- Trace();
- // 调用这个方法之后才会触发 OnStylusDownProcessed 在主线程收到触摸
- // 如果附加的元素收到了路由触摸,参数 targetVerified 为 true 通过这个方法可以判断当前的点击的元素是否在上面有其他元素
- rawStylusInput.NotifyWhenProcessed("林德熙是逗比");
- base.OnStylusDown(rawStylusInput);
- }
这里的 NotifyWhenProcessed 传入的参数将会是在 OnStylusDownProcessed 的第一个参数 callbackData 返回,在 DynamicRenderer 就是传入了 StrokeInfo 然后在这个函数判断
所以解决这个问题有两个方法,第一个就是在元素上面添加一个 StylusPlugIn 如果收到了消息就设置另一个元素的 StylusPlugIn 失去焦点,另一个方法是在元素通过 NotifyWhenProcessed 设置如果主线程的元素可以收到触摸的方法
第一个方法是需要在其他所有元素上面添加 StylusPlugIn 有代码耦合
第二个方法需要等待主线程收到消息,在笔迹就出现点击的时候出现了闪烁,因为触摸线程比主线程先收到点击
2019-10-18-WPF-解决-StylusPlugIn-点击穿透问题的更多相关文章
- 解决移动端点击穿透问题_h5实现移动端点击事件穿透的多种解决方案
移动端点透点透现象出现的场景: 当A/B两个层上下z轴重叠,上层的A点击后消失或移开(这一点很重要),并且B元素本身有默认click事件(如a标签)或绑定了click事件.在这种情况下,点击A/B重叠 ...
- 2019.10.18模拟赛T3
题目大意: 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[lcm(i,j)>n](n\leq 10^{10})$的值. 题解: 这题貌似有n多种做法... 为 ...
- Zepto tap 穿透bug、解决移动端点击穿透问题
当两个层重叠在一起时,或是有个弹窗,使用Zepto的tap事件时,点击上面的一层时会触发下面一层的事件,特别是底层如果是input框时,必“穿 透”,“google”说原因是“tap事件实际上是在冒泡 ...
- 【2019.10.17】十天Web前端程序员体验(软件工程实践第五次作业)
结对信息.具体分工 Github地址:https://github.com/MokouTyan/131700101-031702425 学号 昵称 主要负责内容 博客地址 131700101 莫多 代 ...
- 九月 26, 2017 10:18:14 上午 com.sun.jersey.server.impl.application.RootResourceUriRules <init> 严重: The ResourceConfig instance does not contain any root resource classes.
Tomcat启动错误:九月 26, 2017 10:18:14 上午 com.sun.jersey.server.impl.application.RootResourceUriRules <i ...
- jquery鼠标点击穿透的解决方法
jquery鼠标点击穿透的解决方法 <pre><div class="showcontainer" style="background:#000;dis ...
- WPF 解决无边框产生的相关问题
原文:WPF 解决无边框产生的相关问题 最大化: 在设置WindowStyle="None" AllowsTransparency="True"后,最大化会覆盖 ...
- 背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue
[源码下载] 背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue 作者:weba ...
- delphi 10 seattle 中 解决IOS 9 限制使用HTTP 服务问题
IOS 9 于17号早上正式开始推送,早上起来立马安装,这次升级包只有1G, 安装空间也大大降低(想起IOS 8 升级时,几乎把手机里面的东西删光了,满眼都是泪). 虽然安装后,网上几乎是铺天盖地的吐 ...
随机推荐
- Javascript简单算法
1.多维数组取其所有第几个值组成新数组 例如 [[, , ], [, , ], [, , ]],我要标红的值 [[1, 3, 5], [2, 2, 2], [3, 3, 3]] let t = [[1 ...
- System.Web.Mvc.PartialViewResult.cs
ylbtech-System.Web.Mvc.PartialViewResult.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, ...
- 关于获取webview(窗口间关系)的方法
1.获取指定页面ID的webview plus.webview.getWebviewById('为页面设置的id值'): 该方法主要用于首页底部导航切换到子页面时不执行子页面的函数,因为在设置导航的时 ...
- 2006-2007 ACM-ICPC | POJ3380 POJ3384 POJ3385 水题题解
// CF比赛链接:http://codeforces.com/gym/101650 // POJ链接:http://poj.org/searchproblem?field=source&ke ...
- linux最基础最常用的命令快速手记 — 让手指跟上思考的速度(三)
这一篇作为姐妹篇的第三篇,废话不多说,我觉得这个比mysql的还要重要,为什么,一旦你摊上linux 敲键盘输入命令简直是要飞的速度,不断的卡壳查命令,效率太低了,而且非常严重的影响思绪,思绪! 某些 ...
- Markdown的入门教程,非常的使用
原文链接: https://www.jianshu.com/p/20e82ddb37cb 链接地址 点我 粘贴进来的内容竟然没有图片,好气呦 目录 概述 简介 官方文档 Markdown编 ...
- Luogu P2101 命运石之门的选择(分治+搜索)
P2101 命运石之门的选择 题意 题目描述 在某一条不知名世界线的冈伦今天突然接到了一条\(dmail\),上面说世界线将会发生巨大变动,未来的他无论如何都无法扭转这种变动回到原来的世界线.而世界线 ...
- fstream文件打开模式
fstream:对于文件的操作很久两年前就开始使用了,但是仅仅为了达到满足自己需求的目的,就是要么是写,要么是读.从来没有对其进行详细的了解.自己也曾经想过花一点时间去总结一下,这个东西到底应该怎么用 ...
- Ubuntu 14.04 Ruby 2.3.3 安装
在Ubuntu 14.04通过下载Ruby源码包进行安装. 第一步,更新apt-get sudo apt-get update 通过apt-get安装ruby依赖 sudo apt-get insta ...
- 一些常见的synthesis attribute
Noprune A Verilog HDL synthesis attribute that prevents the Quartus II software from removing a regi ...