为什么触摸交互比 WPF 中的单击事件慢?
Why are touch interactions slower than click events in WPF?
我的 WPF 应用程序(正在生产)中发生了一个非常奇怪的场景。我在屏幕上有几个 <Button>
元素,它们在 XAML 代码隐藏中绑定了 Click
事件。按钮的点击处理程序使用 HttpClient
来点击 REST 端点(使用 await
/async
),然后用它接收到的数据更新屏幕。
此应用程序 运行 在一些廉价的戴尔平板电脑上,因此触摸屏是主要的交互方式。但是出于测试目的,我插入了鼠标。
当我用鼠标点击按钮时,应用程序是高性能的;换句话说,它很快。 REST 调用在 100 到 200 毫秒内完成。
当我点击屏幕按下按钮时,相信我,我已经确认点击了 完全相同的点击处理程序 并执行了 完全相同的代码路径,通常性能不佳。 完全相同 REST 调用突然花费了更长的时间。有时需要 2 秒。其他时候需要 10 秒。我无法解释为什么会出现这种差异。
当我在我的 Surface Pro 3(硬件比戴尔平板电脑好得多)上调试相同的应用程序时,我无法重现该问题。但如果这纯粹是硬件问题,我会想知道为什么它在某些情况下(使用鼠标)可以正常运行,但在其他情况下(使用触摸屏)却不能。
我一直在努力想出一个 MVCE,因为我尝试创建的精简分支似乎没有这个问题,但我会继续尝试编辑这个 post如果我能想出一个。
同时,我想知道是否还有其他人遇到过与触摸屏类似的问题。我的唯一理论是,关于 WPF 触摸处理程序的某些东西会在单独的线程或单独的上下文或具有单独的优先级(类似的东西)上触发。
所以今天我终于弄明白了。我在 App.xaml.cs 文件中注册了一个全局 TouchDown 事件处理程序,使用以下代码:
EventManager.RegisterClassHandler(typeof(UIElement), UIElement.TouchDownEvent, new EventHandler<TouchEventArgs>(MyEventHandler));
当我评论该行时,一切都在 100% 的时间内表现完美。我看到问题是它在每个 UIElement
上注册,而实际上我只想在 Window
上注册它。这似乎解决了我的问题。
我的 WPF 应用程序(正在生产)中发生了一个非常奇怪的场景。我在屏幕上有几个 <Button>
元素,它们在 XAML 代码隐藏中绑定了 Click
事件。按钮的点击处理程序使用 HttpClient
来点击 REST 端点(使用 await
/async
),然后用它接收到的数据更新屏幕。
此应用程序 运行 在一些廉价的戴尔平板电脑上,因此触摸屏是主要的交互方式。但是出于测试目的,我插入了鼠标。
当我用鼠标点击按钮时,应用程序是高性能的;换句话说,它很快。 REST 调用在 100 到 200 毫秒内完成。
当我点击屏幕按下按钮时,相信我,我已经确认点击了 完全相同的点击处理程序 并执行了 完全相同的代码路径,通常性能不佳。 完全相同 REST 调用突然花费了更长的时间。有时需要 2 秒。其他时候需要 10 秒。我无法解释为什么会出现这种差异。
当我在我的 Surface Pro 3(硬件比戴尔平板电脑好得多)上调试相同的应用程序时,我无法重现该问题。但如果这纯粹是硬件问题,我会想知道为什么它在某些情况下(使用鼠标)可以正常运行,但在其他情况下(使用触摸屏)却不能。
我一直在努力想出一个 MVCE,因为我尝试创建的精简分支似乎没有这个问题,但我会继续尝试编辑这个 post如果我能想出一个。
同时,我想知道是否还有其他人遇到过与触摸屏类似的问题。我的唯一理论是,关于 WPF 触摸处理程序的某些东西会在单独的线程或单独的上下文或具有单独的优先级(类似的东西)上触发。
所以今天我终于弄明白了。我在 App.xaml.cs 文件中注册了一个全局 TouchDown 事件处理程序,使用以下代码:
EventManager.RegisterClassHandler(typeof(UIElement), UIElement.TouchDownEvent, new EventHandler<TouchEventArgs>(MyEventHandler));
当我评论该行时,一切都在 100% 的时间内表现完美。我看到问题是它在每个 UIElement
上注册,而实际上我只想在 Window
上注册它。这似乎解决了我的问题。