Оптимизация производительности: элементы управленияOptimizing performance: Controls

Windows Presentation Foundation (WPF) включает многие общие компоненты пользовательского интерфейса, используемые в большинстве приложений Windows.Windows Presentation Foundation (WPF) includes many of the common user-interface (UI) components that are used in most Windows applications. В этом разделе описываются методы повышения производительности пользовательского интерфейса.This topic contains techniques for improving the performance of your UI.

Отображение больших наборов данныхDisplaying large data sets

Элементы управления WPF, такие как ListView и ComboBox, используются для вывода списков элементов в приложении.WPF controls such as the ListView and ComboBox are used to display lists of items in an application. Если отображаемый список большой, это может повлиять на производительность приложения.If the list to display is large, the application's performance can be affected. Причина этого в том, что стандартная система макета создает контейнер макета для каждого элемента, связанного с элементом управления «Список», и вычисляет размер и положение его макета.This is because the standard layout system creates a layout container for each item associated with the list control, and computes its layout size and position. Как правило, не требуется отображать все элементы одновременно; можно отображать подмножество элементов, и пользователь будет прокручивать список.Typically, you do not have to display all the items at the same time; instead you display a subset, and the user scrolls through the list. В этом случае имеет смысл использовать виртуализацию пользовательского интерфейса, что означает, что создание контейнера элемента и вычисление связанной разметки для элемента откладывается до тех пор, пока этот элемент не станет видимым.In this case, it makes sense to use UI virtualization, which means the item container generation and associated layout computation for an item is deferred until the item is visible.

Виртуализация пользовательского интерфейса является важным аспектом элементов управления «Список».UI Virtualization is an important aspect of list controls. Не следует путать виртуализацию пользовательского интерфейса с виртуализацией данных.UI virtualization should not be confused with data virtualization. Виртуализация пользовательского интерфейса хранит в памяти только видимые элементы, но в сценариях привязки данных хранит в памяти всю структуру данных.UI virtualization stores only visible items in memory but in a data-binding scenario stores the entire data structure in memory. В отличие от этого виртуализация данных хранит в памяти только элементы данных, которые отображаются.In contrast, data virtualization stores only the data items that are visible on the screen in memory.

По умолчанию виртуализация пользовательского интерфейса включается для элементов управления ListView и ListBox, когда их элементы списка привязаны к данным.By default, UI virtualization is enabled for the ListView and ListBox controls when their list items are bound to data. TreeView виртуализацию можно включить, задав для присоединенного свойства VirtualizingStackPanel.IsVirtualizing значение true.TreeView virtualization can be enabled by setting the VirtualizingStackPanel.IsVirtualizing attached property to true. Если вы хотите включить виртуализацию пользовательского интерфейса для пользовательских элементов управления, которые являются производными от ItemsControl или существующих элементов управления, использующих класс StackPanel, например ComboBox, можно установить ItemsPanel в VirtualizingStackPanel и установить IsVirtualizing в true.If you want to enable UI virtualization for custom controls that derive from ItemsControl or existing item controls that use the StackPanel class, such as ComboBox, you can set the ItemsPanel to VirtualizingStackPanel and set IsVirtualizing to true. К сожалению, вы можете отключить виртуализацию пользовательского интерфейса для этих элементов управления, не осознавая этого.Unfortunately, you can disable UI virtualization for these controls without realizing it. Ниже приведен список условий, отключающих виртуализацию пользовательского интерфейса.The following is a list of conditions that disable UI virtualization.

  • Контейнеры элементов добавляются непосредственно в ItemsControl.Item containers are added directly to the ItemsControl. Например, если приложение явно добавляет ListBoxItem объекты в ListBox, ListBox не выполняет виртуализацию объектов ListBoxItem.For example, if an application explicitly adds ListBoxItem objects to a ListBox, the ListBox does not virtualize the ListBoxItem objects.

  • Контейнеры элементов в ItemsControl относятся к разным типам.Item containers in the ItemsControl are of different types. Например, Menu, использующий объекты Separator, не может реализовать повторное использование элементов, так как Menu содержит объекты типа Separator и MenuItem.For example, a Menu that uses Separator objects cannot implement item recycling because the Menu contains objects of type Separator and MenuItem.

  • Для параметра CanContentScroll значение false.Setting CanContentScroll to false.

  • Для параметра IsVirtualizing значение false.Setting IsVirtualizing to false.

Важным аспектом при виртуализации контейнеров элементов является наличие информации о дополнительном состоянии, связанной с контейнером элемента, принадлежащим этому элементу.An important consideration when you virtualize item containers is whether you have additional state information associated with an item container that belongs with the item. В этом случае необходимо сохранить это дополнительное состояние.In this case, you must save the additional state. Например, у вас может быть элемент, содержащийся в элементе управления Expander, а IsExpanded состояние привязано к контейнеру элемента, а не к самому элементу.For example, you might have an item contained in an Expander control and the IsExpanded state is bound to the item's container, and not to the item itself. При повторном использовании контейнера для нового элемента текущее значение IsExpanded используется для нового элемента.When the container is reused for a new item, the current value of IsExpanded is used for the new item. Кроме того, старый элемент теряет правильное значение IsExpanded.In addition, the old item loses the correct IsExpanded value.

В настоящее время элементы управления WPF не предоставляют встроенную поддержку виртуализации данных.Currently, no WPF controls offer built-in support for data virtualization.

Повторное использование контейнераContainer recycling

