Update
微软承认了这个问题 https://connect.microsoft.com/VisualStudio/Feedback/Details/3139882:
Gepost 门 Microsoft op 13/10/2017 om 11:38
感谢您报告此事。
我们已意识到此问题,并将在未来版本的 .NET 中修复它。
服务修复中还发布了一个相关问题,这将大大降低遇到此问题的可能性。这将很快得到维护。
Problem
我们的 WPF 应用程序在使用触摸(无手写笔)的平板电脑上使用,并且在安装 .NET Framework 4.7 后遇到问题。使用应用程序一段时间后可能会出现两种情况:应用程序完全冻结并必须重新启动,或者所有触摸功能都无法使用。Popup
or Window
元素被禁用。两者之间存在很大差异,但我相信原因是相同的。
场景一:完全冻结
- 应用程序变得完全无响应,必须使用任务管理器关闭应用程序
- 触摸或鼠标均可使用
- 有时,在应用程序挂起之前会引发以下错误:
指数数组的边界之外。
这是堆栈跟踪:
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()
场景2:部分冻结
- 主窗口仍然具有响应性(通过鼠标和触摸),但任何“覆盖”内容(模态对话框、
Window
, Popup
元素来自DatePicker
, ComboBox
, ...) 不响应点击。必须重新启动应用程序才能重新启用触摸。
- 鼠标仍然可以在“覆盖”元素中使用。
这个问题也有详细解释here https://stackoverflow.com/questions/45721368/wpf-net-app-crashes-combobox-and-menu-events-not-fired-on-microsoft-surface-ta。
可以找到问题发生后的行为视频here https://www.dropbox.com/s/7fqf6fy8uvjnl7y/eb4309b4-8434-4082-aa4d-ad3244cbc774.WMV?dl=0.
附加信息
- 这两种场景都可以在不同类型的平板电脑上进行模拟,也可以在 Windows 模拟器上使用 Windows 8.1 和 Windows 10 进行模拟。
- 删除 .NET Framework 4.7 时解决了这些问题
- 场景2可以通过快速点击一些来轻松重现
ComboBox
具有多个手指的元素。几分钟后,弹出窗口不再响应触摸。
- 场景 1 较难模拟并且随机发生。
Cause
该问题似乎与 StylusWisp 代码有关。我想它会突然失败并且在那之后变得无法使用。
通过使用禁用手写笔支持时禁用 WPFTablet 支持 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/33828e1b-224a-4b73-86b5-9af949f07508/installing-net-452-breaks-microsofts-recommended-disablewpftabletsupport-method-for-disabling?forum=wpf or 禁用StylusAndTouchSupport https://support.microsoft.com/en-us/help/4033488/comexception-error-from-wpf-applications-after-the-net-framework-4-7-i,问题就消失了。然而,任何ScrollViewer
with PanningMode="Both"
无法再滑动滚动。
解决方案?
A 类似问题 https://connect.microsoft.com/VisualStudio/Feedback/Details/3139882已向微软报告。由于目前还没有太多支持,修复可能需要一段时间。与此同时,我正在寻找这个问题的解决方案不涉及禁用 .NET Framework 4.7这使得原装触摸支持完好无损。有人有同样的问题和更好的解决方案吗?