【发布时间】:2015-11-19 05:58:21
【问题描述】:
所以我有一个 ListView,它具有 16 行和 32 列的 UniformGrid,因为它是 ItemsPanelTemplate。 ItemsSource 绑定到具有两个属性的对象的 ObservableCollection:IsSelected 和 Value。 UniformGrid 中的每个单元格都包含一个 TextBlock,其 Text 属性绑定到其各自项目的 Value 属性。在此构造下方,我有一个 ScrollBar,其值范围从 0 到 255。调整此 ScrollBar 会更改此网格中所选项目的 Value 属性。
既然我已经画了那幅画,那就是问题所在。问题是当我选择了许多插槽并更改 ScrollBar 的值时,它会立即更新所有 TextBlocks,从而导致明显的滞后。我在互联网上搜索了解决这个问题的方法,阅读了许多关于提高渲染性能等的文章。我曾尝试使用 Glyphs 来提高文本渲染的速度,效果有所改善,但延迟仍然很明显。
如果我能以某种方式在每次值更改时只渲染一次文本,并将其复制到所有其他选定的插槽,我认为这会提高性能。有没有办法做到这一点?如果没有,我应该以不同的方式做这种事情吗?
【问题讨论】:
-
这可能会被击中或错过,但有时当您在 UI 中有这些类型的可拖动滚动条/滑块元素时,拖动会希望通过刷新 UI 元素的工作向事件队列发送垃圾邮件。一个潜在的解决方案是避免直接刷新这些元素,并在事件处理之间引入一个计时器或其他执行的东西,只会定期触发这些刷新。这样一来,您就不必排队等待大量级联请求来更新必须单独处理的 UI 元素...
-
...这实际上并不能加速单个刷新,但它有时可以通过定期刷新而不是向队列发送垃圾邮件(你可能会做 100比人眼可以感知的工作量多倍,例如)。您实际上可能不需要优化重绘,只需减少排队的过多绘图工作量即可。在您的情况下,由于刷新是在您背后发生的,您可能能够推迟对在事件处理之间以固定间隔触发刷新的值的更改。
标签: c# wpf performance text rendering