Когда я должен использовать adorners?

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

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

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

Спасибо

47
задан g t 1 March 2016 в 06:58
поделиться

1 ответ

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

Вот основные особенности, которые добавляют украшения в таблицу:

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

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

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

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

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

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

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

76
ответ дан 26 November 2019 в 19:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: