我创建了一个简单的应用程序,其中包含ListBox
和1000个非常短的字符串。 (没有明确的ItemTemplate
)。
如果我真的很快滚动它 - 有黑洞(我认为CPU不能快速渲染)。
同时如果我在ItemsControl
中使用ScrollViewer
- 一切都还可以。
为什么?能以某种方式减慢ListBox
的滚动速度吗?
当用户在屏幕上看到这些黑洞时,他们会感到非常困惑。
更新:在设备上重现(HTC HD7 7.10.7740)。我通过ItemSource
Repro项目:https://www.dropbox.com/s/lgcod878srnctp0/SLTK_LLS_TEST.zip
Repro video(!):https://www.dropbox.com/s/t25dguq0vaa88o9/WP_20111213_113729Z.mp4
答案 0 :(得分:4)
默认情况下ListBox
启用了“虚拟化”(确切地说:类似于UI容器虚拟化),它不会加载完整列表,只是片段。滚动时,必须先渲染项目,当您快速滚动时,您会注意到此渲染延迟。这是由VirtualizingStackPanel
实现的。优点是,它节省了内存。
使用自定义ItemsPanel
时,您可以停用虚拟化:
<ListBox x:Name="YourListbox">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
...但解决方案将从一开始就占用更多资源。长长的名单可能会变得危险。
反过来说,你可以enable virtualization on your ItemsControl
,为了测试目的,你应该能够实现渲染延迟(“黑洞”)。
答案 1 :(得分:1)
你的琴弦有多长?这是否可以轻松而明智地分成一个非常简短的摘要(8-10个字符)?如果是这样,你可能想看一下试图解决这个问题的LazyListBox(它的目的是为了比你所说的更复杂的布局,所以好处可以忽略不计)