Filtern von Metadaten

Das Filtern von Metadaten ermöglicht einem Designer das Ändern der Gruppe von Eigenschaften, Attributen und Ereignissen, die von einer Komponente oder einem Steuerelement zur Entwurfszeit verfügbar gemacht werden.

So verfügt Control z. B. über eine Eigenschaft mit dem Namen Visible, die bestimmt, ob das Steuerelement angezeigt wird. Zur Entwurfszeit sollte das Steuerelement jedoch immer sichtbar sein, und zwar unabhängig vom Wert dieser Eigenschaft, sodass der Entwickler es auf der Entwurfsoberfläche positionieren kann. Der Designer für Control ersetzt die Visible-Eigenschaft zur Entwurfszeit durch seine eigene Version und stellt später den Laufzeitwert dieser Eigenschaft wieder her.

Zum Filtern von Metadaten kann ein Designer die IDesignerFilter-Schnittstelle implementieren oder dem Entwurfszeitdienste-Anbieter die Implementierung eines ITypeDescriptorFilterService hinzufügen, der Metadaten für jede beliebige Komponente in der Entwurfszeitumgebung filtern kann.

Wenn eine Komponente zur Entwurfszeit ausgewählt wird, fragt der Eigenschaftenbrowser die Attribute, Ereignisse und Eigenschaften der Komponente mithilfe der Methoden eines TypeDescriptor ab. Wenn eine Komponente nach ihren Attributen, Ereignissen und Eigenschaften im Entwurfsmodus abgefragt wird, hat jeder Designer für die Komponente, der die IDesignerFilter-Schnittstelle implementiert, die Möglichkeit, die von der Komponente zurückgegebene Gruppe von Attributen, Ereignissen und Eigenschaften zu verändern. Anschließend werden die Methoden jedes aktiven ITypeDescriptorFilterService aufgerufen, damit Attribute, Ereignisse und Eigenschaften durch den Dienst gefiltert werden können.

Eine Komponente im Entwurfsmodus wird i. d. R. nach Attributen, Ereignissen und Eigenschaften abgefragt, wenn die Refresh-Methode des TypeDescriptor für die Komponente aufgerufen, das Eigenschaftenfenster aktualisiert, der Entwurfsmodus eingerichtet bzw. wiederhergestellt und wenn die primäre Auswahl festgelegt wird. Methoden anderer Objekte bzw. eine Entwurfszeitumgebung können die Methoden eines TypeDescriptor auch in anderen Fällen aufrufen.

IDesignerFilter-Schnittstelle zum Filtern der Metadaten von Komponenten

Durch die IDesignerFilter-Schnittstelle wird eine Gruppe von Methoden definiert, die in einem Designer überschrieben und implementiert werden kann, um die Eigenschaften, Ereignisse und Attribute zu ändern, die von der vom Designer verwalteten Komponente zur Entwurfzeit verfügbar gemacht werden.

Jede Methode der IDesignerFilter -Schnittstelle weist das Präfix Pre oder das Präfix Post auf. Jede Methode weist eines der Suffixe Attributes , Events oder Properties auf, je nachdem, welchen Membertyp Sie damit hinzufügen, ändern oder entfernen können. Zum Hinzufügen von Attributen, Ereignissen oder Eigenschaften verwenden Sie die entsprechende Methode, deren Bezeichnung mit Pre beginnt. Wenn Sie Attribute, Ereignisse oder Eigenschaften ändern oder entfernen möchten, verwenden Sie die entsprechende Methode, deren Bezeichnung mit Post beginnt. Die Methoden, deren Namen mit Pre beginnen, werden unmittelbar vor den Methoden aufgerufen, deren Namen mit Post beginnen.

Wenn Sie ein oder mehrere Attribute hinzufügen möchten, implementieren Sie eine Überschreibung der PreFilterAttributes-Methode, die das neue System.Attribute dem an die Methode übergebenen IDictionary hinzufügt. Die Schlüssel im Wörterbuch sind die Typ-IDs der Attribute. Implementieren Sie eine Überschreibung der PostFilterAttributes-Methode, wenn Sie ein oder mehrere Attribute ändern oder entfernen möchten.

Wenn Sie ein oder mehrere Ereignisse hinzufügen möchten, implementieren Sie eine Überschreibung der PreFilterEvents-Methode, die den neuen EventDescriptor dem an die Methode übergebenen IDictionary hinzufügt. Die Schlüssel im Wörterbuch sind die Namen der Ereignisse. Implementieren Sie eine Überschreibung der PostFilterEvents-Methode, wenn Sie ein oder mehrere Ereignisse ändern oder entfernen möchten.

Wenn Sie eine oder mehrere Eigenschaften hinzufügen möchten, implementieren Sie eine Überschreibung der PreFilterProperties-Methode, die den neuen PropertyDescriptor dem an die Methode übergebenen IDictionary hinzufügt. Die Schlüssel im Wörterbuch sind die Namen der Eigenschaften. Implementieren Sie eine Überschreibung der PostFilterProperties-Methode, wenn Sie eine oder mehrere Eigenschaften ändern oder entfernen möchten.

Hinweis

Wenn eine Klasse einen Designer erweitert, der IDesignerFilter implementiert, sollte jede PostMethodenname-Methode nach Änderung ihrer eigenen Attribute die entsprechende PostMethodenname-Methode der Basisklasse aufrufen, und jede PreMethodenname-Methode sollte die entsprechende PreMethodenname-Methode der Basisklasse vor Änderung der eigenen Attribute aufrufen.

Im folgenden Codebeispiel werden die Methodensignaturen der IDesignerFilter-Schnittstelle gezeigt.

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);
}

Im folgenden Codebeispiel wird eine Implementierung des IDesignerFilter veranschaulicht, der der zugeordneten Komponente eine Color-Eigenschaft des Designers hinzufügt.

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()
      {}
   }
}

Ein Beispiel eines Steuerelement-Designers für Windows Forms, der das Filtern von Eigenschaften mithilfe der IDesignerFilter-Schnittstelle implementiert, finden Sie unter Beispiel eines Windows Forms-Designers.

ITypeDescriptorFilterService zum globalen Filtern von Metadaten im Entwurfsmodus

Sie können das Filtern von Metadaten für jede Komponente in einem Projekt im Entwurfsmodus bereitstellen, indem Sie dem Entwurfszeitdienst-Anbieter eine ITypeDescriptorFilterService-Implementierung hinzufügen. Verwenden Sie dazu die AddService-Methode der IServiceContainer-Schnittstelle. Diese Schnittstelle wird durch die von der Site-Eigenschaft einer Component im Entwurfsmodus zurückgegebene ISite implementiert.

Im folgenden Codebeispiel wird das Hinzufügen eines ITypeDescriptorFilterService-Dienstes mit der Bezeichnung ExampleFilterService veranschaulicht.

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));
}

Eine Beispiel für eine ITypeDescriptorFilterService-Implementierung finden Sie in der Referenzdokumentation für die ITypeDescriptorFilterService-Klasse.

Siehe auch

Aufgaben

Gewusst wie: Anpassen von Attributen, Ereignissen und Eigenschaften einer Komponente im Entwurfsmodus

Konzepte

Basisklassen für Designer
Designerverben
Gewusst wie: Implementieren eines Designers für ein Steuerelement
Übersicht über den Typdeskriptor

Weitere Ressourcen

Benutzerdefinierte Designer