Partager via


Filtrage des métadonnées

Le filtrage des métadonnées permet à un concepteur de modifier l'ensemble des propriétés, attributs et événements exposés par un composant ou un contrôle au moment du design.

Par exemple, Control a une propriété nommée Visible qui détermine si le contrôle est visible. Au moment du design, cependant, le contrôle doit toujours rester visible, peu importe la valeur de cette propriété, de sorte qu'un développeur puisse le positionner sur l'aire de conception. Le concepteur de Control remplace la propriété Visible par sa propre version au moment du design et restaure ultérieurement la valeur runtime de cette propriété.

Pour effectuer un filtrage des métadonnées, un concepteur peut implémenter l'interface IDesignerFilter ou ajouter une implémentation ITypeDescriptorFilterService au fournisseur de services au moment du design qui peut effectuer le filtrage des métadonnées sur n'importe quel composant dans l'environnement au moment du design.

Lorsqu'un composant est sélectionné au moment du design, l'Explorateur de propriétés demande au composant d'indiquer ses attributs, événements et propriétés par l'intermédiaire des méthodes de TypeDescriptor. Lorsqu'un composant est interrogé sur ses attributs, événements et propriétés en mode Design, tout concepteur du composant qui implémente l'interface IDesignerFilter a la possibilité de modifier l'ensemble des attributs, événements et propriétés retournés par le composant. Les méthodes de n'importe quel ITypeDescriptorFilterService actif sont appelées ensuite pour permettre au service d'effectuer un filtrage des attributs, des événements et des propriétés.

Un composant en mode Design est généralement interrogé sur ses attributs, événements et propriétés lorsque la méthode Refresh de TypeDescriptor est appelée sur le composant, lorsque la fenêtre Propriétés est actualisée, le mode design est établi ou rétabli et la sélection primaire est définie. Les méthodes d'autres objets ou l'environnement au moment du design peuvent appeler les méthodes de TypeDescriptor à d'autres moments.

Interface IDesignerFilter pour le filtrage des métadonnées de composants

L'interface IDesignerFilter définit un ensemble de méthodes qui peuvent être substituées et implémentées dans un concepteur pour modifier les propriétés, événements ou attributs exposés par le composant managé par le concepteur au moment du design.

Les préfixes « Pre » ou « Post » sont ajoutés à chaque méthode de l'interface IDesignerFilter. Les suffixes « Attributes », « Events » or « Properties » sont ajoutés à chaque méthode, selon le type de membre qu'elle vous permet d'ajouter, de modifier ou de supprimer. Pour ajouter des attributs, des événements ou des propriétés, utilisez la méthode appropriée dont le nom commence par « Pre ». Pour modifier ou supprimer des attributs, des événements ou des propriétés, utilisez la méthode appropriée dont le nom commence par « Post ». Les méthodes dont les noms commencent par « Pre » sont appelées immédiatement avant les méthodes dont les noms commencent par « Post ».

Si vous souhaitez ajouter un ou plusieurs attributs, implémentez une substitution de la méthode PreFilterAttributes qui ajoute le nouveau Attribute au IDictionary passé à la méthode. Les clés du dictionnaire sont les identificateurs de type des attributs. Pour modifier ou supprimer un ou plusieurs attributs, implémentez une substitution de la méthode PostFilterAttributes.

Si vous souhaitez ajouter un ou plusieurs événements, implémentez une substitution de la méthode PreFilterEvents qui ajoute le nouveau EventDescriptor au IDictionary passé à la méthode. Les clés du dictionnaire sont les noms des événements. Pour modifier ou supprimer un ou plusieurs événements, implémentez une substitution de la méthode PostFilterEvents.

Si vous souhaitez ajouter une ou plusieurs propriétés, implémentez une substitution de la méthode PreFilterProperties qui ajoute le nouveau PropertyDescriptor au IDictionary passé à la méthode. Les clés du dictionnaire sont les noms des propriétés. Pour modifier ou supprimer une ou plusieurs propriétés, implémentez une substitution de la méthode PostFilterProperties.

Notes

Lorsqu'une classe étend un concepteur qui implémente IDesignerFilter, chaque méthode PostNomMéthode doit appeler la méthode PostNomMéthode correspondante de la classe de base après avoir modifié ses propres attributs, et chaque méthode PreNomMéthode doit appeler la méthode PreNomMéthode correspondante de la classe de base avant de modifier ses propres attributs.

L'exemple de code suivant illustre les signatures de méthodes de l'interface 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);
}

L'exemple de code suivant illustre une implémentation de IDesignerFilter qui ajoute une propriété Color du concepteur au composant associé. Vous devez ajouter une référence à 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()
      {}
   }
}

Pour voir un exemple de concepteur de contrôle Windows Forms qui implémente un filtrage de propriétés à l'aide de l'interface IDesignerFilter, consultez Windows Forms Designer Sample.

ITypeDescriptorFilterService pour le filtrage de métadonnées en mode design

Vous pouvez effectuer un filtrage de métadonnées pour tout composant d'un projet au moment du design en ajoutant une implémentation ITypeDescriptorFilterService au fournisseur de services qui fournit des services au moment du design, à l'aide de la méthode AddService de l'interface IServiceContainer implémentée par le ISite retourné par la propriété Site d'un Component installé en mode Design.

L'exemple de code suivant montre comment ajouter un service ITypeDescriptorFilterService intitulé 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));
}

Pour obtenir un exemple d'implémentation ITypeDescriptorFilterService, consultez la documentation de référence sur la classe ITypeDescriptorFilterService.

Voir aussi

Tâches

Comment : ajuster les attributs, événements et propriétés d'un composant en mode design

Concepts

Classes de concepteurs de base

Verbes de concepteur

Comment : implémenter un concepteur pour un contrôle

Vue d'ensemble du descripteur de type

Autres ressources

Concepteurs personnalisés