【发布时间】:2016-09-04 07:48:01
【问题描述】:
将 ListView 与数千个这样的项目一起使用:
<ListView ItemsSource="{Binding Items}"
VirtualizingPanel.ScrollUnit="Pixel"
VirtualizingPanel.VirtualizationMode="Recycling"
VirtualizingPanel.CacheLength="1,1">
<ListView.ItemTemplate>
<DataTemplate>
<local:ItemUserControl />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
如果我让ItemUserControl 中的每个项目具有不同的高度,我发现滚动非常慢。通过拖动拇指快速滚动时,每一帧大约需要 200-250 毫秒 来进行布局。
如果我将 VirtualizationMode 更改为 Standard,它会下降到 70-110 毫秒。
如果我另外将 ScrollUnit 更改为 Item 它会下降到 30-70 毫秒。
但是,如果我保留所有内容并简单地强制每个项目都相同 Height,它会下降到 5-7 毫秒。
此外,我发现在列表顶部滚动时,不同高度的滚动速度更快,而在底部滚动时慢得多。
我的猜测是,当重用 ItemUserControl 时,它的 Height 会发生变化,它会导致整个 ListView 的布局更新。尽管这并不能真正解释为什么它在开始时比在结束时表现更好。我也觉得这样的速度差异有点难以置信。
有人对 WPF 的布局系统有更深入的了解,并能解释为什么会这样吗?也许是实现
【问题讨论】:
-
刚刚检查 - 您是否将 ListView 的
设置为 VirtualizingStackPanel ? -
@DeanChalk 感谢您的健全性检查,根据msdn.microsoft.com/en-us/library/…,默认值已经是 VirtualizingStackPanel。虚拟化工作正常,滚动时太慢了。
标签: wpf performance listview layout