Proporcionar metadatos en tiempo de diseño
Al crear experiencias personalizadas de diseño para el control de WPF o Silverlight, estas se implementan en ensamblados en tiempo de diseño independientes. Para especificar cómo interactúan estas implementaciones personalizadas en tiempo de diseño con las herramientas, como Visual Studio y Expression Blend, se crea una tabla que se rellena con atributos de metadatos.
Ensamblados en tiempo de diseño
Cuando una herramienta de diseño, como Visual Studio, abre el ensamblado del control personalizado, también busca los ensamblados en tiempo de diseño relacionados. En concreto, una herramienta de diseño busca el atributo de nivel de ensamblado ProvideMetadataAttribute. Al encontrar dicho atributo, el diseñador busca en el ensamblado una clase que implementa la interfaz IProvideAttributeTable. El diseñador consulta la propiedad AttributeTable de esta clase para una colección de atributos que especifica el comportamiento en tiempo de diseño. Para obtener más información, vea Tutorial: Proporcionar metadatos personalizados en tiempo de diseño y Implementar un control personalizado y ensamblados en tiempo de diseño.
Tabla de atributos
La clase AttributeTable asocia los atributos de metadatos en tiempo de diseño a tipos de WPF y Silverlight. La tabla de atributos especifica una implementación en tiempo de diseño determinada para un tipo diseñable. Por ejemplo, si tiene un objeto AdornerPanel personalizado para el control, agregue un objeto FeatureAttribute a la tabla de atributos para especificar una implementación de FeatureProvider personalizada.
Generador de la tabla de atributos
Para crear una tabla de atributos, empiece creando una instancia de la clase AttributeTableBuilder. Para agregar metadatos al generador de la tabla de atributos, se llama al método AddCustomAttributes. Cuando haya terminado de agregar los metadatos, genere una tabla de atributos mediante la llamada al método CreateTable. Los métodos del generador de la tabla de atributos admiten delegados de devolución de llamada, por tanto, la creación de la tabla de atributos se puede aplazar hasta que sea necesario.
En el código siguiente se muestra cómo especificar una implementación de Adorner personalizada mediante una tabla de atributos.
' Container for any general design-time metadata to initialize.
' Designers look for a type in the design-time assembly that
' implements IProvideAttributeTable. If found, designers instantiate
' this class and access its AttributeTable property automatically.
Friend Class Metadata
Implements IProvideAttributeTable
' Accessed by the designer to register any design-time metadata.
Public ReadOnly Property AttributeTable() As AttributeTable _
Implements IProvideAttributeTable.AttributeTable
Get
Dim builder As New AttributeTableBuilder()
' Add the adorner provider to the design-time metadata.
builder.AddCustomAttributes(GetType(ButtonWithDesignTime), _
New FeatureAttribute(GetType(OpacitySliderAdornerProvider)))
Return builder.CreateTable()
End Get
End Property
End Class
// Container for any general design-time metadata to initialize.
// Designers look for a type in the design-time assembly that
// implements IProvideAttributeTable. If found, designers instantiate
// this class and access its AttributeTable property automatically.
internal class Metadata : IProvideAttributeTable
{
// Accessed by the designer to register any design-time metadata.
public AttributeTable AttributeTable
{
get
{
AttributeTableBuilder builder = new AttributeTableBuilder();
// Add the adorner provider to the design-time metadata.
builder.AddCustomAttributes(
typeof(ButtonWithDesignTime),
new FeatureAttribute(typeof(OpacitySliderAdornerProvider)));
return builder.CreateTable();
}
}
}
Para obtener más información, vea Tutorial: Crear un adorno en tiempo de diseño.
Flujo de trabajo de la implementación en tiempo de diseño básica
Al crear experiencias del diseño personalizadas se suele seguir un flujo de trabajo similar. Para obtener más información, vea Cómo: Implementar un control personalizado y ensamblados en tiempo de diseño.
Para obtener ejemplos en los que se muestra cómo implementar las experiencias en tiempo de diseño personalizadas, vea WPF and Silverlight Designer Extensibility Samples.
Ventajas de los ensamblados en tiempo de diseño independientes
El marco de WPF Designer for Visual Studio desacopla los metadatos en tiempo de diseño de la implementación. Separar los metadatos del código en tiempo de ejecución del control es un importante principio de diseño por las razones siguientes.
Compilar respuestas y logísticas de integración entre equipos puede hacer que la compilación de metadatos en el control resulte tedioso.
Compilar los metadatos en el control evita que las herramientas externas, como WPF Designer o Expression Blend, modifiquen esos metadatos más adelante. Se trata de una cuestión clave en lo que se refiere a agilidad. Si no se desacoplan los metadatos en tiempo de diseño del control, Visual Studio no puede controlar las versiones de sus diseñadores sin requerir una nueva versión de .NET Framework.
Compilar los metadatos en el control aumenta significativamente el tamaño del ensamblado de control. Los atributos en tiempo de diseño también ralentizan el control. Las características de control, como el enlace de datos, que usa la reflexión, se ven afectadas cuando en la memoria se cargan atributos adicionales.
Los metadatos en tiempo de diseño confieren la "personalidad" al diseñador. Las características de un diseñador están vinculadas en gran medida a la aplicación que lo hospeda y no al control. WPF Designer y Expression Blend usan conjuntos diferentes de metadatos para proporcionar un conjunto de características que se destinan a un tipo específico de usuario.
Vea también
Referencia
Otros recursos
Cómo: Implementar un control personalizado y ensamblados en tiempo de diseño
Implementar un control personalizado y ensamblados en tiempo de diseño