我正在开发一个Silverlight应用程序,它在列表框控件中显示项目,但我遇到了一些性能问题。
列表框中的每个项目都是自定义堆栈面板,其中包含一些格式化文本等。
当我有500个或更少项目的列表时,列表框工作正常,但加载超过这个会导致问题。在1000个项目中,Silverlight将消耗10%的CPU,即使我没有做任何事情,在3000个项目中cpu不断使用32-36%。
这是在一台双核机器上,在一台旧机器上,我测试了cpu的使用情况。
这也影响帧速率,我得到6fps的3000项目列表框,这使得应用程序运行缓慢。
有谁知道可能导致这种情况的原因?我的第一个想法是Silverlight正在尝试渲染所有项目,即使项目在屏幕外...这似乎是一致的,好像我插入了具有Visability.Collapsed的项目,额外的cpu开销不存在。
PS:我在无窗口运行=“true”,因为我需要在我的silverlight表单上显示一些html。
答案 0 :(得分:3)
您应该在Silverlight 2中使用DataGrid,因为它支持UI虚拟化。它已经过数百万项测试,只能创建足够的视觉效果来显示。
答案 1 :(得分:1)
你的猜测基本上是正确的。虽然Silverlight不会尝试渲染 ListBox中的所有3000个元素,但它仍然需要创建3000个ListBoxItem对象,这些对象在布局时间内依次得到Measured and Arranged等,仅限于它们被剪切到渲染时间。当元素折叠时,布局发生得更快(因为在这种情况下基本上没有布局要做)。
WPF有VirtualizingStackPanel来解决这个问题,遗憾的是Silverlight没有这个元素。
答案 2 :(得分:1)
在此方案中使用Silverlight DataGrid的+1,请确保您拥有latest version installed,因为默认的Silverlight SDK版本有一些错误。
另一种选择是使用免费的Silverlight DataGrid Control available here。其中一个功能还是Virtual StackPanel行容器,这意味着网格可以处理无限数量的行。
比较每种产品的性能,看看哪种效果最佳。
答案 3 :(得分:0)
只是一个观察 - 看起来这不再是Silverlight 4的问题。将100K元素添加到数据模板化列表框中是即时的,它也可以很好地呈现。
答案 4 :(得分:0)
这帮助了我:Silverlight DeferredLoadListBox 。 它由微软员工David Anson撰写。
DeferredLoadListBox
来自ListBox
,但性能要好得多。