Когда мне следует использовать украшения?

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

Итак, мой вопрос: когда я должен предпочесть украшения более сложному (но я думаю, более гибкому) настраиваемому элементу управления? Учтите, что я широко использую шаблон MVVM и хотел бы привязать команды к дополнительному элементу.

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

Спасибо


person fra    schedule 07.04.2010    source источник


Ответы (1)


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

Вот основные особенности, которые предлагают Украшатели:

  1. Поскольку украшения находятся на отдельном слое, визуальный элемент может выходить за пределы украшенного элемента, даже если украшенный элемент обрезан.
  2. Поскольку украшения находятся на отдельном слое, они обычно не закрываются контейнером AdornedElement или родственными элементами управления.
  3. Украшатели автоматически уведомляются обо всех изменениях в размере и расположении украшенного элемента, что позволяет реагировать на изменения макета, которые не так легко реализовать с помощью обычных элементов управления.
  4. Декорации можно применять к панелям и существующим элементам управления без внесения каких-либо изменений в их шаблоны или иным образом. Это делает их удобными для предоставления манипуляторов или визуальной обратной связи по произвольным элементам управления.
  5. Во многих сценариях вы будете создавать украшения только для нескольких «активных» предметов из сотен или тысяч. Реализация той же функциональности с помощью ControlTemplates может быть значительно менее эффективной, если вам нужно добавить дополнительную панель к шаблону: каждая отдельная инсталляция шаблона будет иметь дополнительную панель, тогда как будет только одно украшение.

Вот некоторые из потенциальных затрат, связанных с использованием декоративных элементов в отличие от ControlTemplates:

  1. Вы должны написать код для вызова .GetAdornerLayer() и .Add() и управления временем жизни Adorner
  2. Вы должны либо написать код рендеринга для своего Adorner, либо добавить код, чтобы включить Control в качестве дочернего элемента Adorner, чтобы вы могли использовать с ним ControlTemplate.
  3. Обычно вы выполняете свои собственные расчеты / расчеты в коде (если вы не используете ControlTemplate в своем украшении)
  4. Вам нужно будет перенаправить RoutedEvents в AdornedElement, если вы хотите, чтобы они обрабатывались целевым элементом управления.
  5. Вам нужно будет добавить DataContext="{Binding AdornedElement.DataContext}", если вы хотите передать DataContext через
  6. Похоже, что видимый Adorner сканируется при каждом проходе макета, поэтому одновременное отображение на экране многих тысяч украшений может привести к заметному замедлению. (У обычных визуальных элементов код измерения / упорядочения вызывается только тогда, когда что-то, что непосредственно влияет на них, изменяется.)
  7. Наличие более 144 декоративных элементов не поддерживается, поэтому шаблоны элементов управления более подходят, если они есть риск приблизиться к этому пределу.

В ваших конкретных примерах нет однозначных правильных ответов.

  • Я бы предпочел использовать ControlTemplate для точек подключения, поскольку вам, вероятно, понадобится способ указать расположение точек подключения, а ControlTemplate уже определяет макет самого элемента. С другой стороны, если информация о точке подключения управляется данными и отображается только на активном элементе управления (или элементе управления, который перетаскивается), может быть лучше использовать украшения, чтобы получить преимущества в производительности и упростить отдельные шаблоны ControlTemplates.

  • Автоматически позиционируемая этикетка может хорошо подходить для украшения с точки зрения расчета меры / упорядочения, если линии не являются простыми прямыми, но если у вас потенциально будет десять тысяч таких видимых сразу, я бы побеспокоился о производительности .

Не зная больше о вашем приложении, трудно сказать больше, чем это.

person Ray Burns    schedule 09.04.2010
comment
Большое спасибо, это отличный и полный ответ. Приложение является дизайнером UML, поэтому я не думаю, что у меня будет слишком много подключений; в любом случае, обычно это не прямые линии. - person fra; 12.04.2010