最佳化效能:控制項

Windows Presentation Foundation (WPF) 包含許多在大部分 Windows 應用程式中使用的通用使用者介面 (UI) 元件。 本主題包含提升 UI 效能的技巧。

顯示大型資料集

WPF 控制項,例如 ListViewComboBox,可用來顯示應用程式中的項目清單。 如果要顯示的清單是大型清單,可能會影響應用程式的效能。 這是因為標準版面配置系統會建立與清單控制項相關聯之每個項目的版面配置容器,並計算其版面配置的大小和位置。 一般而言,您不需要同時顯示所有項目;而可以改為顯示子集,讓使用者自行捲動清單。 在此情況下,使用虛擬化 UI 就是合理的作法,這表示,系統會延後產生項目的項目容器和相關聯的版面配置計算,直到顯示項目為止。

UI 虛擬化是清單控制項的重要層面。 請不要將 UI 虛擬化和資料虛擬化混淆。 UI 虛擬化只會在記憶體中存放可見的項目;若為資料繫結案例,則會在記憶體中存放整個資料結構。 相反地,資料虛擬化只會在記憶體中存放螢幕上顯示的資料項目。

根據預設,當使用者的清單項目繫結至資料時,會針對 ListViewListBox 控制項啟用 UI 虛擬化。 您可以將 VirtualizingStackPanel.IsVirtualizing 附加屬性設定為 true,以啟用 TreeView 虛擬化。 如果您想要為衍生自 ItemsControl 的自訂控制項或使用 StackPanel 類別的現有項目控制項啟用 UI 虛擬化,例如 ComboBox,您可以將 ItemsPanel 設定為 VirtualizingStackPanel ,並將 IsVirtualizing 設定為 true。 不過,您可能會停用這些控制項的 UI 虛擬化而不自知。 以下是停用 UI 虛擬化的條件清單。

在虛擬化項目容器時,也應該考量是否具有與項目所屬之項目容器相關聯的其他狀態資訊。 在這種情況下,您必須將其他狀態儲存起來。 例如,您可能有包含在 Expander 控制項中的項目,且 IsExpanded 狀態會繫結至項目的容器,而不是專案本身。 當容器重複使用於新項目時, IsExpanded 的目前的值會用於新項目。 此外,舊項目會遺失正確的 IsExpanded 值。

目前,WPF 控制項皆未內建支援資料虛擬化。

容器回收

.NET Framework 3.5 SP1 中新增的 UI 虛擬化最佳化,適用於繼承自 ItemsControl 的控制項, 容器回收, 也可以改善卷動效能。 在填入使用 UI 虛擬化的 ItemsControl 時,它會針對捲動檢視範圍內的每個項目建立其項目容器,並針對捲動檢視範圍外的每個項目終結其項目容器。 「容器回收」可讓控制項針對不同的資料項目重複使用現有的項目容器,因此,系統不會持續建立項目容器,並會在使用者捲動 ItemsControl 時終結項目容器。 您可以選擇將附加 VirtualizationMode 屬性設定為 Recycling,以啟用項目回收。

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

支援雙向虛擬化

VirtualizingStackPanel 內建支援水平或垂直的單向 UI 虛擬化。 如果您想要使用控制項的雙向虛擬化,則必須實作自訂面板以擴充 VirtualizingStackPanel 類別。 VirtualizingStackPanel 類別會公開虛擬方法,例如 OnViewportSizeChangedLineUpPageUpMouseWheelUp。這些虛擬方法可讓您偵測清單可見部分的變更,並據以處理它。

最佳化範本

視覺化樹狀結構包含應用程式中所使用的所有視覺項目。 除了直接建立的物件,它也包含範本展開所帶來的物件。 例如,當您建立 Button 時,也會在可視化樹狀結構中取得 ClassicBorderDecoratorContentPresenter 物件。 如果您尚未最佳化控制項範本,視覺化樹狀結構中就可能會建立許多不必要的物件。 如需視覺化樹狀結構的詳細資訊,請參閱 WPF 圖形呈現概觀

延後捲動

根據預設,當使用者拖曳捲軸上的捲動方塊時,內容檢視就會不斷更新。 如果控制項中的捲動變慢,請考慮使用延後捲動。 延後捲動時,只有當使用者放開捲動方塊之後,才會更新內容。

若要實作延後捲動,請將 IsDeferredScrollingEnabled 屬性設定為 trueIsDeferredScrollingEnabled 是附加屬性,可以在 ScrollViewer 上設定,以及在其控制項範本中具有 ScrollViewer 的任何控制項。

實作效能功能的控制項

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

控制 Virtualization 容器回收 延後捲動
ComboBox 可以啟用 可以啟用 可以啟用
ContextMenu 可以啟用 可以啟用 可以啟用
DocumentViewer 無法使用 無法使用 可以啟用
ListBox 預設 可以啟用 可以啟用
ListView 預設 可以啟用 可以啟用
TreeView 可以啟用 可以啟用 可以啟用
ToolBar 無法使用 無法使用 可以啟用

注意

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

另請參閱