共用方式為


最佳化效能:控制項

更新: 2008 年 7 月

Windows Presentation Foundation (WPF) 包含大部分 Windows 應用程式所使用的許多常見使用者介面 (UI) 元件。本主題包含用於改善 UI 效能的技術。

這個主題包含下列章節。

  • 顯示大量資料集
  • 容器回收
  • 支援雙向虛擬化
  • 最佳化範本
  • 延後捲動
  • 實作效能功能的控制項
  • 相關主題

顯示大量資料集

ListViewComboBox 這類的 WPF 控制項是用於顯示應用程式的項目清單。如果要顯示的清單很大的話,應用程式的效能可能就會受到影響。這是因為標準的配置系統會針對與清單控制項相關聯的每個項目建立配置容器,並計算其配置大小和位置。一般而言,您不需要同時顯示所有的項目,而是改為顯示其子集,並讓使用者捲動清單。在這種情況下,就比較適合使用 UI「虛擬化」(Virtualization),這表示項目容器的產生作業和項目的相關聯配置計算作業,會延後到顯示項目時才進行。

UI 虛擬化是清單控制項的一個重要層面。UI 虛擬化不應與資料虛擬化混為一談。UI 虛擬化只會在記憶體中儲存可見項目,但會針對資料繫結的案例在記憶體中儲存整個資料結構。相對地,資料虛擬化則只會在記憶體中儲存螢幕上可見的資料項目。

根據預設,當 ListViewListBox 控制項的清單項目有繫結至資料時,就會啟用 UI 虛擬化。TreeView 虛擬化的啟用方式,是藉由將 VirtualizingStackPanel.IsVirtualizing 附加屬性設為 true 而達成的。如果要針對衍生自 ItemsControl 的自訂控制項或是使用 StackPanel 類別的現有項目控制項 (例如 ComboBox) 啟用 UI 虛擬化,可以將 ItemsPanel 設為 VirtualizingStackPanel 並將 IsVirtualizing 設為 true。可惜的是,您可能會在不了解的情況下停用這些控制項的 UI 虛擬化。下列清單是會停用 UI 虛擬化的情況。

目前沒有 WPF 控制項提供內建的資料虛擬化支援。

容器回收

在 .NET Framework 3.5 SP1 中,針對繼承自 ItemsControl 的控制項而加入的 UI 虛擬化最佳化是「容器回收」(Container Recycling),這個功能也有助於改善捲動效能。在填入使用 UI 虛擬化的 ItemsControl 時,會針對捲入檢視範圍內的每個項目建立項目容器,並針對捲出檢視範圍外的每個項目終結項目容器。容器回收可以讓控制項將現有項目容器重複使用於不同的資料項目,這樣就不會在使用者捲動 ItemsControl 時不斷建立和終結項目容器。藉由將 VirtualizationMode 設為 Recycling,即可以選擇啟用項目回收。

如果符合下列任何情況,就不會使用容器回收:

回收項目容器時有個重要的考量,就是屬於項目的項目容器是否有相關聯的額外狀態資訊。在這種情況下,您必須儲存額外的狀態。例如,您的項目可能包含在 Expander 控制項中,而 IsExpanded 狀態是繫結到項目的容器,而非項目本身。將容器重複使用於新項目時,會將目前的 IsExpanded 值用於新項目。此外,舊項目會遺失正確的 IsExpanded 值。

任何支援虛擬化的 ItemsControl 都可以使用容器回收。如需如何對 ListBox 啟用容器回收的範例,請參閱 HOW TO:改善 ListBox 的捲動效能

支援雙向虛擬化

VirtualizingStackPanel 提供您 UI 虛擬化的單向內建支援,可以是水平方向也可以是垂直方向的。如果要針對控制項使用雙向虛擬化,必須實作會擴充 VirtualizingStackPanel 類別的自訂面板。VirtualizingStackPanel 類別會公開 (Expose) 虛擬方法,例如 OnViewportSizeChangedLineUpPageUpMouseWheelUp。這些虛擬方法可以讓您偵測清單中可見部分的變更,並進行相對應的處理。

最佳化範本

視覺化樹狀結構包含應用程式中的所有視覺項目。除了直接建立的物件之外,也包含範本擴充所帶來的物件。例如,在建立 Button 時,在視覺化樹狀結構中也會有 ClassicBorderDecoratorContentPresenter 物件。如果您不曾最佳化控制項範本,則可能在視覺化樹狀結構中建立許多不必要的額外物件。您可以使用 XAMLPad 追蹤視覺化樹狀結構中的項目,並盡可能移除範本中不必要的項目。如需視覺化樹狀結構的詳細資訊,請參閱 Windows Presentation Foundation 圖形轉譯概觀

延後捲動

根據預設,在使用者拖曳捲軸的捲動方塊時,會不斷更新內容檢視。如果控制項中的捲動作業緩慢,請考慮使用延後捲動。在延後捲動的情況下,只有當使用者釋放捲動方塊時才會更新內容。

若要實作延後捲動,將 IsDeferredScrollingEnabled 屬性設為 true。IsDeferredScrollingEnabled 附加屬性的設定,可以用於 ScrollViewer 以及控制項範本中具有 ScrollViewer 的任何控制項。

實作效能功能的控制項

下表列出用於顯示資料的常見控制項,以及其支援的效能功能。如需如何啟用這些功能的詳細資訊,請參閱前面的小節。

控制項

虛擬化

容器回收

延後捲動

ComboBox

可以啟用

可以啟用

可以啟用

ContextMenu

可以啟用

可以啟用

可以啟用

DocumentViewer

無法使用

無法使用

可以啟用

ListBox

預設

可以啟用

可以啟用

ListView

預設

可以啟用

可以啟用

TreeView

可以啟用

可以啟用

可以啟用

ToolBar

無法使用

無法使用

可以啟用

注意事項:

如需如何對 TreeView 啟用虛擬化和容器回收的範例,請參閱 HOW TO:改善 TreeView 的效能

請參閱

概念

配置系統

最佳化效能:配置與設計

最佳化效能:資料繫結

控制項概觀

設定樣式和範本

變更記錄

日期

記錄

原因

2008 年 7 月

.NET Framework 3.5 Service Pack 1 的加入主題。

SP1 功能變更。