【问题标题】:Is there a way to reduce or prevent form flickering when using WPF?使用 WPF 时有没有办法减少或防止表单闪烁?
【发布时间】:2018-07-03 11:25:03
【问题描述】:

我实际上有 2 个不同的闪烁问题:

(1) 当我创建一个边框样式设置为无的表单时,每当我调整窗口大小时,表单边缘都会出现大量闪烁。如果我尝试从左上角调整表单大小,这一点尤其明显。

(2) 当我最小化表单并从任务栏恢复它时,在左上角(通常是标题)的(非常)短暂的一秒钟内,您会看到一个矩形闪烁。我认为这可能是正常的 Windows 行为,但由于 WPF 删除了 Windows 最小化/最大化动画,它变得更加明显。如果我不能以这种方式直接修复闪烁,是否可以在不使用 hacky 解决方案(例如在表单最小化之前设置边框大小)恢复最小/最大动画?

感谢阅读!

【问题讨论】:

  • 您是否运行了桌面窗口管理器 (dwm.exe)?启用 Aero 组合引擎后,调整大小应该相当流畅,但没有它,您可能会看到一些撕裂。在 Win32 层调整窗口大小和 WPF 重新呈现其内容(使用 不使用 DWM)之间也可能存在轻微延迟。这不是你能解决的问题。
  • 是否有任何代码或动画作为对调整大小的响应而执行? (OnSizeChanged, WindowState) 那些真的可以减慢速度
  • 我确实有一些事件,但我禁用了它们,因为我认为它们可能导致了问题,但它仍然会发生。我确实有 dwm 正在运行。我知道可能无法完全平滑地调整窗口大小(甚至 Visual Studio 本身也没有),但我将此行为与我安装的其他程序进行了比较,它们明显更平滑。例如,Firefox 和 Steam 都可以平滑地调整大小并且没有闪烁。我知道这不会是一个简单的解决方案,因为在我发布这篇文章之前我已经搜索了所有内容。这是 WPF 特定的问题吗?有没有更好的 GUI 框架可以使用?

标签: c# wpf


【解决方案1】:

我正在解决您在 #1 中提到的同一个问题,它并非特定于无边框 WPF 表单(尽管它似乎取决于绘制时间和窗口样式,当您更改边框类型时,这两者都可能会发生变化)。原生应用和全边框应用也会出现这种情况。

在 Windows 10 中,当您使用左侧和/或顶部窗口边框时,您实际上可以在 Windows 资源管理器中看到相同类型的闪烁。

根据我的调查,似乎至少有两个重叠的原因,一个可以追溯到 Aero 之前的日子,另一个是 Aero 添加的。 Aero 之前的原因有一种解决方法,但 Aero 的原因仍然只有部分解决方案。请参阅此综述问题/答案,它汇集了 10 年来关于该主题的帖子并提供了一些新见解(太长,无法在此问题中粘贴内容)。享受:

How to smooth ugly jitter/flicker/jumping when resizing windows, especially dragging left/top border (Win 7-10; bg, bitblt and DWM)?

是的,我知道在 SO 上,惯例是将原始问题标记为重复问题,而不是从一个问题链接到另一个问题,但是这种情况有点不寻常。我的综述文章提到了关于这个主题的 30 多个问题,并汇集了其中最重要的想法,但它不包括原始问题中的所有想法......这是不切实际的。所以我实际上不想看到标记为重复的原始问题,也不想看到我的,因为无论哪种方式,有用的信息都会丢失。那是因为窗口调整大小是一个广泛的话题。这个Q涵盖了一些方面,我的Q涵盖了其他方面。

【讨论】:

  • @Moritz 道歉接受。非常感谢;我真的很感激。我已经修改了这个答案,以包含更多与 OP 的 WPF 特定情况相关的详细信息。目前我的其他答案都不相同。在提到汇总 Q/A 之前,我在每个答案上写了 1-3 句话来解决每个问题的 OP 中的具体问题。但是,我认为您是对的;我需要查看每个答案并添加更多细节,以帮助特定的 OP 做出更好的答案。我现在就开始这样做。由于日常工作,我需要一两天才能完成这项任务。
  • 好吧,我花了几个小时拖延日常工作,并为每个答案添加了具体的定制建议,包括一些未出现在较大汇总问答中的新代码。
猜你喜欢
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 2020-02-08
  • 2015-09-29
  • 1970-01-01
  • 2015-06-20
相关资源
最近更新 更多