2009-02-26 108 views
1

我正在開發一個Silverlight應用程序,它在列表框控件中顯示項目,並且我遇到了一些性能問題。Silverlight Listbox與ListBox性能問題

列表框中的每個項目都是一個帶有一些格式化文本等的自定義堆棧面板。

當我列出500個或更少的項目列表框可以正常工作,但加載超過這個會導致問題。在1000件商品中,即使我沒有做任何事情,Silverlight也會消耗10%的cpu,cpu經常使用32-36%的3000件商品。

這是在一臺雙核心機器上,在一臺老機器上,我測試了一下CPU的使用情況。

這也影響幀率,我得到一個3000項目列表框,這使得應用程序呆滯6fps。

有誰知道可能是什麼原因造成的?我的第一個想法是Silverlight試圖渲染所有的項目,即使這些項目在屏幕外......這似乎是一致的,就像我插入項目的Visability.Collapsed一樣,額外的cpu開銷並不存在。 PS:我正在windowless =「true」中運行,因爲我需要顯示一些html silverlight表單的ontop。

回答

3

您應該在Silverlight 2中使用DataGrid,因爲它支持UI虛擬化。它已經過數百萬個項目的測試,只會創建需要展示的足夠的視覺效果。

+0

謝謝我會研究使用datagrid,看看會發生什麼.. – JSmyth 2009-02-26 20:47:40

1

你的猜測基本上是正確的。雖然Silverlight不會嘗試在列表框中顯示所有3000個元素,但它仍然需要創建3000個ListBoxItem對象,而這些對象在佈局時間內依次得到Measured和Arranged等,只有在渲染時才能修剪它們。當元素處於摺疊狀態時佈局發生得更快(因爲在這種情況下佈局基本上沒有任何作用)。

WPF有VirtualizingStackPanel可以解決這個問題,不幸的是Silverlight沒有這個元素。

1

爲了在這種情況下使用Silverlight DataGrid,請確保您有latest version installed,因爲默認的Silverlight SDK版本有一些缺陷。

另一種選擇是使用免費的Silverlight DataGrid控件available here。其中一個功能是虛擬StackPanel行容器,這意味着網格可以處理無限數量的行。

比較每個人的表現,看看哪一種在你的情況下效果最好。

0

只是一個觀察 - 它看起來像Silverlight 4不再是一個問題。向數據模板列表框中添加100K元素是瞬間的,它也呈現得很好。