2012-07-07 67 views
0

我正在使用WPF數據網格(.Net或Toolkit),綁定到可觀察集合時速度慢得無法接受。它包含大約3500行和10列,並花費一分鐘時間來顯示內容。所有事情都指出了這樣一個事實,即它沒有對數據進行UI虛擬化。但是,我不明白爲什麼會這樣。我不使用分組。我不使用分組。 我已經確定網格的高度包含在一個固定高度的面板中。 我已經在DataGrid上設置了所有虛擬化屬性。 我已經在snoop中進行了檢查並設置了這些屬性。但是,snoop還顯示加載之後,可視樹中有數千個數據列。這是否是使用snoop引起的事情,我不知道。 我嘗試過使用AQTime來了解發生了什麼。減速似乎不在我們的代碼中,而是在系統代碼中。但是,我找不到一種輕鬆查看WPF是否合適的方法。 我已經剝離了網格並嘗試了.Net 4 DataGrid和工具包DataGrid。顯示最初數據的速度都非常緩慢。 我曾嘗試修復行高和列寬。這也沒有區別。調試WPF DataGrid虛擬化問題

我該如何確認虛擬化是否開啓以及是否關閉它爲什麼關閉? 如何調試我們的代碼之外發生的事情?有什麼方法可以看到WPF是什麼? (我嘗試過使用WPF性能套件,但出於某種原因,它不會爲我們的應用程序提供任何輸出)。

我正在用盡想法。當UI中只有10行可見時,它不應該這麼慢。

任何人都可以幫忙嗎?

+0

也許'ScrollViewer.CanContentScroll = false'?請參閱[爲什麼將ScrollViewer.CanContentScroll設置爲false禁用虛擬化](http://stackoverflow.com/q/3724593/620360)。 – LPL 2012-07-07 17:28:01

+0

非常感謝!這是原因。 – 2012-07-09 07:57:41

+0

我已將我的評論添加爲答案,以便可以關閉此問題。 – LPL 2012-07-09 09:13:21

回答

0

有關WPF 4.5中虛擬化功能的接受答案中的鏈接已經死了,但這裏有一個總結。

如果您使用的是WPF 4.5,您可以通過將ScrollViewer.CanContentScroll="true"(即不從默認值更改)和設置VirtualizingStackPanel.ScrollUnit="Pixel"來獲得基於像素的滾動和虛擬化。例如:

<ListView ItemsSource="{Binding YourItems}" 
    ItemTemplate="{StaticResource YourListItemTemplate}" 
    VirtualizingStackPanel.ScrollUnit="Pixel"/> 

我們看到4.7秒的平均呈現由文本框,組合框和按鈕,一個複雜的DataTemplate中的200個實例,但通過重新啓用CanContentScroll和設置ScrollUnit代替了渲染時間下降到0.08秒。