Compartir a través de


Arquitectura de extensibilidad de WPF Designer

WPF Designer for Visual Studio es un entorno de edición visual para elementos de WPF y Silverlight. WPF Designer se basa en un marco de trabajo con una arquitectura extensible, que puede ampliar para crear su propia experiencia de diseño personalizada.

Al extender el marco de WPF Designer, puede personalizar en gran medida el aspecto y el comportamiento del contenido de WPF y Silverlight en tiempo de diseño. Por ejemplo, puede extender WPF Designer de las maneras siguientes:

  • Personalizar los glifos de movimiento y cambio de tamaño con gráficos mejorados.

  • Agregar un menú contextual a la superficie de diseño que cambia el estado de un control.

  • Modificar el aspecto y el comportamiento de un control en tiempo de diseño en las distintas herramientas.

La arquitectura de WPF Designer admite toda la fuerza expresiva de WPF y Silverlight. Esto permite crear numerosas experiencia de diseño visual que antes no eran posibles.

Para obtener un ejemplo de cómo implementar una experiencia en tiempo de diseño personalizada para WPF y Visual Studio, vea Tutorial: Crear un adorno en tiempo de diseño

Para obtener un código de ejemplo en el que se muestra cómo se crean experiencias de diseño personalizadas para WPF y Silverlight, visite el sitio WPF Designer Extensibility Samples.

Marco de WPF Designer

El marco de WPF Designer es modular, lo que significa que al extender el tiempo de diseño, únicamente se extienden los elementos necesarios para sus propias características. No tiene que escribir gran cantidad de código de compatibilidad para habilitar sus características de diseño personalizadas.

El modelo de objetos está compuesto de cinco unidades funcionales, que se describen en la tabla siguiente.

Unidad funcional

Descripción

Modelo de edición

Interfaz de programación para los objetos del diseñador.

Proveedores de características

Punto de extensibilidad principal en el marco de trabajo del diseñador.

Contexto de edición

Almacén central para el estado de un diseñador.

Comandos, tareas y herramientas

Comandos, tareas y herramientas para procesar los datos proporcionados por el usuario.

Metadatos en tiempo de diseño

Ensamblados que contienen el comportamiento de un control en tiempo de diseño, para separar físicamente la lógica del diseñador de la lógica en tiempo de ejecución.

La siguiente ilustración muestra las unidades funcionales del marco de WPF Designer.

Modelo de objetos de alto nivel

Modelo de edición

El entorno de diseño interactúa con los controles de tiempo de ejecución mediante una interfaz de programación denominada modelo de edición. El modelo de edición está compuesto de tres subunidades funcionales: un modelo, un contenedor público que abstrae el modelo y una vista que representa la interfaz de usuario (IU) del modelo.

El entorno de diseño utiliza el tipo ModelItem para comunicarse con el modelo subyacente. Todos los cambios se realizan en los contenedores ModelItem, que afectan al modelo subyacente. Esto permite que el modelo sea simple. Los contenedores ModelItem administran las características complejas del diseñador, tales como la compatibilidad de transacciones, el seguimiento de acciones deshechas y las notificaciones de cambios.

La clase ModelService proporciona el punto de entrada para el modelo de edición y para las notificaciones de eventos globales.

La clase ViewService asigna las representaciones visuales a los elementos del modelo subyacente.

Ambos servicios son necesarios para que el diseñador funcione. La clase DesignerView, que es responsable de procesar los datos proporcionados por el usuario y enrutarlos a los comandos, necesita estos dos servicios para asignar con precisión los datos proporcionados por el usuario al modelo.

Proveedores de características

El comportamiento en tiempo de diseño de los tipos se extiende mediante las clases FeatureProvider o FeatureConnector<TFeatureProviderType>. La clase FeatureConnector<TFeatureProviderType> administra una lista de objetos FeatureProvider.

La clase FeatureProvider proporciona el punto de extensibilidad más básico. Un proveedor de características es una característica o complemento ligero que normalmente no exige mucho al entorno de diseño y que se crea y destruye en un contexto determinado. Los proveedores de características se utilizan para agregar nuevos bits de la interfaz de usuario a la superficie de diseño o para modificar algún comportamiento básico. Por ejemplo, un proveedor de características podría agregar más controladores de arrastre o proporcionar un nuevo tipo de comportamiento al arrastrar el mouse.

