wpf adorner

wpf - ¿Cuándo debo usar adornos?



adorner (1)

WPF es genial porque hay muchas maneras de alcanzar tus metas. Por ejemplo, según entiendo, los adornos pueden agregar algunos controles a un elemento de la interfaz de usuario, pero creo que se puede lograr el mismo comportamiento a través de un control personalizado que contiene el elemento adicional.

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

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

Gracias


Los adornadores requieren un poco más de trabajo que usar ControlTemplates para la mayoría de los propósitos. Si quieres la funcionalidad adicional que proporcionan los adornos, úsalos. De lo contrario use ControlTemplates.

Aquí están las principales características que los Adorners traen a la mesa:

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

Estos son algunos de los costos potenciales asociados con el uso de adornos en lugar de las Plantillas de control:

  1. Debe escribir el código para llamar a .GetAdornerLayer() y .Add() y para administrar la vida útil de Adorner
  2. Debe escribir el código de representación para su Adorner o agregar un código para incluir un Control como elemento secundario del adornador para que pueda usar un ControlTemplate con él
  3. Por lo general, hará sus cálculos personalizados de medida / ordenación en el código (a menos que esté utilizando una Plantilla de Control en su adorno)
  4. Deberá reenviar RoutedEvents al elemento AdornedElement si desea que el control de destino los maneje.
  5. Tendrá que agregar un DataContext="{Binding AdornedElement.DataContext}" si desea 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 la pantalla a la vez puede dar lugar a notables ralentizaciones. (Los elementos visuales ordinarios solo tienen su código de medida / organización cuando algo que les afecta directamente cambia).
  7. No se admite tener más de 144 adornos , 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 y claras.

  • Me inclino por usar un ControlTemplate para los puntos de conexión, ya que probablemente necesitará una forma de especificar las ubicaciones de los puntos de conexión, y el ControlTemplate ya está definiendo el diseño del elemento en sí. Por otro lado, si la información del punto de conexión está controlada por datos y solo aparece en el control activo (o si se arrastra el control), podría ser 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 cálculo de orden / medición si las líneas no son más que simples líneas rectas, pero si potencialmente tiene diez mil de estos visibles al mismo tiempo, me preocuparía el rendimiento .

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