【问题标题】:Why are touch interactions slower than click events in WPF?为什么触摸交互比 WPF 中的单击事件慢?
【发布时间】:2016-10-05 21:55:42
【问题描述】:

我的 WPF 应用程序(正在生产中)中发生了一个非常奇怪的场景。我在屏幕上有几个<Button> 元素,它们在XAML 代码隐藏中绑定了Click 事件。按钮的单击处理程序使用 HttpClient 来访问 REST 端点(使用 await/async),然后使用它接收到的数据更新屏幕。

此应用程序在一些廉价的戴尔平板电脑上运行,因此触摸屏是主要的交互模式。但是出于测试目的,我插入了鼠标。

当我用鼠标点击按钮时,应用程序是高性能的;换句话说,它很快。 REST 调用在 100 到 200 毫秒内完成。

当我点击屏幕按下按钮时——相信我——我已经确认点击完全相同的点击处理程序并执行完全相同的代码路径,它通常没有性能。突然完全相同 REST 调用需要更长的时间。有时需要 2 秒。其他时候需要 10 秒。我无法解释为什么会出现这种差异。

当我在 Surface Pro 3(比戴尔平板电脑好得多的硬件)上调试相同的应用程序时,我无法重现该问题。但如果这纯粹是硬件问题,我会想知道为什么它在某些情况下(使用鼠标)可以执行,但在其他情况下(使用触摸屏)则不行。

我一直在努力想出一个 MVCE,因为我尝试创建的精简分支似乎没有这个问题,但如果我能想出,我会继续尝试编辑这篇文章一个。

与此同时,我想知道是否有其他人遇到过类似的触摸屏问题。我唯一的理论是关于 WPF 触摸处理程序的某些东西会在单独的线程或单独的上下文或具有单独的优先级(类似的东西)上触发事情。

【问题讨论】:

  • 你试过.Net framework 4.6.1版本吗?触摸设备的性能得到了重大改进。
  • 我昨天刚刚尝试了升级,不幸的是它没有解决问题。不过感谢您的建议。

标签: c# wpf touch


【解决方案1】:

所以今天我终于想通了。我在我的 App.xaml.cs 文件中注册了一个全局 TouchDown 事件处理程序,使用以下代码:

EventManager.RegisterClassHandler(typeof(UIElement), UIElement.TouchDownEvent, new EventHandler<TouchEventArgs>(MyEventHandler));

当我评论那条线时,一切都是 100% 的完美表现。我看到问题在于它在每个UIElement 上注册,而我真的只想在Window 上注册它。这似乎解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多