Windows Phone Mango 列表框滚动

3

我使用了ListBox,并在其中创建了包含1000个非常短的字符串的简单应用程序。(没有显式的ItemTemplate)。如果我快速滚动它 - 就会出现黑洞(我想是因为CPU无法快速渲染)。

同时,如果我在ScrollViewer中使用ItemsControl - 一切都正常。

为什么?我是否可以通过某种方式减缓ListBox中的滚动速度? 当用户看到屏幕上的这些黑洞时,可能会感到非常困惑。

更新:在设备上重现(HTC HD7 7.10.7740)。我使用了ItemSource进行数据绑定。

可复现项目: https://www.dropbox.com/s/lgcod878srnctp0/SLTK_LLS_TEST.zip

可复现的视频(!): https://www.dropbox.com/s/t25dguq0vaa88o9/WP_20111213_113729Z.mp4


你的字符串是在XAML中绑定还是添加的? - Joseph Le Brech
听起来你是在模拟器上进行测试。你所经历的不是软件技术问题,因此我们无法给出答案。 - Claus Jørgensen
我在设备上进行测试(顺便提一下,所有与性能相关的事情都应该在设备上测试)。在撰写这样的结论之前,最好自己尝试重现问题。 - Grigory
2个回答

4
ListBox默认启用“虚拟化”(准确地说是UI容器虚拟化),它不会加载完整的列表,只加载片段。当滚动时,它必须先呈现项目,当您快速滚动时,您会注意到这种呈现延迟。这是通过VirtualizingStackPanel实现的。优点是节省了内存。
当使用自定义ItemsPanel时,可以禁用虚拟化:
<ListBox x:Name="YourListbox">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

...但是解决方案从一开始就会占用更多资源。在长列表中可能会变得危险。

相反,您可以在您的ItemsControl上启用虚拟化,为了测试目的,您应该能够实现渲染延迟(“黑洞”)。在这里了解如何使用VirtualizingStackPanel在Silverlight for Windows Phone 7中实现虚拟化功能


谢谢!它有效了!滚动变得有点不太灵敏,但没关系。可悲的是初始化时间太长了。 你知道吗,我其实不理解一件事。为什么我们不能将虚拟化与控制渲染速度配对使用呢?因此,如果itemContainerGenerator无法快速完成其工作,我们应该简单地稍微减慢滚动速度... 再次感谢! - Grigory
很高兴听到我能帮忙。哈哈,是的,我也在我的应用程序中遇到了长时间初始化的问题,目前还没有好的解决方案。 - thmshd
1
不仅初始加载时间会很长,当你点击返回按钮回到列表屏幕时,渲染也需要很长时间。我的建议仍然是启用虚拟化,并实现类似于“BatchObservableCollection”的东西(我在Shawn Burke的惊人框架http://agfx.codeplex.com/中找到了它),以逐个显示项目(可定制),这样当用户看到空白屏幕时,他知道项目还没有到达那个点。 - Justin XL

1
你的字符串有多长?它们是否可以轻松而明智地分成非常简短的摘要(8-10个字符)?如果是这样,您可能需要查看LazyListBox,它试图解决此问题(尽管它旨在用于比您讨论的更复杂的布局,因此好处可能微不足道)。

感谢您的回答!不幸的是它并没有帮到我。实际上,我不确定LazyListBox是否仍然与WP7.1相关。微软在Mango更新中显著改进了listbox中的滚动功能,并且一些第三方控件现在已经无用了。也许LazyListBox也是如此。 - Grigory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接