wpf - 窗口 10 上的 WPF Listview 触摸问题:“触发了另一个数据模板的事件,而它可能不会发生”
问题描述
在带有触摸屏的 Windows 10 上使用 WPF 应用程序时,我们遇到了列表视图的问题。使用鼠标时,它工作正常。
我们创建了一个简单的测试项目,用于在 windows 10 上模拟问题,可以在GitHub上找到。在MSDN上还创建了一张票
简而言之,以下是技术设置的摘要:
- 我们使用分组列表视图,并且对于每个组,一个切换按钮和另一个(内部)列表视图。
- 内部列表视图使用绑定到数据模板选择器的 ItemTemplateSelector 来选择数据模板。
- 将根据有界模型的 type 属性选择 3 个数据模板(复选框、数字、文本)。
- 每个数据模板都有一个堆栈面板。文本 en 数字数据模板中的堆栈面板连接到 PreviewMouseDown 事件。重要的是,复选框中的堆栈面板未连接到事件。
这通常工作得很好,但是有时,当触摸复选框时,会触发另一个模板的 PreviousMouseDown。
我希望这种行为可能不会发生,对吗?
我们找到了解决此问题的方法(*),但没有找到根本原因。
为什么会触发另一个模板的事件?
我开始相信这可能是 WPF Listview 和触摸行为的问题?
(*)如果我们知道有时某个事件是从错误的模板触发的,我们会验证每个事件是否该事件源自正确的模板,如果不是,我们什么也不做。
在下面,您可以看到当快速点击复选框时触发了 clickevent。
下面是代码的更多细节:
- 数据模板和选择器
- 带有内部列表视图和项目模板选择器的分组列表视图
- 在后面的代码和 PreviewMouseDown 事件的处理程序下方
下面概述了我们为解决它而采取的步骤,但没有一个会导致解决方案。
解决方案
由于 WPF 支持触摸并且屏幕上的触摸也被“转换”为 mousedown 事件,所以我看不出为什么不在触摸屏上使用 previewMouseDown 事件的问题。我也没有发现微软的任何官方文档不这样做。
无论如何,我无法再重现这样的问题,即触摸 listviewitem 正在调用列表中另一个 listviewitem 模板的另一个 previeuwMouseDown 事件...。
通过 Touchdown 事件更改 PrevieuwMouseDown 事件!
我很高兴找到解决方案,但是根据许多在线搜索,我觉得 WPF 存在很多问题,而且通常不清楚根本原因是什么。就像在这种情况下,我通过反复试验找到了解决方案,但为什么在使用 previewMouseDown 时会出现问题,令人费解。
推荐阅读
- linux - 无法更新 Linux 的 Github 桌面(错误:429 Too Many Requests)
- yaml - 如何在管道的 yaml 文件中定义最新稳定的节点映像版本,而无需手动编写版本号
- cpu-architecture - 计算每秒转数
- magento - Magento 2 Jalali datepicker js文件不适用于输入文本
- sql - 带有条件 SQL 的百分比
- c# - 如何将 Linq 更改为 excel Null 字符串值?
- java - 正则表达式用字符串之间的给定匹配替换字符
- c# - С# 约束泛型不起作用和脑残
- python - 将字符串转换为没有日期信息 Python 的 dateTime
- c# - 在 NLog 中选择自定义日志级别