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


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

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

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

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

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

По умолчанию виртуализация пользовательского интерфейса включена для элементов управления ListView и ListBox при привязке элементов списка к данным. TreeView виртуализацию можно включить, установив для trueприсоединенное свойство VirtualizingStackPanel.IsVirtualizing. Если вы хотите включить виртуализацию пользовательского интерфейса для пользовательских элементов управления, производных от 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 Недоступно Недоступно Можно включить

Заметка

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

См. также