WPF触摸应用程序(部分)在.NET Framework 4.7上冻结

Bru*_*o V 7 c# wpf touch .net-4.7

更新

微软承认这个问题:

Gepost door Microsoft op 13/10/2017 om 11:38

感谢您报告此事.我们已经意识到这个问题并且正在将其修复到.NET的未来版本中.还有一个相关问题正在服务修复中发布,这将大大降低遇到此问题的可能性.这将很快得到服务.

问题

我们的WPF应用程序正在使用触摸(没有手写笔)的平板电脑上使用,我们在安装.NET Framework 4.7后遇到问题.使用应用程序一段时间后可能会出现两种情况:应用程序完全冻结,必须重新启动或禁用所有触摸功能PopupWindow元素.两者之间存在很大差异,但我相信原因是一样的.

场景1:完全冻结

  • 应用程序完全没有响应,必须使用任务管理器关闭应用程序
  • 可以使用Touch或鼠标
  • 有时在应用程序挂起之前会抛出以下错误:

指数数组的边界之外.

这是堆栈跟踪:

   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Windows.Input.StylusWisp.WispLogic.CoalesceAndQueueStylusEvent(RawStylusInputReport inputReport)
   at System.Windows.Input.StylusWisp.WispLogic.ProcessSystemEvent(PenContext penContext, Int32 tabletDeviceId, Int32 stylusDeviceId, Int32 timestamp, SystemGesture systemGesture, Int32 gestureX, Int32 gestureY, Int32 buttonState, PresentationSource inputSource)
   at System.Windows.Input.PenContext.FireSystemGesture(Int32 stylusPointerId, Int32 timestamp)
   at System.Windows.Input.PenThreadWorker.FireEvent(PenContext penContext, Int32 evt, Int32 stylusPointerId, Int32 cPackets, Int32 cbPacket, IntPtr pPackets)
   at System.Windows.Input.PenThreadWorker.ThreadProc()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart() 
Run Code Online (Sandbox Code Playgroud)

场景2:部分冻结

  • 主窗口仍然响应(通过鼠标和触摸),但任何"覆盖"的内容(模态对话框,Window,Popup从元DatePicker,ComboBox...)不以攻回应.必须重新启动应用程序才能重新启用触摸.
  • 鼠标仍可用于"叠加"元素.

此处还详细说明了此问题.可以在此处找到问题发生后的行为视频.

附加信息

  • 这两种方案都可以在不同类型的平板电脑上进行模拟,也可以在Windows模拟器上使用Windows 8.1和Windows 10进行模拟.
  • 删除.NET Framework 4.7时,问题已得到解决
  • 通过ComboBox用多个手指快速点击一些元素,可以轻松地再现场景2 .几分钟后,弹出窗口不再响应触摸.
  • 场景1更难以模拟并随机发生.

原因

这个问题似乎与StylusWisp代码有关.我想它突然失败并在那之后变得无法使用.

通过使用DisableWPFTabletSupportDisableStylusAndTouchSupport禁用Stylus支持时,问题将消失.然而,任何ScrollViewerPanningMode="Both"不能刷卡了滚动.

解?

一个类似的问题已经被报告给微软.由于目前还没有太多的支持,修复可能需要一段时间.与此同时,我正在寻找解决此问题的解决方案,该解决方案不涉及禁用.NET Framework 4.7并保持原始触摸支持不变.有没有人有同样的问题和更好的解决方案?

lin*_*exi 3

为什么它在 Windows10 Creators Update 的 .NET Framework 4.7 中出现问题?

我的朋友lsj从https://referencesource.microsoft.com下载源代码,发现.NET 4.7 for Windows 10 Creators Update没有加锁WispLogic.CoalesceAndQueueStylusEvent,另一个加了锁。

因此,它仅在 Windows10 Creators Update 的 .NET Framework 4.7 中出现问题。.NET Framework 4.7 RTM添加了锁WispLogic.CoalesceAndQueueStylusEvent并修复了它。

哪个版本加了锁?

哪个版本解除锁定?

有趣的是.NET 4.7 RTM添加了锁WispLogic.CoalesceAndQueueStylusEvent,而.NET 4.7.1 Downlevel将其删除。

适用于 Windows 10 April 2018 Creators Update 的 .NET 4.7.2是第一个添加锁定的版本,它似乎在 .NET 4.7.2 中修复,但在 .NET 4.7.1 中未修复