Inicialización de diseñador y configuración de metadatos
La manipulación de los metadatos y los atributos de filtro asociados a un diseñador o componente de diseñador proporciona un mecanismo para que las aplicaciones definan qué herramientas usa un diseñador determinado para controlar objetos Type diferentes (como estructuras de datos, clases o entidades gráficas), cuándo está disponible el diseñador y cómo está configurado el IDE de Visual Studio para admitir el diseñador (por ejemplo, qué categoría o pestaña del Cuadro de herramientas está disponible).
El SDK de Visual Studio proporciona varios mecanismos para facilitar el control de la inicialización de un componente del diseñador o del diseñador y la manipulación de sus metadatos mediante un VSPackage.
Inicialización de metadatos e información de configuración
Dado que se cargan a petición, es posible que el entorno de Visual Studio no haya cargado VSPackages antes de la creación de instancias de un diseñador. Por lo tanto, VSPackages no puede usar el mecanismo estándar para configurar un diseñador o un componente de diseñador en la creación, que es controlar un evento DesignerCreated. En su lugar, un VSPackage implementa una instancia de la interfaz DesignSurfaceExtension y se registra para proporcionar personalizaciones, denominadas extensiones de superficie de diseño.
Personalización de la inicialización
La personalización de un diseñador, un componente o una superficie de diseñador implica:
Modificar los metadatos del diseñador y cambiar eficazmente cómo se accede o convierte un determinado Type.
Normalmente, esto se hace a través de los mecanismos UITypeEditor o TypeConverter.
Por ejemplo, cuando se inicializan los diseñadores basados en System.Windows.Forms, el entorno de Visual Studio modifica el UITypeEditor para los objetos Image usados con el diseñador para usar el administrador de recursos para obtener mapas de bits en lugar del sistema de archivos.
La integración con el entorno, por ejemplo, mediante la suscripción a eventos o la obtención de información de configuración del proyecto. Puede obtener información de configuración del proyecto y suscribirse a eventos mediante la obtención de la interfaz ITypeResolutionService.
Para modificar el entorno de usuario, active las categorías del Cuadro de herramientas adecuadas o restrinja la aplicabilidad del diseñador aplicando una instancia de la clase ToolboxItemFilterAttribute al diseñador.
Inicialización del diseñador mediante un VSPackage
Un VSPackage debe controlar la inicialización del diseñador mediante lo siguiente:
Creando un objeto que implemente la clase DesignSurfaceExtension.
Nota:
La clase DesignSurfaceExtension nunca se debe implementar en el mismo objeto que la clase Package.
Registrando la clase que implementa DesignSurfaceExtension para que ofrezca compatibilidad con las extensiones de diseñador de VSPackage. Registre la clase aplicando instancias de DesignSurfaceExtensionAttribute, ProvideObjectAttribute y ProvideServiceAttribute a la clase que proporciona la implementación de VSPackage de Package.
Cada vez que se crea un diseñador o componente de diseñador, el entorno de Visual Studio:
Accede a cada proveedor de extensión de superficie de diseño registrada.
Crea instancias e inicializa una instancia de cada objeto DesignSurfaceExtension del proveedor de extensiones de superficie de diseño.
Llama al método OnDesignerCreated o OnComponentCreated del proveedor de extensiones de superficie de diseño (según proceda).
Al implementar el objeto DesignSurfaceExtension como miembro de un VSPackage, es importante comprender que:
El entorno de Visual Studio no proporciona ningún control sobre qué metadatos u otros valores de configuración modifica un proveedor determinado de
DesignSurfaceExtension
. Es posible que dos o más proveedores deDesignSurfaceExtension
modifiquen la misma característica de diseñador de forma contradictoria, siendo la modificación final la definitiva. Es indeterminado qué modificación se aplica por última vez.Es posible restringir explícitamente una implementación del objeto DesignSurfaceExtension a diseñadores específicos aplicando instancias de ToolboxItemFilterAttribute a esa implementación. Para obtener más información sobre el filtrado de elementos del Cuadro de herramientas, consulte ToolboxItemFilterAttribute y ToolboxItemFilterType.
Aprovisionamiento de metadatos adicionales
Un VSPPackage puede cambiar la configuración de un diseñador o componente del diseñador en otro momento que no sea el de diseño.
La clase ProvideDesignerMetadataAttribute se puede usar mediante programación o aplicarse a un VSPackage que proporciona un diseñador.
Una instancia de la clase ProvideDesignerMetadataAttribute se usa para modificar los metadatos de los componentes creados en una superficie de diseño. Por ejemplo, una podría reemplazar un explorador de propiedades predeterminado usado por objetos CommonDialog por un explorador de propiedades personalizado.
Las modificaciones proporcionadas por una instancia de ProvideDesignerMetadataAttribute aplicada a la implementación de VSPackage de Package pueden tener uno de dos ámbitos:
Global: para todas las nuevas instancias de un componente determinado
Local: perteneciente solo a la instancia del componente creado en una superficie de diseño proporcionada por el VSPackage actual.
La propiedad IsGlobal
de la instancia ProvideDesignerMetadataAttribute aplicada a la implementación de VSPackage de Package determina este ámbito.
Al aplicar el atributo a una implementación de Package con la propiedad IsGlobal del objeto ProvideDesignerMetadataAttribute establecida en true
, como se indica a continuación, cambia el explorador para todo el entorno de Visual Studio:
[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser),
IsGlobal=true
)]
internal class MyPackage : Package {}
Si la marca global se estableció en false
, el cambio de metadatos es local para el diseñador actual admitido por el VSPackage actual:
[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser),
IsGlobal=false
)]
internal class MyPackage : Package {}
Nota:
La superficie de diseño solo admite la creación de componentes y, por tanto, solo los componentes pueden tener metadatos locales. En el ejemplo anterior, intentamos modificar una propiedad, como la propiedad Color
de un objeto. Si se pasó false
para la marca global, CustomBrowser
nunca aparecería porque el diseñador nunca crea realmente una instancia de Color
. Establecer la marca global en false
es útil para componentes, como controles, temporizadores y cuadros de diálogo.