Para tener acceso al nivel más profundo de extensibilidad, derive de la clase FeatureConnector<TFeatureProviderType>. Esta clase expone un proveedor de servicios a través del cual las clases de conector de características derivadas pueden controlar eventos, así como solicitar y publicar servicios. Por ejemplo, podría implementar un conector de características para proporcionar una serialización específica del objeto o de interfaz de usuario de selección.

En general, se implementan características para extender los conceptos existentes. Implemente un conector de características para proporcionar nuevos conceptos. Para obtener más información, vea Proveedores de características y conectores de características.

Contexto de edición

En un diseñador en ejecución se acumula una cantidad significativa de información de estado. Por ejemplo, el estado del diseñador puede incluir qué objetos están seleccionados o el comportamiento que se produce cuando se presiona el botón primario. El estado del diseñador se almacena en una ubicación central para poder encontrarlo cuando se necesita. La clase EditingContext representa este repositorio central de estados para el diseñador.

La clase EditingContext separa el estado en dos categorías: datos y comportamiento. Los datos se almacenan como una tabla de elementos de contexto y el comportamiento se almacena como una tabla de servicios. Ambas tablas se indizan mediante una clave basada en tipos y son enumerables.

La clase ContextItem contiene un único fragmento de estado en el diseñador. Los elementos de contexto son inmutables, pero puede haber elementos de contexto nuevos que reemplacen a los existentes para simular la mutabilidad.

Se tiene acceso a los servicios a través de la propiedad Services, que devuelve una instancia de ServiceManager, y se tiene acceso a los elementos de contexto a través de la propiedad Items, que devuelve una instancia de ContextItemManager.

Comandos, tareas y herramientas

La arquitectura de herramientas de WPF Designer está compuesta de comandos, tareas y herramientas. 

Un comando es un identificador único que representa un determinado comportamiento. Por ejemplo, Cut es un comando que significa que se debe cortar el texto seleccionado y agregarlo al Portapapeles. El código que implementa Cut varía según las distintas aplicaciones e incluso dentro de una misma aplicación. Por ejemplo, cortar texto en un documento de Word constituye una implementación diferente que cortarlo en el cuadro de texto de búsqueda del mismo documento. Independientemente de la implementación, el comando Cut permanece constante.

WPF Designer aumenta el sistema de comandos de WPF introduciendo un concepto de comando de herramienta. Un comando de herramienta implementa la interfaz ICommand y es como la clase RoutedCommand.

Una tarea tiene una colección de enlaces de comando que permite agregar los comandos enrutados. La clase DesignerView tiene código que utiliza la misma estrategia del enrutamiento que los comandos de herramienta para buscar y ejecutar comandos enrutados que se definen en tareas. La clase DesignerView habilita tareas que admiten comandos de WPF comunes, como Copy.

Una herramienta es una clase que procesa los datos proporcionados por el usuario. Todos los datos proporcionados por el usuario entran en el diseñador como uno o más eventos de entrada. Esos eventos de entrada se pasan a la herramienta actualmente activa, que los convierte en enlaces de entrada. Si se devuelve un enlace de entrada, se ejecuta el comando dentro del enlace.

Una herramienta puede representar el modo global del diseñador. Por ejemplo, si el usuario está seleccionando componentes en la superficie de diseño, ese modo de selección es posible porque la herramienta activa proporciona enlaces y comandos de entrada que administran la selección. Cuando el usuario crea una nueva instancia de un control, se activa una herramienta diferente que proporciona un conjunto diferente de comandos, que se enlazan a los mismos enlaces de entrada.

Metadatos en tiempo de diseño

En el marco de WPF Designer, los metadatos que definen el comportamiento de un control en tiempo de diseño se especifican mediante atributos y se factorizan en un ensamblado independiente. Diseñadores diferentes pueden utilizar ensamblados de metadatos diferentes con implementaciones en tiempo de diseño totalmente diferentes. Esto desacopla el comportamiento en tiempo de ejecución y en tiempo de diseño, para que pueda revisar el diseñador de manera independiente con respecto al control.

