2010-04-07 2 views
41

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

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

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

Спасибо

ответ

68

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

Вот основные особенности, которые приводят к графических элементов таблицы:

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

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

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

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

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

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

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

+3

Большое спасибо, это отличный ответ. Приложение является дизайнером UML, поэтому я не думаю, что у меня будет слишком много соединений; во всяком случае, обычно они не прямые. – fra