Proveedores de características y conectores de características

Actualización: noviembre 2007

Cualquier objeto que se pueda diseñar en una aplicación de Windows Presentation Foundation (WPF) puede exponer un número arbitrario de extensiones de diseñador. En el tema siguiente se explican las capacidades de los proveedores de características y la función de los conectores de características para proporcionar características en tiempo de diseño.

Aspectos básicos de los proveedores de características y conectores de características

Un proveedor de características es un tipo sencillo que proporciona funcionalidad adicional en tiempo de diseño para un objeto. Algunos proveedores de características pueden simplemente proporcionar información sobre los subcomponentes y no requieren ninguna acción en nombre del diseñador. Otros proveedores de características pueden agregar elementos al menú contextual del diseñador de objetos, crear adornos personalizados para realizar acciones de cambio de tamaño o de edición, o volver a definir la forma de arrastrar y colocar objetos en el diseñador.

Los proveedores de características se implementan derivando directamente de la clase FeatureProvider o de una clase que a su vez deriva de FeatureProvider, por ejemplo AdornerProvider y ContextMenuProvider. Los proveedores de características están diseñados para ser sencillos y no se debe intentar que guarden el estado entre instancias.

Un conector de características administra uno o más proveedores de características de un objeto determinado. Los conectores de características pueden publicar nuevos servicios a través de un proveedor de servicios y realizar escuchas para los eventos del diseñador, por ejemplo los cambios de selección. Los conectores de características se implementan derivando una nueva clase de las clases FeatureConnector<FeatureProviderType> o PolicyDrivenFeatureConnector<FeatureProviderType>.

Proveedores de características

Un proveedor de características está diseñado para ser un punto sencillo de extensibilidad. Los escenarios comunes que implican extensibilidad del diseñador dan prioridad a la derivación de clases de proveedor de características existentes, en lugar de crear nuevos conectores de características. Los proveedores de características no deben guardar el estado, porque se crean y se destruyen varias veces.

Los proveedores de características están totalmente administrados por conectores de características y están asociados a objetos a través de metadatos, específicamente FeatureAttribute. El conector de características detecta los tipos FeatureProvider de estos metadatos. La clase FeatureManager identifica el conector de características necesario para cada proveedor de características detectado.

Entre las implementaciones comunes del proveedor de características se incluyen adornos de selección, verbos y editores de propiedades. Para obtener más información, vea Tutorial: Crear un adorno en tiempo de diseño.

Ejemplos de proveedores de características

En la siguiente ilustración se muestra un diseñador visual y los tipos de características que se podrían incluir en las categorías de proveedor de características o conector de características. Observe que la ilustración es sólo un ejemplo de cómo se pueden implementar algunas de las características de un diseñador.

Ejemplo de conectores y proveedores de características

En la tabla siguiente se enumeran los proveedores de características de los que puede derivar.

Proveedor de características

Descripción

AdornerProvider

Agrega adornos a la superficie del diseñador.

PrimarySelectionAdornerProvider

Agrega adornos que se muestran para la selección principal.

ContextMenuProvider

Define un conjunto de elementos de menú que se muestran en un menú contextual.

PrimarySelectionContextMenuProvider

Define un conjunto de elementos de menú que se muestran para la selección actual.

PolicyDrivenFeatureConnector<FeatureProviderType>.ItemFeatureProvider

Identifica los proveedores de características que pertenecen a un elemento determinado.

TaskProvider

Agrega tareas a la herramienta activa.

PrimarySelectionTaskProvider

Proporciona un conjunto de tareas que están disponibles desde la herramienta de selección cuando hay una clase en la selección principal.

DesignModeValueProvider

Captura los cambios de propiedades que realiza el usuario en el diseñador y proporciona nuevos valores en tiempo de diseño.

Cómo se crean los proveedores de características en tiempo de diseño

En muchos casos, no tendrá que crear sus propios conectores de características personalizados. Puede crear un proveedor de características y asociarlo directamente a una clase mediante FeatureConnectorAttribute. La clase FeatureManager es el componente de WPF Designer que activa los proveedores de características. FeatureManager examina los metadatos de un objeto en cuanto se coloca en la superficie de diseño. Si encuentra FeatureConnectorAttribute para un objeto, crea el proveedor de características asociado.

Por ejemplo, si desea crear un adorno que le permita modificar el texto de encabezado de un control personalizado directamente en la superficie del diseñador, tendrá que implementar el adorno derivándolo de PrimarySelectionAdornerProvider, que a su vez deriva de FeatureProvider. Luego, tendrá que asociar el adorno personalizado al control mediante FeatureConnectorAttribute.

Asociar proveedores de características a tipos

Una herramienta en tiempo de diseño asocia proveedores de características a los tipos a través de los atributos de metadatos. Debe haber una manera declarativa de enlazar los metadatos a los objetos o instancias reales en tiempo de ejecución. Este enlace se requiere en el nivel de herramienta y no es responsabilidad de un marco de trabajo en tiempo de diseño. En la siguiente ilustración se muestra cómo una herramienta en tiempo de diseño asocia proveedores de características a tipos diferentes.