Para especificar un ensamblado que proporcione implementación en tiempo de diseño, marque el ensamblado con ProvideMetadataAttribute e incluya una clase que implemente la interfaz IProvideAttributeTable.

Para obtener más información, vea Proporcionar metadatos en tiempo de diseño.

Compatibilidad en tiempo de diseño en Expression Blend

WPF Designer admite todas las características en el marco de extensibilidad. Expression Blend admite las siguientes características.

  • Adornos

  • Menús contextuales

  • DesignModeValueProvider

  • Inicializadores predeterminados

  • Todas las características de ModelItem, como selección y manipulación

  • Extensibilidad de la ventana Propiedades

Expression Blend no admite ParentAdapter ni PlacementAdapter.

Ensamblados de WPF Designer

WPF Designer está compuesto de varios ensamblados que pertenecen a tres categorías: públicos, privados y específicos del diseñador.

Los ensamblados públicos exponen clases que se pueden utilizar para agregar la lógica en tiempo de diseño a los controles.

Los ensamblados privados y específicos del diseñador definen el conjunto de características de WPF Designer y sus interacciones con diseñadores, como Visual Studio y Expression Blend.

Los diseñadores de Silverlight y WPF se instalan como una entidad única. No hay un paquete independiente para cada diseñador.

En la tabla siguiente se muestra cómo se implementan las características de WPF Designer.

Ensamblado

API pública

Descripción

Microsoft.Windows.Design.Extensibility.dll

Proporciona un modelo de extensibilidad mediante atributos y lógica de integración de Visual Studio SDK.

Microsoft.Windows.Design.Interaction.dll

Proporciona clases de datos proporcionados por el usuario y de visualización.

Microsoft.Windows.Design.Markup.dll

No

Proporciona mecanismos de modelos de documentos y XAML.

Microsoft.VisualStudio.Xaml.dll

No

Proporciona fundamento de XAML básico para cualquier diseñador mediante un servicio, un backplane de datos, y la manipulación de metadatos.

Microsoft.Windows.Design.Host.dll

No

API privada para hospedar un diseñador (específica de Visual Studio).

Microsoft.Windows.Design.Developer.dll

No

Implementación de WPF Designer.

Microsoft.Windows.Design.Developer.WPF.dll

No

Microsoft.Windows.Design.Developer.Silverlight.dll

No

Microsoft.Windows.Design.Platform.dll

No

Nivel de plataforma con clases abstractas. Las implementaciones de plataforma implementan clases abstractas en este ensamblado.

Microsoft.Windows.Design.Platform.WPF.dll

No

Tiempo de diseño específico de plataforma para WPF.

Microsoft.Windows.Design.Platform.Silverlight.dll

No

Tiempo de diseño específico de plataforma para Silverlight.

Microsoft.Expression.DesignModel.dll

No

Ensamblado en tiempo de diseño de Expression Blend.

Microsoft.Expression.Platform.WPF.dll

No

Ensamblado en tiempo de diseño de Expression Blend.

Microsoft.Expression.Platform.Silverlight.dll

No

Ensamblado en tiempo de diseño de Expression Blend.

Nota

Los ensamblados representan límites de funcionalidad, no límites de espacios de nombres. Con frecuencia encontrará espacios de nombres que abarquen más de un ensamblado.

WPF Designer y la arquitectura del Diseñador de Windows Forms

La arquitectura de WPF Designer es significativamente diferente de la arquitectura del Diseñador de Windows Forms, que se caracteriza por la interfaz IComponent y el espacio de nombres System.ComponentModel. Para obtener más información, vea Comparar el marco de trabajo del Diseñador de Windows Forms con el marco de trabajo de WPF Designer.

Vea también

Conceptos

Proveedores de características y conectores de características

Otros recursos

Proporcionar metadatos en tiempo de diseño

Desarrollar controles de formularios Windows Forms en tiempo de diseño

Extensibilidad de WPF Designer