Оптимизация производительности: Элементы управления
Windows Presentation Foundation (WPF) включает множество общих компонентов пользовательского интерфейса (UI), которые используются в большинстве приложений Windows. В этом разделе описываются методы повышения производительности пользовательского интерфейса.
Отображение больших наборов данных
Элементы управления WPF, такие как ListView и ComboBox используются для отображения списков элементов в приложении. Если отображаемый список большой, это может повлиять на производительность приложения. Причина этого в том, что стандартная система макета создает контейнер макета для каждого элемента, связанного с элементом управления «Список», и вычисляет размер и положение его макета. Как правило, не требуется отображать все элементы одновременно; можно отображать подмножество элементов, и пользователь будет прокручивать список. В этом случае имеет смысл использовать виртуализацию пользовательского интерфейса, что означает, что создание контейнера элемента и вычисление связанной разметки для элемента откладывается до тех пор, пока этот элемент не станет видимым.
Виртуализация пользовательского интерфейса является важным аспектом элементов управления «Список». Не следует путать виртуализацию пользовательского интерфейса с виртуализацией данных. Виртуализация пользовательского интерфейса хранит в памяти только видимые элементы, но в сценариях привязки данных хранит в памяти всю структуру данных. В отличие от этого виртуализация данных хранит в памяти только элементы данных, которые отображаются.
По умолчанию Виртуализация пользовательского интерфейса включена для ListView и ListBox элементы управления, если их элементы списка привязаны к данным. TreeView виртуализацию можно включить, задав VirtualizingStackPanel.IsVirtualizing вложенное свойство, чтобы true
. Если вы хотите включить виртуализацию пользовательского интерфейса для пользовательских элементов управления, которые являются производными от ItemsControl или существующих элементов управления, использующих StackPanel класс, например ComboBox, можно задать ItemsPanel для VirtualizingStackPanel и задайте IsVirtualizing для true
. К сожалению, вы можете отключить виртуализацию пользовательского интерфейса для этих элементов управления, не осознавая этого. Ниже приведен список условий, отключающих виртуализацию пользовательского интерфейса.
Контейнеры элементов добавляются непосредственно к ItemsControl. Например, если приложение явно добавляет ListBoxItem объектов ListBox, ListBox не виртуализирует ListBoxItem объектов.
Элемент контейнеров в ItemsControl принадлежат разным типам. Например Menu , использующий Separator объектов не может реализовать повторное использование элементов, так как Menu содержит объекты типа Separator и MenuItem.
Установка CanContentScroll для
false
.Установка IsVirtualizing для
false
.
Важным аспектом при виртуализации контейнеров элементов является наличие информации о дополнительном состоянии, связанной с контейнером элемента, принадлежащим этому элементу. В этом случае необходимо сохранить это дополнительное состояние. Например, возможно, элемент, содержащийся в Expander управления и IsExpanded состоянии привязан к контейнеру элемента, а не сам элемент. Когда контейнер используется повторно для нового элемента, текущее значение IsExpanded используется для нового элемента. Кроме того, старый элемент теряет правильное IsExpanded значение.
В настоящее время элементы управления WPF не предоставляют встроенную поддержку виртуализации данных.
Повторное использование контейнера
Оптимизация виртуализации пользовательского интерфейса, добавленные в .NET Framework 3.5 SP1 для элементов управления, которые наследуют ItemsControl — повторное использование контейнера, также, что может повысить быстродействие прокрутки. Когда ItemsControl , использующий виртуализацию пользовательского интерфейса, заполняется, он создает контейнер для каждого элемента, который попадает в представление и уничтожает контейнеры для каждого элемента, которые не попадают в представление. Повторное использование контейнера позволяет элементу управления повторно использовать существующие контейнеры элементов для различных элементов данных, это позволит контейнеры элементов не нужно постоянно создаются и уничтожаются при прокрутке пользователем ItemsControl. Вы можете активировать элемент, установив VirtualizationMode вложенное свойство, чтобы Recycling.
Любой ItemsControl , поддерживаемые виртуализации можно повторно использовать контейнер. Пример того, как включить повторное использование контейнера на ListBox, см. в разделе повышения производительности прокрутки ListBox.
Поддержка двунаправленной виртуализации
VirtualizingStackPanel предлагает встроенную поддержку виртуализации пользовательского интерфейса в одном направлении, горизонтально или вертикально. Если вы хотите использовать для элементов управления двунаправленную виртуализацию, необходимо реализовать пользовательскую панель, расширяющую VirtualizingStackPanel класса. VirtualizingStackPanel Класс предоставляет виртуальные методы, такие как OnViewportSizeChanged, LineUp, PageUp, и MouseWheelUp. Эти виртуальные методы позволяют обнаружить изменение в видимой части списка и обработать его соответствующим образом.
Оптимизация шаблонов
Визуальное дерево содержит все визуальные элементы приложения. В дополнение к непосредственно созданным объектам оно также содержит объекты, возникшие из-за расширения шаблона. Например, при создании Button, вы также получаете ClassicBorderDecorator и ContentPresenter объектов в визуальном дереве. Без оптимизации шаблонов элементов управления может быть создано большое число дополнительных ненужных объектов в визуальном дереве. Дополнительные сведения см. в разделе Общие сведения об отрисовке графики в WPF.
Отложенная прокрутка
По умолчанию, когда пользователь перетаскивает бегунок в полосе прокрутки, представление содержимого постоянно обновляется. Если скорость прокрутки в элементе управления низкая, рассмотрите возможность использования отложенной прокрутки. При отложенной прокрутке содержимое обновляется только в том случае, когда пользователь отпускает бегунок.
Чтобы реализовать отложенную прокрутку, задайте IsDeferredScrollingEnabled свойства true
. IsDeferredScrollingEnabled является присоединенным свойством и может устанавливаться на ScrollViewer и любой элемент управления, имеющий ScrollViewer в своем шаблоне элемента управления.
Элементы управления, реализующие функции производительности
В следующей таблице приведены общие элементы управления для отображения данных и их поддержка функций производительности. Сведения о том, как включать эти функции, см. в предыдущих разделах.
Элемент управления | Виртуализация | Повторное использование контейнера | Отложенная прокрутка |
---|---|---|---|
ComboBox | Можно включить | Можно включить | Можно включить |
ContextMenu | Можно включить | Можно включить | Можно включить |
DocumentViewer | Недоступно | Недоступно | Можно включить |
ListBox | Значение по умолчанию | Можно включить | Можно включить |
ListView | Значение по умолчанию | Можно включить | Можно включить |
TreeView | Можно включить | Можно включить | Можно включить |
ToolBar | Недоступно | Недоступно | Можно включить |
Note
Пример того, как включить виртуализацию и повторное использование контейнера в TreeView, см. в разделе повысить производительность элемента управления TreeView.