【问题标题】:UI stops rendering in WPF applicationUI 停止在 WPF 应用程序中呈现
【发布时间】:2014-09-19 19:02:41
【问题描述】:

我有一个 WPF 应用程序,它的行为似乎是随机的。运行一段时间后,UI 停止渲染。它根本没有更新,最后更新的视图一直显示。鼠标悬停操作不会像通常那样触发复选框和其他项目的标记。如果我最小化应用程序并再次恢复它,整个窗口就会变黑。这不是 UI 线程被占用的问题,应用程序仍然响应。例如,如果我右键单击鼠标,则会出现上下文菜单,我可以像往常一样从中选择菜单项。如果该项目弹出一个对话框,则该对话框出现并且行为正常,但底层 UI 仍未呈现。 UI 中的所有按钮都是可点击的,即使它们在 UI 变黑后不可见。将鼠标悬停在附有工具提示的项目上时会弹出工具提示。

这种情况经常发生在让应用程序运行一段时间的计算机离开时。

以前有人见过这种行为吗?关于什么可能导致它的任何想法?我该如何调试呢?我什至不知道从哪里开始。

编辑:我在 UI 冻结时运行了 Ants Performance Profiler,“% Processor Time”接近 - 有时高于 - 100%。

编辑:事实证明,每次我进入 Windows 锁定屏幕并再次返回时都会发生这种情况。我不知道为什么会发生这种情况,但它与一个自定义依赖属性有关,该属性是为了对 SetWindowLong、GetWindowLong 和 SetWindowPos 进行 p/invoke 调用而实现的。依赖属性按预期工作,除非从 Windows 锁定屏幕返回。不使用它是问题的“解决方案”。

【问题讨论】:

  • 更新你的显卡驱动。
  • 您是否附加了内存\性能分析器来观察发生这种情况时内存和处理的情况?
  • 关于显卡驱动:重构后出现此问题。非重构版本不显示此行为。这让我得出结论,这是代码的问题,而不是视频驱动程序。
  • 我使用 GPU 分析器进行了分析,但它没有给我任何有用的信息。一开始 GPU 负载是 50%,但后来我查看时它只有 15% 左右,而且 UI 仍然没有刷新。
  • @Fls'Zen 这似乎与我的症状非常相似。您可以尝试查找依赖属性和 Win32 API(请参阅问题中的第二个编辑部分)。

标签: wpf user-interface rendering


【解决方案1】:

我现在正面临这个:-(

在四处挖掘之后,我在一个新样式中找到了原因,该样式将 BitmapCacheBrush 与 BitmapCache 一起使用。

在此处查看重现:https://github.com/dotnet-campus/wpf-issues/tree/master/BitmapCache

一个快速修复是使用机器范围的注册表设置禁用全局硬件加速:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration

https://stackoverflow.com/a/2169657/1196586

或针对特定的 wpf-control/Window

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;

https://stackoverflow.com/a/9802870/1196586

或者干脆不使用 BitmapCache。

功劳归于: https://weblog.west-wind.com/posts/2017/Feb/13/Video-Rendering-Issues-for-WPF-Windows#workaround-disable-hardware-acceleration

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2017-12-14
    相关资源
    最近更新 更多