所以我有一个带有16行和32列的UniformGrid的ListView,因为它是ItemsPanelTemplate。 ItemsSource绑定到具有两个属性的对象ObservableCollection:IsSelected和Value。 UniformGrid中的每个单元格都包含一个TextBlock,其Text属性绑定到其各自项目的Value Property。在这个构造下面,我有一个ScrollBar,其值的范围是0到255.调整此ScrollBar会更改此网格中所选项的Value属性。
现在我画了那幅画,这就是问题所在。问题是当我选择了多个插槽并更改ScrollBar的值时,它会立即更新所有TextBlock,从而导致可见的延迟。我在互联网上搜索了解决这个问题的方法,阅读了很多关于提高渲染性能的文章等等。我已经尝试过使用Glyph来尝试提高文本渲染的速度,这显示出了改进,但是滞后仍然是可见的。
如果我能以某种方式每次更改值只渲染一次文本,并将其复制到所有其他选定的插槽,我认为这会提高性能。有没有办法做到这一点?如果没有,我应该采用不同的方式做这种事情吗?
答案 0 :(得分:1)
如果不是所有这些都可见,您可以通过查看使用VirtualizingStackPanel属性来减少延迟。
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling"
http://miteshsureja.blogspot.com/2011/05/virtualizing-stack-panel-in-wpf.html
此外,如果它是因为滚动条可以改变值的速度,并且UI的绘制无法跟上....你可以使用一个随时重新启动的Timer调用滚动条/滑块更改事件。
一旦计时器过去(假设您选择1秒)而没有被更改事件重新启动,则它会更新框全部绑定到的值,以便只有在用户停止移动滚动条/滑块时才会更新。
答案 1 :(得分:0)
似乎没有办法轻松地将渲染文本复制到其他TextBlocks。在保持即时响应的同时提高渲染性能的唯一方法是切换到Glyphs。如果我找到一种渲染文本的方法,并将其复制到剩余的字形,将更新答案。