Оптимизация виртуализации пользовательского интерфейса, добавленная в .NET Framework 3,5 SP1 для элементов управления, которые наследуют от ItemsControl , является перезапуском контейнера, что также может повысить производительность прокрутки.An optimization to UI virtualization added in the .NET Framework 3.5 SP1 for controls that inherit from ItemsControl is container recycling, which can also improve scrolling performance. При заполнении ItemsControl, использующего виртуализацию пользовательского интерфейса, он создает контейнер элементов для каждого элемента, который прокручивается в представление, и удаляет контейнер элемента для каждого элемента, который прокручивается из представления.When an ItemsControl that uses UI virtualization is populated, it creates an item container for each item that scrolls into view and destroys the item container for each item that scrolls out of view. Повторное использование контейнеров позволяет элементу управления повторно использовать существующие контейнеры элементов для различных элементов данных, чтобы контейнеры элементов не создавались и уничтожались постоянно при прокрутке ItemsControl.Container recycling enables the control to reuse the existing item containers for different data items, so that item containers are not constantly created and destroyed as the user scrolls the ItemsControl. Можно включить повторное использование элементов, установив для присоединенного свойства VirtualizationMode значение Recycling.You can choose to enable item recycling by setting the VirtualizationMode attached property to Recycling.

Любой ItemsControl, поддерживающий виртуализацию, может использовать повторное использование контейнеров.Any ItemsControl that supports virtualization can use container recycling. Пример включения повторного использования контейнеров в ListBoxсм. в разделе повышение производительности прокрутки списка.For an example of how to enable container recycling on a ListBox, see Improve the Scrolling Performance of a ListBox.

Поддержка двунаправленной виртуализацииSupporting bidirectional virtualization

VirtualizingStackPanel предлагает встроенную поддержку виртуализации пользовательского интерфейса в одном направлении: по горизонтали или по вертикали.VirtualizingStackPanel offers built-in support for UI virtualization in one direction, either horizontally or vertically. Если вы хотите использовать двунаправленную виртуализацию для элементов управления, необходимо реализовать пользовательскую панель, расширяющую класс VirtualizingStackPanel.If you want to use bidirectional virtualization for your controls, you must implement a custom panel that extends the VirtualizingStackPanel class. Класс VirtualizingStackPanel предоставляет виртуальные методы, такие как OnViewportSizeChanged, LineUp, PageUpи MouseWheelUp. Эти виртуальные методы позволяют обнаруживать изменения в видимой части списка и соответствующим образом реагировать на них.The VirtualizingStackPanel class exposes virtual methods such as OnViewportSizeChanged, LineUp, PageUp, and MouseWheelUp.These virtual methods enable you to detect a change in the visible part of a list and handle it accordingly.

Оптимизация шаблоновOptimizing templates

Визуальное дерево содержит все визуальные элементы приложения.The visual tree contains all the visual elements in an application. В дополнение к непосредственно созданным объектам оно также содержит объекты, возникшие из-за расширения шаблона.In addition to the objects directly created, it also contains objects due to template expansion. Например, при создании Buttonвы также получаете ClassicBorderDecorator и ContentPresenter объекты в визуальном дереве.For example, when you create a Button, you also get ClassicBorderDecorator and ContentPresenter objects in the visual tree. Без оптимизации шаблонов элементов управления может быть создано большое число дополнительных ненужных объектов в визуальном дереве.If you haven't optimized your control templates, you may be creating a lot of extra unnecessary objects in the visual tree. Дополнительные сведения см. в разделе Общие сведения об отрисовке графики в WPF.For more information on the visual tree, see WPF Graphics Rendering Overview.

Отложенная прокруткаDeferred scrolling

По умолчанию, когда пользователь перетаскивает бегунок в полосе прокрутки, представление содержимого постоянно обновляется.By default, when the user drags the thumb on a scrollbar, the content view continuously updates. Если скорость прокрутки в элементе управления низкая, рассмотрите возможность использования отложенной прокрутки.If scrolling is slow in your control, consider using deferred scrolling. При отложенной прокрутке содержимое обновляется только в том случае, когда пользователь отпускает бегунок.In deferred scrolling, the content is updated only when the user releases the thumb.

Чтобы реализовать отложенную прокрутку, задайте для свойства IsDeferredScrollingEnabled значение true.To implement deferred scrolling, set the IsDeferredScrollingEnabled property to true. IsDeferredScrollingEnabled является присоединенным свойством и может быть задано для ScrollViewer и любого элемента управления с ScrollViewer в его шаблоне элемента управления.IsDeferredScrollingEnabled is an attached property and can be set on ScrollViewer and any control that has a ScrollViewer in its control template.

Элементы управления, реализующие функции производительностиControls that implement performance features

В следующей таблице приведены общие элементы управления для отображения данных и их поддержка функций производительности.The following table lists the common controls for displaying data and their support of performance features. Сведения о том, как включать эти функции, см. в предыдущих разделах.See the previous sections for information on how to enable these features.

Элемент управленияControl ВиртуализацияVirtualization Повторное использование контейнераContainer recycling Отложенная прокруткаDeferred scrolling
ComboBox Можно включитьCan be enabled Можно включитьCan be enabled Можно включитьCan be enabled
ContextMenu Можно включитьCan be enabled Можно включитьCan be enabled Можно включитьCan be enabled
DocumentViewer НедоступноNot available НедоступноNot available Можно включитьCan be enabled
ListBox Значение по умолчаниюDefault Можно включитьCan be enabled Можно включитьCan be enabled
ListView Значение по умолчаниюDefault Можно включитьCan be enabled Можно включитьCan be enabled
TreeView Можно включитьCan be enabled Можно включитьCan be enabled Можно включитьCan be enabled
ToolBar НедоступноNot available НедоступноNot available Можно включитьCan be enabled

Примечание

Пример включения виртуализации и повторного использования контейнеров на TreeViewсм. в разделе улучшение производительности TreeView.For an example of how to enable virtualization and container recycling on a TreeView, see Improve the Performance of a TreeView.

См. такжеSee also