Share via


Visual Studio-Entwurfszeitunterstützung für benutzerdefinierte Steuerelemente (Windows Forms .NET)

Wie Sie bei der Interaktion mit dem Windows Forms-Designer bemerkt haben, gibt es viele verschiedene Entwurfszeitfeatures, die von den Windows Forms-Steuerelementen angeboten werden. Zu den Features des Visual Studio-Designers gehören Ausrichtungslinien, Aktionselemente und das Eigenschaftenraster. All diese Features bieten Ihnen eine einfachere Möglichkeit, während der Entwurfszeit mit einem Steuerelement zu interagieren und dieses anzupassen. Dieser Artikel enthält eine Übersicht darüber, welche Form der Unterstützung Sie Ihren benutzerdefinierten Steuerelementen hinzufügen können, um die Entwurfszeit für Consumer Ihrer Steuerelemente zu verbessern.

Wichtig

Der Desktopleitfaden zu .NET 7 und .NET 6 ist in Bearbeitung.

Unterschiede zu .NET Framework

Viele grundlegende Designelemente von benutzerdefinierten Steuerelementen sind gegenüber .NET Framework unverändert geblieben. Wenn Sie jedoch erweiterte Anpassungsfeatures des Designers verwenden (z. B. Aktionslisten, Typkonverter, benutzerdefinierte Dialogfelder), sehen Sie sich einigen einzigartigen Szenarien gegenüber.

Visual Studio ist eine .NET Framework-basierte Anwendung, und der Visual Designer, den Sie für Windows Forms sehen, basiert auch auf .NET Framework. Bei einem .NET Framework-Projekt werden sowohl die Visual Studio-Umgebung als auch die Windows Forms-App, die entwickelt wird, innerhalb desselben Prozesses ausgeführt: devenv.exe. Dies stellt ein Problem dar, wenn Sie mit einer Windows Forms .NET-App (nicht .NET Framework) arbeiten. .NET und .NET Framework können nicht innerhalb desselben Prozesses verwendet werden. Daher verwendet Windows Forms .NET einen anderen Designer, den „Out-of-Process“-Designer.

Der Out-of-Process-Designer ist ein Prozess, der als DesignToolsServer.exe bezeichnet wird und parallel zum Prozess devenv.exe von Visual Studio ausgeführt wird. Der Prozess DesignToolsServer.exe wird mit derselben Version und Plattform wie .NET 7 und x64 von .NET ausgeführt, auf die Ihre App abzielt. Wenn Ihr benutzerdefiniertes Steuerelement eine Benutzeroberfläche im Prozess devenv.exe Ihres benutzerdefinierten Steuerelements anzeigen soll, muss eine Client-Server-Architektur implementiert werden, um die Kommunikation mit devenv.exe zu ermöglichen. Weitere Informationen finden Sie unter Designeränderungen seit .NET Framework (Windows Forms .NET).

Eigenschaftenfenster

Im Fenster Eigenschaften von Visual Studio werden die Eigenschaften und Ereignisse für das ausgewählte Steuerelement oder Formular angezeigt. Dies ist in der Regel die erste Anpassung, die Sie für ein benutzerdefiniertes Steuerelement oder eine benutzerdefinierte Komponente vornehmen.

Die folgende Abbildung zeigt ein Button-Steuerelement, das im Visual Designer ausgewählt ist, und das Eigenschaftenraster mit den Eigenschaften der Schaltfläche:

Der Windows Forms-Designer in Visual Studio mit einer Schaltfläche und dem Eigenschaftenfenster

Sie können verschiedene Aspekte steuern, z. B. wie Informationen zu Ihrem benutzerdefinierten Steuerelement im Eigenschaftenraster angezeigt werden. Attribute werden entweder auf die Klasse des benutzerdefinierten Steuerelements oder auf Klasseneigenschaften angewandt.

Attribute für Klassen

In der folgenden Tabelle werden die Attribute angezeigt, die Sie anwenden können, um das Verhalten Ihrer benutzerdefinierten Steuerelemente und Komponenten zur Entwurfszeit anzugeben.

attribute BESCHREIBUNG
DefaultEventAttribute Gibt das Standardereignis für eine Komponente an.
DefaultPropertyAttribute Gibt die Standardeigenschaft für eine Komponente an.
DesignerAttribute Gibt die Klasse an, die zum Implementieren von Entwurfszeitdiensten für eine Komponente verwendet wird.
DesignerCategoryAttribute Gibt an, dass der Designer für eine Klasse zu einer bestimmten Kategorie gehört.
ToolboxItemAttribute Stellt ein Attribut eines Werkzeugkastenelements dar.
ToolboxItemFilterAttribute Gibt die Filterzeichenfolge und den Filtertyp an, die für ein Werkzeugkastenelement verwendet werden sollen.

