Partager via


Prise en charge en temps de conception de Visual Studio pour les contrôles personnalisés

Comme vous l’avez remarqué lors de l’interaction avec le concepteur Windows Forms, il existe de nombreuses fonctionnalités au moment du design offertes par les contrôles Windows Forms. Certaines des fonctionnalités offertes par le Concepteur Visual Studio incluent des lignes d’alignement, des éléments d’action et la grille de propriétés. Toutes ces fonctionnalités vous offrent un moyen plus simple d’interagir et de personnaliser un contrôle au moment du design. Cet article est une vue d’ensemble du type de support que vous pouvez ajouter à vos contrôles personnalisés pour améliorer l’expérience au moment du design pour les consommateurs de vos contrôles.

Ce qui est différent de .NET Framework

De nombreux éléments de conception de base des contrôles personnalisés sont restés identiques à partir de .NET Framework. Toutefois, si vous utilisez des fonctionnalités de personnalisation de concepteur plus avancées, telles que des listes d’actions, des convertisseurs de types, des dialogues personnalisés, vous avez des scénarios uniques à gérer.

Visual Studio est une application .NET Framework et, par conséquent, le Concepteur visuel que vous voyez pour Windows Forms est également basé sur .NET Framework. Avec un projet .NET Framework, l’environnement Visual Studio et l’application Windows Forms en cours d’exécution dans le même processus, devenv.exe. Cela pose un problème lorsque vous utilisez une application .NET Windows Forms (et non .NET Framework). .NET et .NET Framework ne peuvent pas fonctionner dans le même processus. Par conséquent, Windows Forms .NET utilise un autre concepteur, le concepteur « out-of-process ».

Le concepteur hors processus est un processus appelé DesignToolsServer.exe et est exécuté en même temps que le processus de devenv.exe de Visual Studio. Le processus DesignToolsServer.exe s’exécute dans la même version et la même plateforme, comme .NET 9 et x64, de .NET que votre application cible. Lorsque votre contrôle personnalisé doit afficher l’interface utilisateur dans Visual Studio, votre contrôle personnalisé doit implémenter une architecture client-serveur pour faciliter la communication vers et depuis devenv.exe. Pour plus d’informations, consultez Les changements du concepteur depuis .NET Framework.

Fenêtre De propriété

La fenêtre Propriétés de Visual Studio affiche les propriétés et les événements du contrôle ou du formulaire sélectionné. Il s’agit généralement du premier point de personnalisation que vous effectuez sur un contrôle ou un composant personnalisé.

L’image suivante montre un contrôle Button sélectionné dans le Concepteur visuel et la grille des propriétés montrant les propriétés du bouton :

Le concepteur Windows Forms dans Visual Studio affichant un bouton et la fenêtre de propriétés

Vous pouvez contrôler certains aspects de la façon dont les informations relatives à votre contrôle personnalisé s’affichent dans la grille des propriétés. Les attributs sont appliqués à la classe de contrôle personnalisée ou aux propriétés de classe.

Attributs pour les classes

Le tableau suivant montre les attributs que vous pouvez appliquer pour spécifier le comportement de vos composants et contrôles personnalisés au moment de la conception.

Caractéristique Descriptif
DefaultEventAttribute Spécifie l’événement par défaut d’un composant.
DefaultPropertyAttribute Spécifie la propriété par défaut d’un composant.
DesignerAttribute Spécifie la classe utilisée pour implémenter des services au moment de la conception pour un composant.
DesignerCategoryAttribute Spécifie que le concepteur pour une classe appartient à une certaine catégorie.
ToolboxItemAttribute Représente un attribut d’un élément de boîte à outils.
ToolboxItemFilterAttribute Spécifie la chaîne de filtrage et le type de filtre à utiliser pour un élément de boîte à outils.

Attributs pour les propriétés

Le tableau suivant décrit les attributs que vous pouvez appliquer aux propriétés ou aux autres membres de vos composants et contrôles personnalisés.

Caractéristique Descriptif
AmbientValueAttribute Spécifie la valeur à passer à une propriété pour que celle-ci obtienne sa valeur à partir d’une autre source. On appelle cela l’ambiance.
BrowsableAttribute Spécifie si une propriété ou un événement doit être affiché dans une fenêtre Propriétés.
CategoryAttribute Spécifie le nom de la catégorie dans laquelle regrouper la propriété ou l’événement lorsqu’elle est affichée dans un PropertyGrid contrôle défini sur Categorized mode.
DefaultValueAttribute Spécifie la valeur par défaut d'une propriété.
DescriptionAttribute Spécifie une description pour une propriété ou un événement.
DisplayNameAttribute Spécifie le nom complet d’une propriété, d’un événement ou d’une méthode publique qui ne retourne pas de valeur et ne prend aucun argument.
EditorAttribute Spécifie l’éditeur à utiliser pour modifier une propriété.
EditorBrowsableAttribute Spécifie qu'une propriété ou une méthode peut s'afficher dans un éditeur.
HelpKeywordAttribute Spécifie le mot clé du contexte pour une classe ou un membre.
LocalizableAttribute Spécifie si une propriété doit être localisée.
PasswordPropertyTextAttribute Indique que la représentation textuelle d’un objet est masquée par des caractères tels que des astérisques.
ReadOnlyAttribute Spécifie si la propriété de cet attribut est liée est en lecture seule ou lecture/écriture au moment de la conception.
RefreshPropertiesAttribute Indique que la grille de propriétés doit s’actualiser lorsque la valeur de propriété associée change.
TypeConverterAttribute Spécifie le type à utiliser comme convertisseur de l'objet auquel cet attribut est lié.

