2010-06-11 141 views
13

我正在測試WPF DataGrid,希望替換一些WinForms控件,並且迄今爲止對開發過程非常滿意。表現似乎是我現在最關心的問題。我的開發工作站擁有運行Windows 7的市場上最好的cpu,具有6個DDR3內存。我正在更換的窗口控制器的響應更爲迅速,令人擔憂。WPF DataGrid性能問題

我的測試是綁定到ObservableCollection的DataGrid的基本實現,它每秒更新一次。它還包括可擴展的Details區域,以顯示有關每一行的更多信息。詳細信息區域只是一個ItemsControl環繞的StackPanel(重複6次)

我的抱怨是,如果我嘗試滾動這個集合,它往往生澀滯後,如果我試圖擴大每一行,因爲他們進來,大約15%的點擊不觸發按鈕點擊事件(DataGridTmplateColumn> CellTemplate> DataTemplate> Button) 如果某些行的細節被展開,滾動會更加緊張(滾動條會隨着它的上升/下降而自行調整大小)

尋找/優化/避免哪些事情?

更新

這裏有幾點我發現有用至今:

  • 依靠儘可能少的動態佈局。由於每個組件都包含許多子組件,並且在動態佈局環境中,所有組件都必須調用度量和佈局方法,這些方法可能是CPU密集型的。因此而不是列寬Auto(或未指定寬度),請使用固定寬度

  • 安裝WPF Performance Suite並與您的應用程序呈現方式聯繫。真實地真棒應用

  • 安德魯指出的ListView是一個偉大的選擇,因爲當你不需要先進的DataGrid功能,比如更新數據備份,或者可能詳細信息視圖(這我仍然希望能重現)

  • SuspendableObservableCollection是理想的,當你在很短的時間添加多個項目的期限(即0.01秒等100項)

  • 大量的測試後,我發現的BindingList比的ObservableCollection快得多。我發佈了性能分析器快照here,由BindingList和Observable集合處理相同的負載,前者佔用的CPU時間不到一半。 (請記住,這不只是收集的性能,但與一個ListView配對)

我的搜索仍在延續的東西出現在我的應用程序泄露內存和幾個小時後減慢它停了下來。

+0

什麼是每秒更新一次? ObservableCollection?它如何更新(項目添加,全部替換,刪除項目等)? – Jay 2010-06-11 13:32:18

+0

_myObservableCollection.Insert(0,newItem) – 2010-06-11 14:18:59

回答

1

你的意思是來自WPF Toolkit的DataGrid?如果是的話,我認爲它很慢,所以我最終使用ListView和GridView。

+0

是的,但在4.0中它是框架的一部分。 我會試試..但我會怎麼做顯示/隱藏行細節? – 2010-06-11 14:01:55

+0

在ListView中沒有RowDetails,當然你可以嘗試通過ControlTemplates來實現它,但是它很麻煩。因此,如果您需要拼寫的RowDetails,最好使用DataGrid控件的設置。 – Andrew 2010-06-12 09:11:15

2

DataGrid性能問題的一般提示:我在DataGrid中遇到了一個問題,即在調整窗口大小,列排序等操作後花費幾秒鐘的時間刷新數據,並鎖定窗口UI(1000行,5列)。

它回到了一個問題(錯誤?)與WPF大小計算。我把它放在一個RowDefinition Height =「Auto」的網格中,通過測量每一列和每一行的大小,導致渲染系統試圖在運行時重新計算DataGrid的大小,大概是通過填充整個網格據我所知)。它應該以某種方式智能處理,但在這種情況下不是。

快速檢查這是否是相關問題,是在測試期間將DataGrid的高度和寬度屬性設置爲固定大小,然後再次運行。一旦恢復性能,永久修復可以是這些選項中選擇:

  • 變化的含元件的尺寸可相(*)或 固定值
  • 集MaxHeight和數據網格到的MaxWidth固定值大 比它可能在正常使用
  • 得到嘗試另一個容器類型具有不同的大小調整戰略(電網,DockPanel中,等)
1

更一般提示:

對於滾動,我們所做的嘗試使用延期滾動。

要提高過濾性能,您可以考慮自己過濾綁定集合。

對於具有大量列的網格,也應用ColumnVirtualization。這往往會對水平滾動產生不利影響,但您可以測試您的場景並應用改進。對我們來說它確實工作得很好。它幫助我們實現了大型網格的刷新,重新加載和渲染場景。

性能也受到應用樣式的影響。