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

2024-06-22

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这使得原装触摸支持完好无损。有人有同样的问题和更好的解决方案吗?


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

我的朋友lsj https://blog.sdlsj.net/从下载源代码https://referencesource.microsoft.com https://referencesource.microsoft.com并找到适用于 Windows 10 创意者更新的 .NET 4.7 https://referencesource.microsoft.com/DotNet47RS2.zip还没有加锁WispLogic.CoalesceAndQueueStylusEvent另一个添加锁。

因此,它仅在 Windows 10 Creators Update 的 .NET Framework 4.7 中出现问题。和.NET Framework 4.7 RTM https://referencesource.microsoft.com/DotNet47RTM.zip将锁添加到WispLogic.CoalesceAndQueueStylusEvent并修复它。

哪个版本加了锁?

  • .NET 4.7 RTM https://referencesource.microsoft.com/DotNet47RTM.zip
  • .NET 4.7.2 RS4 https://referencesource.microsoft.com/DotNet472RS4.zip
  • .NET 4.7.2 ZDP https://referencesource.microsoft.com/DotNet472ZDP.zip
  • .NET 4.8 RTM https://referencesource.microsoft.com/DotNet48RTM.zip

哪个版本解除锁定?

  • .NET 4.6.2 RS1 https://referencesource.microsoft.com/dotnet462RS1.zip
  • .NET 4.6.2 RTM https://referencesource.microsoft.com/dotnet462RTM.zip
  • .NET 4.7 RS2 https://referencesource.microsoft.com/DotNet47RS2.zip
  • .NET 4.7.1 RS3 https://referencesource.microsoft.com/DotNet471RS3.zip
  • .NET 4.7.1 下层 https://referencesource.microsoft.com/DotNet471Downlevel.zip

有趣的是.NET 4.7 RTM https://referencesource.microsoft.com/DotNet47RTM.zip将锁添加到WispLogic.CoalesceAndQueueStylusEvent.NET 4.7.1 下层 https://referencesource.microsoft.com/DotNet471Downlevel.zip去掉它。

The 适用于 Windows 的 .NET 4.7.2 2018 年 4 月 10 日创意者更新 https://referencesource.microsoft.com/DotNet472RS4.zip是第一个添加锁的版本,它似乎在 .NET 4.7.2 中修复,但在 .NET 4.7.1 中未修复

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF 触摸应用程序(部分)在 .NET Framework 4.7 上冻结 的相关文章

  • 根据当前文化调用不同(本地化)视图

    我在用着LocalizationAttribute它实现了ActionFilterAttribute本地化视图 我简单地说 Localize 在控制器上 我使用 LocalizeStrings resx 文件根据当前线程上的语言进行应用 一
  • HTML 文档

    有没有一个工具可以从 VS2010 生成的 XML 文档文件生成 HTML 页面 我在谷歌上搜索了这样的工具 但没有找到 我下载并安装了SandCastle 但我不明白如何使用它 尝试使用Sandcastle 帮助文件生成器 http sh
  • OWIN AuthenticationOptions 在 mvc5 应用程序中运行时更新

    Hi 情况如下 我在 iis 7 上有一个带有 Identity 2 的 MVC 5 应用程序 该应用程序为多个网站提供服务 主机名是某些网站的关键 网站 另一个网站 等等 我决定在我的所有网站上使用谷歌外部登录 每个网站都应该是带有个人
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • 如何将 QSerialPort 模块添加到 CMake 中?

    我想将 QSerialPort 模块添加到 CMake 中 根据我的理解 我需要将QT 串口添加到 pro中 我只想使用 CMake 所以我尝试编译简单的 CMake 文件 但有错误 QtCore 正在工作 qDebug 可以毫无问题地显示
  • ObjectTrackingEnabled 和 linq-to-sql

    I read here http www sidarok com web blog content 2008 05 02 10 tips to improve your linq to sql application performance
  • 如果 .txt 文件不存在,则创建一个,如果存在则追加新行

    我想创建一个 txt 文件并写入它 如果该文件已经存在 我只想添加更多行 string path E AppServ Example txt if File Exists path File Create path TextWriter t
  • UWP - 绑定枚举差异

    我遇到了一个非常有趣的问题 假设 UWP 应用中有以下 XAML 页面内容
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • OpenMP 循环数组访问中的错误共享

    我想利用 OpenMP 来并行执行我的任务 我需要将数组的所有元素减去相同的数量并将结果写入另一个向量中 两个数组都是动态分配的malloc第一个填充了文件中的值 每个元素都有类型uint64 t pragma omp parallel f
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • WPF MVVM后台打印数据绑定问题

    我正在使用 wpf mvvm 开发一个销售点应用程序 在交易生命周期的许多阶段 都会在后台打印收据 我已经使用其他示例在后台生成和打印收据 我正在后台打印一个 UserControl 一切看起来都很棒 然后 我为该控件创建了 ViewMod
  • 是否有理由为什么用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常?

    我将简化代码以节省空间 但所提供的内容确实说明了核心问题 我有一个类 它的属性是基类型 有 3 个派生类可以分配给该属性 如果我将任何派生类分配给容器并尝试序列化容器 XmlSerializer 会抛出可怕的错误 类型 x 不是预期的 使用
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 如何在 Windows 8.1 上打开多个 Visual Studio 窗口? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用的是 Windows 7 我能够启动多个 Visual Studio 并同时工作 现在我有 Windows 8 1 操作系统 每当我
  • 如何通过 Excel 互操作对象自动调整列大小?

    下面是我用来将数据加载到 Excel 工作表中的代码 但我希望在加载数据后自动调整列的大小 有谁知道自动调整列大小的最佳方法 using Microsoft Office Interop public class ExportReport
  • 将 R 值传递给采用 L 值的函数时出现过载歧义

    我有 2 个重载函数 一个采用 L 值 另一个采用 R 值 目的是让该函数可以像这样调用 Obj obj foo obj OR foo Obj 所以 我写了2个重载函数 template
  • 64 位随机生成器种子

    我目前正在运行一个具有 8 个以上管道 线程 的多线程模拟应用程序 这些管道运行非常复杂的代码 该代码取决于种子生成的随机序列 然后该序列被归结为单个 0 1 我希望在将种子从主线程传递到处理管道后 这种 随机处理 具有 100 的确定性
  • 预览MouseMove 与 MouseMove

    我有相当多的 XAML 经验 但最近我注意到我的大多数同事都使用预览鼠标移动代替鼠标移动事件 我一直用鼠标移动它对我很有帮助 但我忍不住问我什么时候应该使用预览鼠标移动什么时候鼠标移动 有什么区别 各自有什么优点和缺点等等 PreviewM
  • 具有可导出私钥的证书的“错误密钥”例外

    我正在尝试使用非对称加密来加密然后解密文件 我已经使用 makecert 创建了一个测试证书并将其安装到我的个人本地计算机存储中 将来我必须在多个服务器上安装此证书 这就是为什么我使用 pe 标志创建它 即使用可导出的私钥 证书已成功创建并

随机推荐