Ответ 1
Adorners требуют немного больше работы, чем использование ControlTemplates для большинства целей. Если вам нужна дополнительная функциональность, которую предоставляют adorners, используйте их. В противном случае используйте ControlTemplates.
Вот основные функции, которые Adorners приносят в таблицу:
- Поскольку акордеры находятся на отдельном слое, визуальный может выходить за пределы украшенного элемента, даже если украшенный элемент обрезается.
- Поскольку обложки находятся на отдельном слое, они обычно не закрываются контейнером AdornedElement или элементами управления сайтом.
- Аниматоры автоматически уведомляются обо всех изменениях размера и местоположения украшенного элемента, позволяя отвечать на изменения макета, которые не так легко достижимы с помощью обычных элементов управления.
- Adorners могут применяться к панелям и существующим элементам управления без каких-либо изменений в их шаблонах или иным образом. Это делает их хорошими для обеспечения манипуляционных манипуляций или визуальной обратной связи при произвольных элементах управления.
- Во многих сценариях вы создадите украшения только для нескольких "активных" предметов из сотен или тысяч. Реализация одной и той же функциональности с использованием ControlTemplates может быть значительно менее эффективной, если вам нужно добавить дополнительную панель в шаблон: у каждого отдельного процесса шаблона будет дополнительная панель, тогда как будет только один adorner.
Вот некоторые из потенциальных затрат, связанных с использованием adorners в отличие от ControlTemplates:
- Вы должны написать код для вызова
.GetAdornerLayer()
и.Add()
и управлять временем жизни Adorner - Вы должны либо написать код рендеринга для своего Adorner, либо добавить код, чтобы включить
Control
в качестве дочернего элемента adorner, чтобы вы могли использовать ControlTemplate с ним. - Обычно вы выполняете свои собственные меры/организуете вычисления в коде (если вы не используете ControlTemplate в своем adorner)
- Вам нужно переслать
RoutedEvents
в AdornedElement, если вы хотите, чтобы они обрабатывались целевым элементом управления - Вам нужно добавить
DataContext="{Binding AdornedElement.DataContext}"
, если вы хотите передать DataContext через - Похоже, что видимый Adorner сканируется на каждом макете, поэтому одновременное появление на экране многих тысяч украшений на экране может привести к заметным замедлениям. (У обычных визуальных объектов есть только код своей меры/расположения, когда происходит изменение того, что непосредственно влияет на них.)
- Не поддерживается более 144 анонсов, поэтому шаблоны управления более подходят, если есть риск приблизиться к этому пределу.
В ваших конкретных примерах нет четких правильных ответов.
-
Я бы наклонился к использованию ControlTemplate для точек подключения, так как вам, вероятно, понадобится способ указать местоположения точек подключения, а ControlTemplate уже определяет макет самого элемента. С другой стороны, если информация о точке подключения управляется данными и отображается только на активном элементе управления (или перетаскивании элемента управления), лучше использовать adorners, чтобы получить преимущества производительности и упростить отдельные контрольные шаблоны.
-
Автоматически позиционированная метка может быть подходящей для adorner с точки зрения измерения/расположения вычислений, если строки - это простые, но простые прямые, но если у вас потенциально будет сразу десять тысяч этих видимых Меня беспокоит производительность.
Не зная больше о вашем приложении, трудно сказать больше, чем это.