我正在測試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配對)
我的搜索仍在延續的東西出現在我的應用程序泄露內存和幾個小時後減慢它停了下來。
什麼是每秒更新一次? ObservableCollection?它如何更新(項目添加,全部替換,刪除項目等)? – Jay 2010-06-11 13:32:18
_myObservableCollection.Insert(0,newItem) – 2010-06-11 14:18:59