Partager via


Initialisation du concepteur et configuration des métadonnées

La manipulation des métadonnées et des attributs de filtre associés à un concepteur ou à un composant de concepteur fournit un mécanisme permettant aux applications de définir les outils Type utilisés par un concepteur particulier pour gérer différents objets (tels que des structures de données, des classes ou des entités graphiques), quand le concepteur est disponible et comment l'IDE Visual Studio est configuré pour prendre en charge le concepteur (par exemple, quelle catégorie ou quel onglet de la Boîte à outils est disponible).

Le SDK Visual Studio fournit plusieurs mécanismes pour faciliter le contrôle de l'initialisation d'un concepteur ou d'un composant de concepteur et la manipulation de ses métadonnées par un VSPackage.

Initialisation des métadonnées et des informations de configuration

Parce qu'ils sont chargés à la demande, les VSPackages peuvent ne pas avoir été chargés par l'environnement Visual Studio avant l'instanciation d'un designer. Par conséquent, les VSPackages ne peuvent pas utiliser le mécanisme standard de configuration d'un concepteur ou d'un composant de concepteur lors de la création, qui consiste à gérer un événement DesignerCreated. Au lieu de cela, un VSPackage met en œuvre une instance de l'interface DesignSurfaceExtension et s'enregistre pour fournir des personnalisations, appelées extensions de surface de conception.

Personnaliser l'initialisation

La personnalisation d'un concepteur, d'un composant ou d'une surface de conception implique :

  1. Modifier les métadonnées du concepteur et changer effectivement la façon dont un certain Type est accessible ou converti.

    Cela se fait généralement par le biais des mécanismes UITypeEditor ou TypeConverter.

    Par exemple, lorsque les concepteurs basés sur System.Windows.Forms sont initialisés, l'environnement Visual Studio modifie les objets UITypeEditor pour Image utilisés avec le concepteur afin d'utiliser le gestionnaire de ressources pour obtenir des bitmaps plutôt que le système de fichiers.

  2. L'intégration à l'environnement, par exemple en s'abonnant à des événements ou en obtenant des informations sur la configuration du projet. Vous pouvez obtenir des informations sur la configuration du projet et vous abonner à des événements en obtenant l'interface ITypeResolutionService.

  3. Modification de l'environnement utilisateur par l'activation des catégories appropriées de la boîte à outils ou par la restriction de l'applicabilité du concepteur en appliquant une instance de la classe ToolboxItemFilterAttribute au concepteur.

Initialisation du designer par un VSPackage

Un VSPackage doit gérer l'initialisation du designer de la manière suivante :

  1. Création d'un objet implémentant la classe DesignSurfaceExtension.

    Remarque

    La classe DesignSurfaceExtension ne doit jamais être implémentée sur le même objet que la classe Package.

  2. Enregistrer la classe qui implémente DesignSurfaceExtension comme fournissant un support pour les extensions du concepteur de VSPackage. Enregistrez la classe en appliquant les instances de DesignSurfaceExtensionAttribute, ProvideObjectAttribute et ProvideServiceAttribute à la classe qui fournit l'implémentation de Package du VSPackage.

Chaque fois qu'un concepteur ou un composant de concepteur est créé, l'environnement Visual Studio :

  • Accède à chaque fournisseur d'extension de surface de conception enregistré.

  • Installe et initialise une instance de l'objet DesignSurfaceExtension de chaque fournisseur d'extension de surface de conception.

  • Appelle la méthode OnDesignerCreated ou OnComponentCreated (selon le cas) du fournisseur de l'extension de la surface de conception.

Lors de l'implémentation de l'objet DesignSurfaceExtension en tant que membre d'un VSPackage, il est important de comprendre que :

  • L'environnement Visual Studio ne permet pas de contrôler les métadonnées ou autres paramètres de configuration qu'un fournisseur DesignSurfaceExtension particulier modifie. Il est possible que deux ou plusieurs fournisseurs DesignSurfaceExtension modifient la même fonctionnalité du concepteur de manière contradictoire, la modification finale étant définitive. La dernière modification appliquée est indéterminée.

  • Il est possible de restreindre explicitement une implémentation de l'objet DesignSurfaceExtension à des concepteurs spécifiques en appliquant des instances de ToolboxItemFilterAttribute à cette implémentation. Pour plus d'informations sur le filtrage des éléments de la boîte à outils, reportez-vous aux paragraphes ToolboxItemFilterAttribute et ToolboxItemFilterType.

Fourniture de métadonnées supplémentaires

Un VSPackage peut modifier la configuration d'un designer ou d'un composant de designer autrement qu'au moment de la conception.

La classe ProvideDesignerMetadataAttribute peut être utilisée de manière programmatique ou appliquée à un VSPackage qui fournit un designer.

Une instance de la classe ProvideDesignerMetadataAttribute est utilisée pour modifier les métadonnées des composants créés sur une surface de conception. Par exemple, on pourrait remplacer un navigateur de propriétés par défaut utilisé par les objets CommonDialog par un navigateur de propriétés personnalisé.

Les modifications apportées par une instance de ProvideDesignerMetadataAttribute appliquée à l'implémentation de Package d'un VSPackage peuvent avoir l'une des deux portées suivantes :

  • Globale -- pour toutes les nouvelles instances d'un composant donné

  • Local -- uniquement pour les instances du composant créées sur une surface de conception fournie par le VSPackage actuel.

La propriété IsGlobal de l'instance ProvideDesignerMetadataAttribute appliquée à la mise en œuvre de Package d'un VSPackage détermine cette portée.

L'application de l'attribut à une implémentation de Package dont la propriété IsGlobal de l'objet ProvideDesignerMetadataAttribute est définie sur true, comme ci-dessous, modifie le navigateur pour l'ensemble de l'environnement Visual Studio :

[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser), IsGlobal=true )]

internal class MyPackage : Package {}

Si l'indicateur global a été défini sur false, la modification des métadonnées est locale au concepteur actuel pris en charge par le VSPackage actuel :

[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser), IsGlobal=false )]

internal class MyPackage : Package {}

Remarque

La surface de conception ne permet de créer que des composants, et donc seuls les composants peuvent avoir des métadonnées locales. Dans l'exemple ci-dessus, nous cherchions à modifier une propriété, telle que la propriété Color d'un objet. Si false était transmis pour l'indicateur global, CustomBrowser n'apparaîtrait jamais car le concepteur ne crée jamais d'instance de Color. La définition de l'indicateur global sur false est utile pour les composants, tels que les contrôles, les minuteries et les boîtes de dialogue.