Ответ 1
Я думаю, что более кратко и понятно описать характеристики производительности каждой панели, чем пытаться дать абсолютное относительное сравнение производительности.
WPF делает два прохода при рендеринге контента: Measure и Arrange. Каждая панель имеет разные рабочие характеристики для каждого из этих двух проходов.
На эффективность прохода меры больше всего влияет способность панели приспосабливаться к растяжению с использованием выравниваний (или "Авто" в случае Grid
), а затем количество растягиваемых или автоматически измеряемых дочерних элементов. На производительность прохода Arrange влияет сложность взаимодействия между расположением макета разных дочерних элементов и, конечно, количеством дочерних элементов.
Иногда данные панели не легко поддаются нужной компоновке. Я создал элемент управления, для которого требовалось произвольное количество элементов, каждый из которых должен располагаться в определенном проценте доступного пространства. Ни один из элементов управления по умолчанию не делает этого. Попытка заставить их сделать это (посредством привязки к фактическому размеру родителя) приводит к ужасной производительности. Я создал панель макета на основе Canvas, которая достигла желаемого результата с минимальными затратами (я скопировал исходный текст для холста и изменил около 20 строк).
Доступные панели:
-
холст
Определяет область, в которой вы можете явно расположить дочерние элементы по координатам относительно области Canvas.
Холст имеет наилучшую производительность среди всех панелей для прохода аранжировки, поскольку каждому элементу статически назначается место. Проход измерения также имеет отличные характеристики, поскольку в этой панели нет концепции растяжения; каждый ребенок просто использует свой родной размер.
-
DockPanel
Определяет область, в которой вы можете расположить дочерние элементы по горизонтали или по вертикали относительно друг друга.
Dockpanel имеет очень простую схему компоновки, в которой элементы добавляются один за другим относительно предыдущего добавленного элемента. По умолчанию высота или ширина определяется собственным размером элемента (на основе сверху/снизу и слева/справа соответственно), а другое направление определяется свойством
Dock
если ширина или высота не определены. Пропуск от среднего до быстрого и проход от среднего до быстрого. -
сетка
Определяет гибкую область сетки, которая состоит из столбцов и строк.
Это может быть панель с наибольшей производительностью, если используется пропорциональный или автоматический размер. Расчет размера дочернего элемента может представлять собой сложную комбинацию собственного размера элемента и макета, заданного сеткой. Компоновка также является самой сложной из всех панелей. Производительность от медленной до средней для прохода меры и производительность от медленной до средней для прохода схемы.
-
StackPanel
Объединяет дочерние элементы в одну строку, которая может быть ориентирована горизонтально или вертикально.
StackPanel измеряет свои дочерние элементы, используя собственные или относительные размеры в противоположном направлении от своей ориентации и собственные размеры в направлении своей ориентации (выравнивание ничего не делает в этом направлении). Это делает его исполнителем среднего уровня в этой области. Порядок Аранжировки - это просто, просто выкладывая предметы по порядку. Вероятно, второе лучшее выступление для этого прохода. Средняя производительность для прохода измерения и высокая производительность для прохода макета.
-
VirtualizingPanel
Предоставляет платформу для элементов Panel, которые виртуализируют их дочерний сбор данных. Это абстрактный класс.
Базовый класс для реализации вашей собственной панели виртуализации. Загружает только видимые элементы, чтобы предотвратить ненужное использование памяти и процессора. НАМНОГО более производительный для наборов предметов. Вероятно, немного менее производительный для элементов, которые помещаются на экране из-за проверки границ. SDK предоставляет только один подкласс этого,
VirtualizingStackPanel
. -
WrapPanel
Позиционирует дочерние элементы в последовательном положении слева направо, разбивая содержимое на следующую строку на краю вмещающего блока. Последующее упорядочение происходит последовательно сверху вниз или справа налево, в зависимости от значения свойства Orientation.
Проход меры представляет собой довольно сложный проход, в котором самый большой элемент для конкретной строки определяет высоту строки, а затем каждый элемент в этой строке либо использует свою собственную высоту (если она есть), либо высоту строки. Этап макета прост: размещение каждого элемента один за другим в ряду, а затем переход к следующему ряду, когда для следующего элемента недостаточно места. Мера средней производительности пройти. Средняя и высокая производительность для прохода аранжировки.
Рекомендации:
Используйте наиболее эффективную панель, где это возможно
Сложность процесса макета напрямую зависит от поведения макета используемых вами производных от Panel элементов. Например, элемент управления Grid или StackPanel предоставляет гораздо больше функциональных возможностей, чем элемент управления Canvas. Ценой такого увеличения функциональности является увеличение затрат на производительность. Однако если вам не требуются функции, предоставляемые элементом управления Grid, следует использовать менее дорогостоящие альтернативы, например Canvas или пользовательскую панель.
От оптимизации производительности: макет и дизайн
Система макетов выполняет два прохода для каждого члена коллекции Children, проход для измерения и проход для аранжировки. Каждая дочерняя панель имеет свои собственные методы MeasureOverride и ArrangeOverride для достижения своего собственного поведения макета.
Во время прохождения мероприятия оценивается каждый член коллекции Children. Процесс начинается с вызова метода Measure. Этот метод вызывается в реализации родительского элемента Panel, и его не нужно явно вызывать для создания макета.
Сначала оцениваются свойства собственного размера UIElement, такие как Clip и Visibility. Это создает значение с именем constraintSize, которое передается в MeasureCore.
Во-вторых, обрабатываются свойства платформы, определенные в FrameworkElement, что влияет на значение constraintSize. Эти свойства обычно описывают характеристики размеров базового элемента UIElement, такие как его высота, ширина, поля и стиль. Каждое из этих свойств может изменить пространство, необходимое для отображения элемента. MeasureOverride затем вызывается с constraintSize в качестве параметра.
Примечание. Существуют различия между свойствами высоты и ширины, а также ActualHeight и ActualWidth. Например, свойство ActualHeight является вычисленным значением, основанным на других параметрах высоты и системе макетов. Значение задается самой системой макетов на основе фактического прохода рендеринга и поэтому может немного отставать от заданного значения свойств, таких как Высота, которые являются основой изменения ввода. Поскольку ActualHeight является вычисляемым значением, вы должны знать, что в него могут быть внесены множественные или инкрементные изменения в результате различных операций системы макетов. Система макета может вычислять требуемое пространство мер для дочерних элементов, ограничения родительским элементом и так далее. Конечная цель прохода меры - дать ребенку возможность определить его DesiredSize, который происходит во время вызова MeasureCore. Значение DesiredSize сохраняется Measure для использования во время прохода упорядочения контента.
Проход аранжировки начинается с вызова метода аранжировки. Во время прохода аранжировки родительский элемент Panel создает прямоугольник, представляющий границы дочернего элемента. Это значение передается в метод ArrangeCore для обработки.
Метод ArrangeCore оценивает DesiredSize дочернего элемента и оценивает любые дополнительные поля, которые могут повлиять на размер элемента, который отображается. ArrangeCore генерируетrangeSize, который передается методу ArrangeOverride Panel в качестве параметра. ArrangeOverride генерирует finalSize дочернего элемента. Наконец, метод ArrangeCore выполняет окончательную оценку свойств смещения, таких как поля и выравнивание, и помещает дочерний элемент в свой слот макета. Ребенок не должен (и часто не) заполняет все выделенное пространство. Затем элемент управления возвращается в родительскую панель, и процесс верстки завершен.