Filtrado de metadatos
El filtrado de metadatos permite que un diseñador modifique el conjunto de propiedades, atributos y eventos expuestos por un componente o control en tiempo de diseño.
Por ejemplo, Control tiene una propiedad denominada Visible que determina si el control es visible. Sin embargo, en tiempo de diseño, el control debe permanecer siempre visible, independientemente del valor de esta propiedad, de manera que el programador pueda colocarlo en la superficie de diseño. El diseñador de Control reemplaza la propiedad Visible con su propia versión en tiempo de diseño y después restablece el valor de esta propiedad en tiempo de ejecución.
Para realizar el filtrado de metadatos, un diseñador puede implementar la interfaz IDesignerFilter o agregar una implementación de ITypeDescriptorFilterService al proveedor de servicios en tiempo de diseño, que puede realizar el filtrado de metadatos en cualquier componente en el entorno en tiempo de diseño.
Cuando se selecciona un componente en tiempo de diseño, el explorador de propiedades consulta al componente sobre sus atributos, eventos y propiedades mediante los métodos de un TypeDescriptor. Cuando se consulta a un componente sobre sus atributos, eventos y propiedades en modo de diseño, se le da la oportunidad a cualquier diseñador del componente que implementa la interfaz IDesignerFilter de modificar el conjunto de atributos, eventos y propiedades devueltos por el componente. A continuación, se llama a los métodos de cualquier interfaz ITypeDescriptorFilterService activa para permitir al servicio que realice el filtrado de atributos, eventos y propiedades.
Normalmente, se consulta a un componente en modo de diseño sobre sus atributos, eventos y propiedades cuando se llama al método Refresh de TypeDescriptor en el componente, cuando se actualiza la ventana Propiedades, cuando se establece o restablece el modo de diseño y cuando se establece la selección principal. Los métodos de otros objetos o un entorno en tiempo de diseño pueden llamar a los métodos de un TypeDescriptor en otros momentos.
Interfaz IDesignerFilter para filtrado de metadatos de componentes
La interfaz IDesignerFilter define un conjunto de métodos que se puede invalidar e implementar en un diseñador para alterar las propiedades, eventos o atributos expuestos por el componente administrado por el diseñador en tiempo de diseño.
Cada uno de los métodos de la interfaz IDesignerFilter tiene el prefijo "Pre" o "Post". Cada uno de los métodos lleva el sufijo "Attributes", "Events", o "Properties", dependiendo del tipo de miembro que le permita agregar, cambiar o quitar. Para agregar atributos, eventos o propiedades, utilice el método pertinente cuyo nombre comience con "Pre". Para cambiar o quitar atributos, eventos o propiedades, utilice el método pertinente cuyo nombre comience con "Post". A los métodos que comienzan con "Pre" se les llama inmediatamente antes que a los métodos cuyo nombre comienza con "Post".
Si se desea agregar uno o varios atributos, invalide el método PreFilterAttributes que agrega el nuevo Attribute a la IDictionary pasada al método. Las claves del diccionario son los identificadores de tipos de los atributos. Para cambiar o quitar uno o varios atributos, invalide el método PostFilterAttributes.
Si se desea agregar uno o varios eventos, invalide el método PreFilterEvents que agrega el nuevo EventDescriptor a la interfaz IDictionary pasada al método. Las claves del diccionario son los nombres de los eventos. Para cambiar o quitar uno o varios eventos, invalide el método PostFilterEvents.
Si se desea agregar una o varias propiedades, invalide el método PreFilterProperties que agrega el nuevo PropertyDescriptor a la interfaz IDictionary pasada al método. Las claves del diccionario son los nombres de las propiedades. Para cambiar o quitar una o varias propiedades, invalide el método PostFilterProperties.
Nota
Cuando una clase extiende un diseñador que implementa IDesignerFilter, cada método PostNombreMétodo debe llamar al método PostNombreMétodo correspondiente de la clase base después de cambiar sus propios atributos, y cada método PreNombreMétodo debe llamar al método PreNombreMétodo correspondiente de la clase base antes de cambiar sus propios atributos.
En el siguiente bloque de código de ejemplo se muestran las firmas de métodos de la interfaz IDesignerFilter.
Public Interface IDesignerFilter
Sub PostFilterAttributes(attributes As IDictionary)
Sub PostFilterEvents(events As IDictionary)
Sub PostFilterProperties(properties As IDictionary)
Sub PreFilterAttributes(attributes As IDictionary)
Sub PreFilterEvents(events As IDictionary)
Sub PreFilterProperties(properties As IDictionary)
End Interface
public interface IDesignerFilter {
void PostFilterAttributes(IDictionary attributes);
void PostFilterEvents(IDictionary events);
void PostFilterProperties(IDictionary properties);
void PreFilterAttributes(IDictionary attributes);
void PreFilterEvents(IDictionary events);
void PreFilterProperties(IDictionary properties);
}
En el siguiente código de ejemplo se muestra una implementación de IDesignerFilter que agrega una propiedad Color del diseñador al componente asociado. Es necesario que agregue una referencia a System.Design.dll.
Imports System
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Windows.Forms.Design
Namespace IDesignerFilterSample
_
Public Class DesignerFilterDesigner
Inherits ComponentDesigner
' Designer color property to add to component.
Public Property TestColor() As Color
Get
Return Me.intcolor
End Get
Set(ByVal Value As Color)
Me.intcolor = Value
End Set
End Property
' Color for TestColor property.
Private intcolor As Color = Color.Azure
Public Function DesignerFilterDesigner()
End Function 'DesignerFilterDesigner
' Adds a color property of this designer to the component.
Protected Overrides Sub PreFilterProperties(ByVal properties As System.Collections.IDictionary)
MyBase.PreFilterProperties(properties)
' Adds a test property to the component.
properties.Add("TestColor", TypeDescriptor.CreateProperty(GetType(DesignerFilterDesigner), "TestColor", GetType(System.Drawing.Color), Nothing))
End Sub 'PreFilterProperties
End Class 'DesignerFilterDesigner
' Component with which the DesignerFilterDesigner is associated.
<Designer(GetType(DesignerFilterDesigner))> _
Public Class TestComponent
Inherits Component
Public Function TestComponent()
End Function 'TestComponent
End Class 'TestComponent
End Namespace
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace IDesignerFilterSample
{
public class DesignerFilterDesigner : ComponentDesigner, IDesignerFilter
{
// Designer color property to add to component.
public Color TestColor
{
get
{ return this.intcolor; }
set
{ this.intcolor = value; }
}
// Color for TestColor property.
private Color intcolor = Color.Azure;
public DesignerFilterDesigner()
{}
// Adds a color property of this designer to the component.
protected override void PreFilterProperties(System.Collections.IDictionary properties)
{
base.PreFilterProperties(properties);
// Adds a test property to the component.
properties.Add("TestColor", TypeDescriptor.CreateProperty(typeof(DesignerFilterDesigner), "TestColor", typeof(System.Drawing.Color), null));
}
}
// Component with which the DesignerFilterDesigner is associated.
[Designer(typeof(DesignerFilterDesigner))]
public class TestComponent : Component
{
public TestComponent()
{}
}
}
Para obtener un ejemplo de un diseñador de controles de formularios Windows Forms que implementa el filtrado de propiedades utilizando la interfaz IDesignerFilter, vea Ejemplo de diseñador de Windows Forms.
ITypeDescriptorFilterService para el filtrado de metadatos en modo de diseño global
Puede proporcionar filtrado de metadatos para cualquier componente de un proyecto en tiempo de diseño agregando una implementación de ITypeDescriptorFilterService al proveedor de servicios que proporciona servicios en tiempo de diseño utilizando el método AddService de la interfaz IServiceContainer implementada por la interfaz ISite devuelta por la propiedad Site de un Component ubicado en modo de diseño.
En el siguiente ejemplo de código se muestra cómo agregar un servicio de ITypeDescriptorFilterService denominado ExampleFilterService.
IDesignerHost dh = (IDesignerHost)this.Component.GetService(typeof(IDesignerHost));
if( dh != null )
{
// First gets any previous ITypeDescriptorFilterService to replace when
// the current service is removed, and to call if the new service
// implements service chaining.
ITypeDescriptorFilterService itdfs =
(ITypeDescriptorFilterService)dh.GetService( typeof(ITypeDescriptorFilterService));
oldService = (ITypeDescriptorFilterService)dh.GetService(
typeof(ITypeDescriptorFilterService));
if(oldService != null)
// Removes any old ITypeDescriptorFilterService.
dh.RemoveService(typeof(ITypeDescriptorFilterService));
// Adds an ExampleFilterService that implements service chaining.
dh.AddService(typeof(ITypeDescriptorFilterService),
new ExampleFilterService(oldService));
}
Para obtener un ejemplo de una implementación de ITypeDescriptorFilterService, vea la documentación de referencia de la clase ITypeDescriptorFilterService.
Vea también
Tareas
Cómo: Ajustar los atributos, eventos y propiedades de un componente en modo de diseño
Conceptos
Cómo: Implementar un diseñador para un control
Información general sobre descriptores de tipos