2010-04-07 21 views
41

WPF es genial porque hay muchas maneras de lograr tus objetivos. Por ejemplo, por lo que entiendo, los adornos pueden agregar algunos controles a un elemento de IU, pero creo que se puede lograr el mismo comportamiento a través de un control personalizado que contiene el elemento adicional.¿Cuándo debo usar adornos?

Entonces, mi pregunta es: ¿cuándo debería preferir los adornos a un control personalizado más complejo (pero creo que más flexible)? Tenga en cuenta que estoy usando extensamente el patrón MVVM y me gustaría vincular comandos al elemento adicional.

En particular, estoy diseñando una aplicación de diseñador de diagramas y me gustaría agregar puntos de conexión a mis formas. Otro ejemplo donde debería decidir entre un control personalizado y un adorno es una línea que muestra una etiqueta posicionada automáticamente para "seguir" la línea.

Gracias

Respuesta

68

Adorners necesita un poco más de trabajo que el uso de ControlTemplates para la mayoría de los propósitos. Si desea la funcionalidad adicional que proporcionan los adornos, úselos. De lo contrario, use ControlTemplates.

Estas son las principales características que Adorners traen a la mesa:

  1. Debido adorners están en una capa separada, el visual se puede extender más allá del elemento adornado, incluso si el elemento adornada se recorta.
  2. Debido a que los adornos están en una capa separada, generalmente no están oscurecidos por el contenedor de AdornedElement o por los controles de los hermanos.
  3. Adorners son notificados automáticamente de todos los cambios en el tamaño y la ubicación del elemento adornado, permitiendo respuestas a cambios de diseño que no se logran tan fácilmente con los controles normales.
  4. Adorners se pueden aplicar a paneles y controles existentes sin realizar ningún cambio en sus plantillas o de lo contrario. Esto los hace buenos para proporcionar identificadores de manipulación o comentarios visuales sobre controles arbitrarios.
  5. En muchos escenarios creará adornos solo para unos pocos elementos "activos" entre cientos o miles. Implementar la misma funcionalidad usando ControlTemplates puede ser dramáticamente menos eficiente si tiene que agregar un Panel adicional a la plantilla: Cada instalación individual de la plantilla tendrá el panel extra, mientras que solo habrá un adorno.

Éstos son algunos de los posibles costos asociados con el uso adorners en contraposición a ControlTemplates:

  1. Debe escribir código para llamar .GetAdornerLayer() y .Add() y gestionar el tiempo de vida de la Adorner
  2. Debe escriba código de renderizado para su Adorner o agregue código para incluir un Control como un hijo del adornador para que pueda usar un ControlTemplate con él
  3. Por lo general, hará sus cálculos personalizados de medidas/arreglos en bacalao e (a menos que utilice un ControlTemplate dentro de su adorner)
  4. que necesitará para reenviar RoutedEvents a la AdornedElement si quieres que sean manejados por el control de destino
  5. Usted tendrá que añadir un DataContext="{Binding AdornedElement.DataContext}" si quieres para traer el DataContext a través de
  6. Parece que Adorner visible se escanea en cada pase de diseño, por lo que tener muchos miles de adornos en pantalla a la vez puede dar lugar a ralentizaciones notables. (Las imágenes visuales solo tienen su código measure/arrange llamado cuando algo que les afecta directamente cambia)
  7. Having more than 144 adorners is not supported, por lo que las plantillas de control son más adecuadas si existe algún riesgo de acercarse a este límite.

En sus ejemplos particulares, no hay respuestas correctas a la derecha.

  • Me inclino por el uso de un ControlTemplate de puntos de conexión ya que será presumiblemente necesita una forma de especificar la ubicación de los puntos de conexión, y la ControlTemplate ya se está definiendo la disposición del artículo en sí mismo. Por otro lado, si la información del punto de conexión está basada en datos y solo aparece en el control activo (o en el control arrastrado), sería mejor usar adornos para obtener las ventajas de rendimiento y simplificar las plantillas de control individuales.

  • Una etiqueta colocada automáticamente podría ser una buena opción para un adornador desde un punto de vista de medición/cálculo si las líneas no son simples líneas rectas, pero si potencialmente tendrá diez mil visibles a la vez estaría preocupado por el rendimiento.

Sin saber más acerca de su aplicación, es difícil decir más que esto.

+3

Muchas gracias, es una respuesta genial y completa. La aplicación es un diseñador de UML, por lo que no creo que tenga demasiadas conexiones; de todos modos, generalmente no son líneas rectas. – fra

Cuestiones relacionadas