2010-08-18 37 views
2

使用ScrollViewer修飾項目集合控件時,性能會降低。在我正在開發的特定應用程序中,當我使用ScrollViewer裝飾VirtualizingStackPanel時,應用程序似乎受到了很大的衝擊。我正試圖在這個特定的容器中加載250個項目,希望用戶可以滾動瀏覽所有250個項目。有人可以對ScrollViewer的內部有所瞭解,爲什麼它的包含會減慢應用程序的初始負載?ScrollViewer的性能問題

<ScrollViewer 
HorizontalScrollBarVisibility="Auto" 
VerticalScrollBarVisibility="Auto" 
Visibility= "Visible"> 

<ListView ItemsSource="{Binding EmployeeAccounts}"> 
    <ListView.ItemsPanel > 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel /> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 
</ScrollViewer> 

感謝

回答

6

第一件事:你想使用平滑滾動?如果是這樣,您將禁用虛擬化,並且需要逐項滾動(CanContentScroll = true)。

另外,你在itemcontrol中使用這個嗎?如果不是,那麼您需要推出自己的產品,因爲VirtualizingStackPanel適用於託管它的itemscontrol。

最後,你使用的是數據分組嗎?如果是這樣,那麼你又不幸運了。

除了這三件事情之外,在項目控件中使用virtualizingstackpanel應該不會出現滾動問題。請注意,UI VirtualizationData Virtualization之間存在差異 - 請檢查Bea Stollnitz's blog中的那兩個條目以獲取一些很好的信息。

+0

感謝您的及時回覆。我有ListView中的VirtualizingStackPanel。我沒有使用數據分組。我將使用示例XAML編輯我的帖子。我想我的帖子中我不太清楚,我還想知道的是,這些WPF控件(如ScrollViewer/VirtualizingStackPanel)如何從內部工作以及這些控件的各種組合如何抑制某些行爲。 – 2010-08-18 23:44:12

2

你的問題是,爲了知道屏幕上的什麼項目,VirutalizingStackPanel必須與ScrollViewer交互,這隻有在VirtualizingStackPanel和ScrollViewer在同一個控件中時纔有效。

這就是爲什麼如果你使用內置滾動的ListView(面板和ScrollViewer都在同一個控件內),但這不工作,如果你用ScrollViewer包裝ListView(面板在控件內部,ScrollViewer在外面)。

將ListView(或任何其他ItemsControl)置於ScrollViewer中取消虛擬化。

+0

謝謝。我嘗試刪除ScrollViewer,加載時間更快,但內置滾動的ListView不滾動數據集中的所有元素。從屏幕溢出的元素不再可滾動。 ListView ScrollViewer能夠處理海量數據集嗎? – 2010-08-19 10:03:18

+0

@sc_ray - ListView有點奇怪,所以我真的不確定,我寫了一個vitualizing面板,並將它用於ItemsControl和ListBox - 所以我知道那裏發生了什麼。如果你有大量的數據集,也許你需要使用DataGrid(WPF 4和WPF工具包的一部分用於3.5 http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-datagrid-feature-walkthrough.aspx)我從來沒有使用DataGrid自己,但這正是它創建的場景 – Nir 2010-08-19 11:26:10

+0

DataGrid確實看起來像一個選項。是什麼讓這件事變得有點棘手呢,就是每一個EmployeeAccounts本身都是複雜的對象。我必須找出在應用程序啓動時加載(或延遲加載)250個方法。我將嘗試探索datagrid。如果在類似的情況下使用Datagrid有任何成功案例,那將會很有幫助。 – 2010-08-19 13:48:34