Attribute für Eigenschaften

Die folgende Tabelle enthält die Attribute, die Sie auf Eigenschaften oder andere Member der benutzerdefinierten Steuerelemente und Komponenten anwenden können.

attribute BESCHREIBUNG
AmbientValueAttribute Gibt den Wert an, der an eine Eigenschaft übergeben werden soll, damit die Eigenschaft den zugehörigen Wert von einer anderen Quelle abrufen kann. Dies wird als Umgebung bezeichnet.
BrowsableAttribute Gibt an, ob eine Eigenschaft oder ein Ereignis im Fenster Eigenschaften angezeigt werden soll.
CategoryAttribute Gibt den Namen der Kategorie an, in der die Eigenschaft oder das Ereignis bei der Anzeige in einem PropertyGrid-Steuerelement gruppiert werden soll, das auf den Modus Categorized festgelegt ist.
DefaultValueAttribute Gibt den Standardwert für eine Eigenschaft an.
DescriptionAttribute Gibt die Beschreibung einer Eigenschaft oder eines Ereignisses an.
DisplayNameAttribute Gibt den Anzeigenamen für eine Eigenschaft, ein Ereignis oder eine öffentliche Methode an, die bzw. das keinen Wert zurückgibt und keine Argumente akzeptiert.
EditorAttribute Gibt den Editor an, der zum Ändern einer Eigenschaft verwendet wird.
EditorBrowsableAttribute Gibt an, dass eine Eigenschaft oder Methode in einem Editor angezeigt werden kann.
HelpKeywordAttribute Gibt das Kontextschlüsselwort für eine Klasse oder ein Element an.
LocalizableAttribute Gibt an, ob eine Eigenschaft lokalisiert werden soll.
PasswordPropertyTextAttribute Gibt an, dass die Textdarstellung eines Objekts durch Zeichen wie Sternchen verdeckt wird.
ReadOnlyAttribute Gibt an, ob die Eigenschaft, an die dieses Attribut gebunden ist, schreibgeschützt ist oder ob zur Entwurfszeit Lese-/Schreibzugriff gewährt wird.
RefreshPropertiesAttribute Gibt an, dass das Eigenschaftenraster aktualisiert werden sollte, wenn sich der zugehörige Eigenschaftswert ändert.
TypeConverterAttribute Gibt an, welcher Typ als Konverter für das Objekt verwendet werden sollte, an das dieses Attribut gebunden ist.

Designer für benutzerdefinierte Steuerelemente

Die Entwurfszeitfunktionalität von benutzerdefinierten Steuerelementen kann durch die Erstellung eines zugehörigen benutzerdefinierten Designers erweitert werden. Standardmäßig wird Ihr benutzerdefiniertes Steuerelement auf der Entwurfsoberfläche des Hosts angezeigt, und zwar genau so, wie es zur Laufzeit dargestellt wird. Mit einem benutzerdefinierten Designer können Sie die Entwurfszeitansicht des Steuerelements verbessern sowie Aktionselemente, Ausrichtungslinien und andere Elemente hinzufügen, die bei der Bestimmung des Layouts und der Konfiguration des Steuerelements helfen können. Beispielsweise fügt der ToolStrip-Designer zur Entwurfszeit zusätzliche Steuerelemente hinzu, mit denen die einzelnen Elemente hinzugefügt, entfernt und konfiguriert werden können, wie in der folgenden Abbildung gezeigt:

Ein Windows Forms-Designer in Visual Studio mit der Entwurfszeitansicht eines geteilten Containers.

Sie können eigene benutzerdefinierte Designer erstellen, indem Sie die folgenden Schritte ausführen:

  1. Hinzufügen von Verweisen auf das NuGet-Paket „Microsoft.WinForms.Designer.SDK“.
  2. Erstellen Sie einen Typ, der von der Microsoft.DotNet.DesignTools.Designers.ControlDesigner-Klasse erbt.
  3. Markieren Sie in Ihrer Benutzersteuerelementklasse die Klasse mit dem System.ComponentModel.DesignerAttribute-Klassenattribute, und übergeben Sie den Typ, den Sie im vorherigen Schritt erstellt haben.

Weitere Informationen finden Sie im Abschnitt Unterschiede zu .NET Framework.

Aktionselemente