Asociar tipos y proveedores de características

Existen dos formas de asociar proveedores de características a tipos en la arquitectura de WPF Designer: los tipos FeatureAttribute y FeatureConnectorAttribute. El tipo FeatureAttribute se usa en tipos o instancias de objetos modificables y expone una propiedad que representa un objeto FeatureProvider.

FeatureConnectorAttribute decora una clase FeatureProvider e indica qué tipo de conector de características es necesario para hospedar el proveedor de características especificado. La clase FeatureManager crea las instancias de FeatureConnector<FeatureProviderType> necesarias cuando se cambian los objetos que se le han pasado.

Suponga que tiene un diseñador específico de WPF en el que los objetos modificables son del tipo UIElement. Este tipo de herramienta puede usar uno o más "controladores de arrastre" para adornar los límites de elementos individuales. Estos adornos representan la selección visualmente y sirven para habilitar la manipulación de estos objetos modificables. El diseñador asocia una característica de controlador de arrastre a todos los objetos del tipo UIElement por vía de los metadatos. En la ilustración siguiente se muestra cómo un diseñador puede asociar un proveedor de controlador de arrastre a un objeto UIElement en la superficie de diseño.

Ejemplo de proveedor de características

Si existe un objeto UIElement y se pasa al administrador de características para analizarlo, GrabHandleProvider se detecta a través de los metadatos asociados a UIElement. El propio tipo GrabHandleProvider o su tipo base, se inspecciona por vía de los metadatos para determinar qué conector de características necesita.

Conectores de características

Los conectores de características son el nivel más bajo de extensibilidad que expone esta arquitectura. Los conectores de características se crean dando una referencia a un objeto EditingContext. Los conectores de características pueden suscribirse a los servicios globales y agregar sus propios servicios. La clase abstracta FeatureConnector<FeatureProviderType> implementa la interfaz IDisposable, que favorece una estrategia de limpieza sencilla.

Los conectores de características se crean previa solicitud. Cuando FeatureManager detecta FeatureConnectorAttribute en FeatureProvider, crea el objeto FeatureConnector<FeatureProviderType> especificado si el tipo no existe todavía. Los conectores de características sólo se crean cuando se detectan, en lugar de que una sesión del diseñador tenga que crear un conjunto predeterminado en el inicio. Si hay más de un tipo FeatureConnectorAttribute para FeatureProvider, se inicializan todos los conectores de características. Esto permite que otro fabricante derive de un objeto FeatureProvider existente, agregue un conector de características personalizado e inicialice ambos conjuntos de funcionalidades.

La mayor parte de la funcionalidad de la clase FeatureConnector<FeatureProviderType> se implementa en el método protegido CreateFeatureProviders. Pasar un objeto a este método hace que el conector de características busque los tipos FeatureAttribute en el objeto. Si se encuentran estos atributos, la instancia de FeatureProvider asociada a cada atributo se crea y se devuelve en una lista.

La clase base FeatureConnector<FeatureProviderType> es genérica y usa el tipo de proveedor de características que FeatureConnector<FeatureProviderType> hospeda. Los proveedores de características usan FeatureConnectorAttribute para indicar el conector de características asociado. Los métodos de clase base protegidos de FeatureConnector<FeatureProviderType>, principalmente el método CreateFeatureProviders, pueden devolver colecciones con tipos de proveedores de características a los conectores de características derivados sin que las clases derivadas tengan que preocuparse por la conversión o la seguridad de tipos.

Crear conectores de características personalizados

Tendrá que crear su propio conector de características cuando desee escuchar los eventos de diseñador, como la selección. Derive de las clases FeatureConnector<FeatureProviderType> o PolicyDrivenFeatureConnector<FeatureProviderType> para implementar la lógica de diseño personalizada.

Se proporciona a los conectores de características una referencia al objeto global EditingContext del diseñador, a través del cual el conector de características puede obtener acceso a los servicios del diseñador, así como publicar sus propios servicios personalizados. Por ejemplo, un proveedor de control gráfico quizá desee publicar un servicio que permita a un editor de tipos personalizado en el diseñador enumerar todos los widgets que hay actualmente en el gráfico.

Cuando haya creado una clase derivada de FeatureConnector<FeatureProviderType>, puede asociarla a un proveedor de características si aplica FeatureConnectorAttribute al proveedor de características. Cada vez que se crea una instancia de ese proveedor de características, FeatureManager examina los metadatos de FeatureConnectorAttribute. Si se ha definido el atributo y actualmente no se está ejecutando una instancia del objeto FeatureConnector<FeatureProviderType> asociado, FeatureManager creará y asociará todas las instancias futuras de ese proveedor de características con FeatureConnector<FeatureProviderType>.

Para obtener código de ejemplo que muestra cómo implementar un conector de características, vea Cómo: Crear un conector de características personalizado.

Vea también

Referencia

AdornerProvider

EditingContext

FeatureManager

FeatureConnectorAttribute

Otros recursos

Extensibilidad de WPF Designer