Поделиться через


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

Windows Presentation Foundation (WPF) включает множество общих компонентов интерфейса пользователя, которые используются в большинстве приложений Windows. В этом разделе содержатся методы повышения производительности пользовательского интерфейса.

В этом разделе содержатся следующие подразделы.

  • Отображение больших наборов данных
  • Повторное использование контейнера
  • Поддержка двунаправленной виртуализации
  • Оптимизация шаблонов
  • Отложенная прокрутка
  • Элементы управления, реализующие настройку производительности
  • Связанные разделы

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

Элементы управления WPF, такие как ListView и ComboBox, используются для отображения списков элементов в приложении. Если список для отображения большой, это может повлиять на производительность приложения. Это происходит потому, что стандартная система разметки создает контейнер разметки для каждого элемента, связанного с элементом управления в списке, и вычисляет размер и позицию разметки. Обычно не требуется отображать все элементы одновременно, вместо этого отображается некоторое подмножество, и пользователь прокручивает список. В этом случае, затрагивается виртуализация пользовательского интерфейса, и в результате генерирование контейнера элементов и вычисление связанной разметки замедляется, пока отображается элемент.

Виртуализация пользовательского интерфейса является важным аспектом элементов управления списка. Виртуализация пользовательского интерфейса не должна служить помехой виртуализации данных. Виртуализация пользовательского интерфейса хранит только видимые элементы в памяти, но в скриптах привязки данных в памяти сохраняется вся структура данных. Наоборот, виртуализация данных сохраняет в памяти только элементы данных, которые отображаются на экране.

По умолчанию виртуализация пользовательского интерфейса включена для элементов управления ListView и ListBox, если их элементы списка привязаны к данным. Виртуализацию TreeView можно включить, присвоив вложенному свойству VirtualizingStackPanel.IsVirtualizing значение true. Если нужно включить виртуализацию пользовательского интерфейса для настраиваемых элементов управления, производных от класса ItemsControl, или существующих элементов управления, использующих класс StackPanel, таких как ComboBox, можно установить свойство ItemsPanel для класса VirtualizingStackPanel и задать для свойства IsVirtualizing значение true. К сожалению, можно отключить виртуализацию пользовательского интерфейса, не зная этого. Далее представлен список условий, отключающих виртуализацию пользовательского интерфейса.

  • Контейнеры элементов добавляются напрямую к элементу управления ItemsControl. Например, если приложение явно добавляет объекты ListBoxItem к ListBox, ListBox не будет виртуализировать объекты ListBoxItem.

  • Установка для свойства CanContentScroll значения false.

  • Установка для свойства IsVirtualizing значения false.

  • Использование группирования элементов.

В настоящее время элементы управления WPF не предлагают встроенную поддержку виртуализации данных.

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

В пакет обновления 1 (SP1) для платформы .NET Framework 3.5 добавлена оптимизация виртуализации пользовательского интерфейса для элементов управления, наследующих от класса ItemsControl, — повторное использование контейнера, также это может повысить быстродействие прокрутки. Когда объект ItemsControl, использующий виртуализацию пользовательского интерфейса, заполняется, создается контейнер элементов для каждого отображаемого при прокрутке элемента, и контейнер элементов удаляется, когда элемент в результате прокрутки не отображается. Повторное использование контейнера позволяет элементу управления повторно использовать существующие контейнеры элементов для различных элементов данных, чтобы контейнеры элементов не создавались и не удалялись постоянно при прокрутке пользователем объекта ItemsControl. Можно выбрать повторное использование элементов, установив для VirtualizationMode свойство Recycling.

Повторное использование контейнера не используется при выполнении любого из следующих условий:

  • Контейнеры элементов добавляются напрямую к элементу управления ItemsControl. Например, объекты ListBoxItem добавляются к элементу управления ListBox.

  • Объект ItemsControl содержит контейнеры элементов различных типов. Например, объект Menu, использующий объекты Separator, не может реализовать повторное использование элементов, так как Menu содержит объекты типа Separator и MenuItem.

При повторном использовании контейнеров элементов важно решить, имеются ли дополнительные сведения о состоянии, связанные с контейнером элемента, принадлежащем этому элементу. В этом случае, необходимо сохранить дополнительное состояние. Например, элемент может находиться в элементе управления Expander, и состояние IsExpanded привязано к контейнеру элемента, а не к самому элементу. Если контейнер повторно используется для нового элемента, текущее значение свойства IsExpanded используется для нового элемента. Дополнительно, старый элемент теряет правильное значение IsExpanded.

Любой объект 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

Недоступно

Недоступно

Можно включить

ПримечаниеПримечание

Пример, как включить виртуализацию и повторное использование контейнера для TreeView, см. в разделе Практическое руководство. Повышение производительности элемента управления TreeView.

См. также

Задачи

Пошаговое руководство. Кэширование данных приложения WPF

Основные понятия

Система макета

Оптимизация производительности: разметка и разработка

Оптимизация производительности: привязка данных

Элементы управления

Стилизация и использование шаблонов