Когда я должен использовать украшения? - PullRequest
47 голосов
/ 07 апреля 2010

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

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

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

Спасибо

1 Ответ

75 голосов
/ 10 апреля 2010

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

Вот основные характеристики, которые Adorners приносят на стол:

  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.

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

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

...