Concepteurs de contrôles personnalisés

L’expérience au moment du design pour les contrôles personnalisés peut être améliorée en créant un concepteur personnalisé associé. Par défaut, votre contrôle personnalisé s’affiche sur l’aire de conception de l’hôte, et il ressemble à celui qu’il effectue pendant l’exécution. Avec un concepteur personnalisé, vous pouvez améliorer l’affichage au moment du design du contrôle, ajouter des éléments d’action, des lignes d’alignement et d’autres éléments, ce qui peut aider l’utilisateur à déterminer comment disposer et configurer le contrôle. Par exemple, au moment du design, le ToolStrip concepteur ajoute des contrôles supplémentaires pour que l’utilisateur ajoute, supprime et configure les éléments individuels, comme illustré dans l’image suivante :

Concepteur Windows Forms dans Visual Studio montrant la vue au moment du design d’un conteneur fractionné.

Vous pouvez créer vos propres concepteurs personnalisés en effectuant les étapes suivantes :

  1. Ajout de référence au package NuGet Microsoft.WinForms.Designer.SDK.
  2. Créer un type hérite de la Microsoft.DotNet.DesignTools.Designers.ControlDesigner classe.
  3. Dans votre classe de contrôle utilisateur, marquez la classe avec l’attribut System.ComponentModel.DesignerAttribute de classe, en passant le type que vous avez créé à l’étape précédente.

Pour plus d’informations, consultez la section What’s different from .NET Framework .

Éléments d’action

Les actions du concepteur sont des menus contextuels qui permettent à l’utilisateur d’effectuer rapidement des tâches courantes. Par exemple, si vous ajoutez une TabControl à un formulaire, vous allez ajouter et supprimer des onglets dans et à partir du contrôle. Les onglets sont gérés dans la fenêtre Propriétés , via la TabPages propriété, qui affiche un éditeur de collection d’onglets. Au lieu de forcer l’utilisateur à toujours parcourir la liste Propriétés en recherchant la propriété TabPages, le TabControl fournit un bouton de balise intelligente qui n’est visible que lorsque le contrôle est sélectionné, comme illustré dans les images suivantes :

Le concepteur Windows Forms dans Visual Studio affichant le bouton de balise intelligente d’un contrôle d’onglet.

Lorsque la balise active est sélectionnée, la liste d’actions s’affiche :

Le concepteur Windows Forms dans Visual Studio montrant le bouton de smart tag d’un contrôle d’onglet pressé, affichant une liste d’actions.

En ajoutant les actions Ajouter un onglet et supprimer des onglets , le concepteur du contrôle le fait de sorte que vous puissiez rapidement ajouter ou supprimer un onglet.

Création d’une liste d’éléments d’action

Les listes d’éléments d’action sont fournies par le ControlDesigner type que vous créez. Les étapes suivantes sont un guide de base pour créer votre propre liste d’actions :

  1. Ajout de référence au package NuGet Microsoft.WinForms.Designer.SDK.
  2. Créez une classe de liste d’actions qui hérite de Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionList.
  3. Ajoutez les propriétés à la liste d’actions à laquelle vous souhaitez que l’utilisateur accède. Par exemple, l’ajout d’une bool propriété ou Boolean (en Visual Basic) à la classe crée un CheckBox contrôle dans la liste d’actions.
  4. Suivez les étapes de la section Concepteurs de contrôles personnalisés pour créer un concepteur.
  5. Dans la classe du concepteur, remplacez la ActionLists propriété, qui retourne un Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionListCollection type.
  6. Ajoutez votre liste d’actions à une DesignerActionListCollection instance et retournez-la.

Pour obtenir un exemple de liste d’actions, consultez le référentiel GitHub documents d’extensibilité du Concepteur Windows Forms et exemples gitHub, en particulier le TileRepeater.Designer.Server/ControlDesigner dossier.

Dans la fenêtre Propriétés, la plupart des propriétés sont facilement modifiées dans la grille, par exemple lorsque le type de stockage de la propriété est une énumération, une valeur booléenne ou un nombre.

Visual Studio Fenêtre Propriétés pour une application Windows Forms, affichant la propriété d’alignement.

Parfois, une propriété est plus complexe et nécessite une boîte de dialogue personnalisée que l’utilisateur peut utiliser pour modifier la propriété. Par exemple, la Font propriété est un type System.Drawing.Font , qui contient de nombreuses propriétés qui modifient l’apparence de la police. Cette propriété n’est pas facilement présentable dans la fenêtre Propriétés . Cette propriété utilise donc une boîte de dialogue personnalisée pour modifier la police :

Boîte de dialogue Police de Visual Studio pour une application Windows Forms.

Si vos propriétés de contrôle personnalisées utilisent les éditeurs de type intégrés fournis par Windows Forms, vous pouvez utiliser la fonction EditorAttribute pour marquer vos propriétés avec l’éditeur .NET Framework correspondant que Visual Studio doit utiliser. En utilisant les éditeurs intégrés, vous évitez d’avoir à répliquer la communication client-serveur d’objet proxy fournie par le concepteur hors processus.

Lors du référencement d’un éditeur de type intégré, utilisez le type .NET Framework, et non le type .NET :

[Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
        "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public string? Filename { get; set; }
<Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")>
Public Property Filename As String