Подтвердить что ты не робот

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

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

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

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

Спасибо

4b9b3361

Ответ 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 с точки зрения измерения/расположения вычислений, если строки - это простые, но простые прямые, но если у вас потенциально будет сразу десять тысяч этих видимых Меня беспокоит производительность.

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