Bereitstellen von Entwurfszeitmetadaten
Wenn Sie benutzerdefinierte Entwurfsumgebungen für das WPF- oder Silverlight-Steuerelement erstellen, stellen Sie sie in separaten Entwurfszeitassemblys bereit. Sie geben an, wie diese benutzerdefinierten Entwurfszeitimplementierungen mit Tools wie Visual Studio und Expression Blend interagieren, indem Sie eine Tabelle erstellen, die mit Metadatenattributen aufgefüllt wird.
Entwurfszeitassemblys
Wenn ein Entwurfstool wie Visual Studio die Assembly des benutzerdefinierten Steuerelements öffnet, sucht es auch nach verwandten Entwurfszeitassemblys. Insbesondere sucht ein Entwurfstool nach dem ProvideMetadataAttribute-Attribut auf Assemblyebene. Wenn dieses Attribut gefunden wird, sucht der Designer in der Assembly nach einer Klasse, die die IProvideAttributeTable-Schnittstelle implementiert. Der Designer fragt die AttributeTable-Eigenschaft dieser Klasse nach einer Attributauflistung ab, die das Entwurfszeitverhalten angibt. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Bereitstellen von benutzerdefinierten Entwurfszeitmetadaten und unter Bereitstellen eines benutzerdefinierten Steuerelements und von Entwurfszeitassemblys.
Attributtabelle
Die AttributeTable-Klasse ordnet Attribute von Entwurfszeitmetadaten WPF- und Silverlight-Typen zu. In der Attributtabelle wird eine bestimmte Entwurfszeitimplementierung für einen entwurfsfähigen Typ angegeben. Wenn Sie z. B. über einen benutzerdefinierten AdornerPanel für das Steuerelement verfügen, fügen Sie der Attributtabelle ein FeatureAttribute hinzu, um eine benutzerdefinierte FeatureProvider-Implementierung anzugeben.
Attributtabellen-Generator
Zur Erstellung einer Attributtabelle erstellen Sie zunächst eine Instanz der AttributeTableBuilder-Klasse. Fügen Sie dem Attributtabellen-Generator Metadaten hinzu, indem Sie die AddCustomAttributes-Methode aufrufen. Nachdem Sie die Metadaten hinzugefügt haben, erstellen Sie eine Attributtabelle, indem Sie die CreateTable-Methode aufrufen. Die Methoden des Attributtabellen-Generators unterstützen Rückrufdelegaten. Somit kann die Erstellung der Attributtabelle bis zum gewünschten Zeitpunkt hinausgezögert werden.
Im folgenden Code wird gezeigt, wie eine benutzerdefinierte Adornerimplementierung mit einer Attributtabelle angegeben wird.
' 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();
}
}
}
Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Erstellen eines Entwurfszeitadorners.
Grundlegender Workflow für Entwurfszeitimplementierungen
Sie folgen normalerweise einem ähnlichen Workflow, wenn Sie benutzerdefinierte Entwurfsumgebungen erstellen. Weitere Informationen finden Sie unter Gewusst wie: Bereitstellen eines benutzerdefinierten Steuerelements und von Entwurfszeitassemblys.
Beispiele, die die Implementierung von benutzerdefinierten Entwurfszeitumgebungen veranschaulichen, finden Sie in den Beispielen für WPF- und Silverlight-Designer-Erweiterbarkeit.
Vorteile separater Entwurfszeitassemblys
Das WPF Designer für Visual Studio-Framework entkoppelt Entwurfszeitmetadaten von der Implementierung. Das Trennen der Metadaten vom Laufzeitcode des Steuerelements ist aus den folgenden Gründen ein wichtiges Entwurfsprinzip.
Das Erstellen der Turnaround- und Integrationslogistik zwischen Teams kann das Kompilieren von Metadaten in das Steuerelement kompliziert machen.
Das Kompilieren von Metadaten in das Steuerelement verhindert, dass externe Tools, beispielsweise der WPF-Designer oder Expression Blend, diese Metadaten später ändern. Dies ist ein wichtiges Problem im Hinblick auf die Flexibilität. Wenn Entwurfszeitmetadaten nicht vom Steuerelement entkoppelt werden, kann Visual Studio seinen Designern keine Version zuweisen, ohne dass eine neue Version von .NET Framework erforderlich ist.
Wenn Metadaten in das Steuerelement kompiliert werden, vergrößert sich die Steuerelementassembly bedeutend. Zudem verlangsamen die Entwurfszeitattribute das Steuerelement. Steuerelementfunktionen (z. B. Datenbindung), die Reflektion verwenden, sind betroffen, wenn zusätzliche Attribute in den Speicher geladen werden.
Entwurfszeitmetadaten stellen die "Persönlichkeit" des Designers bereit. Die Funktionen eines Designers sind zum größten Teil an die Anwendung gebunden, die den Designer hostet, und nicht an das Steuerelement. Der WPF-Designer und Expression Blend verwenden verschiedene Sätze von Metadaten, um einen Funktionssatz für einen spezifischen Benutzertyp bereitzustellen.
Siehe auch
Referenz
Weitere Ressourcen
Gewusst wie: Bereitstellen eines benutzerdefinierten Steuerelements und von Entwurfszeitassemblys
Bereitstellen eines benutzerdefinierten Steuerelements und von Entwurfszeitassemblys