ListBox的Silverlight Listbox性能问题

时间:2009-02-26 02:32:00

标签: performance silverlight listbox

我正在开发一个Silverlight应用程序,它在列表框控件中显示项目,但我遇到了一些性能问题。

列表框中的每个项目都是自定义堆栈面板,其中包含一些格式化文本等。

当我有500个或更少项目的列表时,列表框工作正常,但加载超过这个会导致问题。在1000个项目中,Silverlight将消耗10%的CPU,即使我没有做任何事情,在3000个项目中cpu不断使用32-36%。

这是在一台双核机器上,在一台旧机器上,我测试了cpu的使用情况。

这也影响帧速率,我得到6fps的3000项目列表框,这使得应用程序运行缓慢。

有谁知道可能导致这种情况的原因?我的第一个想法是Silverlight正在尝试渲染所有项目,即使项目在屏幕外...这似乎是一致的,好像我插入了具有Visability.Collapsed的项目,额外的cpu开销不存在。

PS:我在无窗口运行=“true”,因为我需要在我的silverlight表单上显示一些html。

5 个答案:

答案 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,但性能要好得多。