Designeraktionen sind kontextabhängige Menüs, mit denen häufige Aufgaben schnell ausgeführt werden können. Wenn Sie z. B. einem Formular ein TabControl hinzufügen, können Sie Registerkarten über das Steuerelement hinzufügen und entfernen. Die Registerkarten werden im Eigenschaftenfenster über die TabPages-Eigenschaft verwaltet, die einen Registerkarten-Auflistungs-Editor anzeigt. Anstatt zu erzwingen, dass Benutzer und Benutzerinnen immer die Liste Eigenschaften durchlaufen müssen, wenn sie nach der TabPages-Eigenschaft suchen, stellt das TabControl eine Smarttag-Schaltfläche bereit, die nur angezeigt wird, wenn das Steuerelement ausgewählt ist, wie in den folgenden Abbildungen gezeigt:

Der Windows Forms-Designer in Visual Studio mit der Smarttag-Schaltfläche eines Registerkartensteuerelements.

Wenn Sie das Smarttag auswählen, wird die Aktionsliste angezeigt:

Der Windows Forms-Designer in Visual Studio mit gedrückter Smarttag-Schaltfläche eines Registerkartensteuerelements, wodurch eine Liste der Aktionen angezeigt wird.

Indem Sie die Aktionen Registerkarte hinzufügen und Registerkarte entfernen hinzufügen, ändert der Designer das Steuerelements so, dass Sie schnell eine Registerkarte hinzufügen oder entfernen können.

Erstellen einer Aktionselementliste

Aktionselementlisten werden über den ControlDesigner-Typ bereitgestellt, den Sie erstellen. Die folgenden Schritte stellen einen grundlegenden Leitfaden für das Erstellen eigener Aktionslisten dar:

  1. Hinzufügen von Verweisen auf das NuGet-Paket „Microsoft.WinForms.Designer.SDK“.
  2. Erstellen Sie eine neue Aktionslistenklasse, die von Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionList erbt.
  3. Fügen Sie der Aktionsliste die Eigenschaften hinzu, auf die Benutzer und Benutzerinnen Zugriff haben sollen. Beispielsweise wird durch das Hinzufügen der Eigenschaft bool oder Boolean (in Visual Basic) zur Klasse ein CheckBox-Steuerelement in der Aktionsliste erstellt.
  4. Führen Sie die Schritte im Abschnitt Designer für benutzerdefinierte Steuerelemente aus, um einen neuen Designer zu erstellen.
  5. Überschreiben Sie in der designer-Klasse die ActionLists-Eigenschaft, die den Typ Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionListCollection zurückgibt.
  6. Fügen Sie Ihre Aktionsliste einer DesignerActionListCollection-Instanz hinzu, und geben Sie sie zurück.

Ein Beispiel für eine Aktionsliste finden Sie im GitHub-Repository Windows Forms Designer Extensibility Documents & Samples im Ordner TileRepeater.Designer.Server/ControlDesigner.

Im Eigenschaftenfenster werden die meisten Eigenschaften einfach im Raster bearbeitet, z. B. wenn der Unterstützungstyp der Eigenschaft eine Enumeration, ein boolescher Wert oder eine Zahl ist.

Das Fenster „Visual Studio-Eigenschaften“ für eine Windows Forms-App mit der Ausrichtungseigenschaft.

Manchmal ist eine Eigenschaft jedoch komplexer und erfordert ein benutzerdefiniertes Dialogfeld, über das ihre Eigenschaften geändert werden können. Die Font-Eigenschaft ist beispielsweise vom Typ System.Drawing.Font, der viele Eigenschaften enthält, die das Erscheinungsbild der Schriftart ändern. Dies ist im Eigenschaftenfenster nicht einfach darzustellen, sodass für diese Eigenschaft ein benutzerdefiniertes Dialogfeld verwendet wird, um die Schriftart zu bearbeiten:

Das Visual Studio-Dialogfeld „Schriftart“ für eine Windows Forms-App.

Wenn die Eigenschaften Ihrer benutzerdefinierten Steuerelemente Typ-Editoren verwenden, die von Windows Forms bereitgestellt werden, können Sie das EditorAttribute verwenden, um Ihre Eigenschaften mit dem entsprechenden .NET Framework-Editor zu kennzeichnen, den Visual Studio verwenden soll. Durch die Verwendung der integrierten Editoren vermeiden Sie die Anforderung, die vom Out-of-Process-Designer bereitgestellte Client-Server-Kommunikation des Proxyobjekts zu replizieren.

Verwenden Sie beim Verweisen auf einen integrierten Typ-Editor den .NET Framework-Typ, nicht den .NET-Typ:

[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