Übersicht über Menüs und Symbolleisten
Menüs und Symbolleisten sind die Art und Weise, wie Benutzer auf Befehle in Ihrer Erweiterung zugreifen. Sie sind praktische grafische Methoden, um Ihre Befehle benutzern zu präsentieren. In der Regel sind verwandte Befehle zusammen im gleichen Menü oder auf derselben Symbolleiste gruppiert.
Arbeiten mit Menüs und Symbolleisten
In dieser Übersicht werden die folgenden wichtigsten Szenarien für das Arbeiten mit Menüs und Symbolleisten behandelt:
- Erstellen eines Menüs
- Platzieren von Elementen in einem Menü
- Erstellen einer Symbolleiste
- Platzieren von Elementen auf einer Symbolleiste
- Erstellen einer Gruppe
- Platzieren von Elementen in einer Gruppe
- Platzieren von Gruppen in einem Menü oder einer Symbolleiste
- Platzierungsordnung (Priorität)
Erstellen eines Menüs
Um ein Menü mit dem neuen Erweiterbarkeitsmodell zu erstellen, fügen Sie eine statische MenuConfiguration
Eigenschaft hinzu, die die Klasse mit dem VisualStudioContribution
Attribut schmückt. Diese statische Eigenschaft kann für jede Klasse in Ihrem Erweiterungsprojekt platziert werden. In den neuen Extensibility Model-Beispielen sind sie für die Extension
Klasse zur Einfachheit vorhanden. Menüs ohne sichtbare untergeordnete Elemente werden in der Benutzeroberfläche nicht angezeigt.
[VisualStudioContribution]
public class ExtensionEntrypoint : Extension
{
[VisualStudioContribution]
public static MenuConfiguration MyMenu => new("%MyMenu.DisplayName%");
}
MenuConfiguration-Klasse
Die MenuConfiguration
Klasse verfügt über einige Parameter, mit denen Sie vertraut sein sollten:
Parameter | Type | Erforderlich | BESCHREIBUNG |
---|---|---|---|
DisplayName | String | Ja | Der Standardanzeigename des Menüs. Umgeben Sie diese Zeichenfolge mit dem Zeichen "%", um die Lokalisierung dieser Zeichenfolge zu aktivieren. Siehe " Lokalisieren von Metadaten". |
Tooltiptext | String | Nein | Der Text, der als QuickInfo angezeigt werden soll, wenn das Menü mit dem Mauszeiger oder dem Fokus angezeigt wird. Umgeben Sie diese Zeichenfolge mit dem Zeichen "%", um die Lokalisierung dieser Zeichenfolge zu aktivieren. Siehe " Lokalisieren von Metadaten". |
Positionierung | CommandPlacement[] | Nein | Gibt die vorhandenen Gruppen in Visual Studio an, zu denen das Menü übergeordnet wird. Siehe " Einfügen eines Menüs in der IDE". |
Children | MenuChild[] | Nein | Beschreibt den Satz von Befehlen, Menüs und Gruppen, die diesem Menü übergeordnet werden sollen. Die Reihenfolge, in der diese Elemente im Array definiert sind, stellen die Reihenfolge dar, in der sie visuell in der IDE angezeigt werden. Anzeigen von Elementen in einem Menü |
Platzieren eines Menüs in der IDE
Menüs werden auf die gleiche Weise wie Befehle in der IDE platziert. Siehe "Platzieren eines Befehls in der IDE".
public override MenuConfiguration MyMenu => new("%MyMenu.DisplayName%")
{
Placements = new CommandPlacement[]
{
CommandPlacement.KnownPlacements.ToolsMenu
},
};
Platzieren von Elementen in einem Menü
Das Platzieren eines Elements in einem Menü erfolgt durch Hinzufügen von Elementen zum Array auf dem Children
MenuConfiguration
. Die Reihenfolge, in der Elemente diesem Array hinzugefügt werden, diktieren, wie diese Elemente visuell in der IDE angezeigt werden.
Platzieren von Befehlen in einem Menü
Das Platzieren von Befehlen in einem Menü erfolgt mithilfe der MenuChild.Command<T>
Methode und ersetzt das Vorlagenargument durch den Klassennamen des Command
.
[VisualStudioContribution]
public static MenuConfiguration MyMenu => new("%MyMenu.DisplayName%")
{
Children = new[]
{
MenuChild.Command<MyCommand>(),
},
};
Platzieren von Menüs in einem Menü
Das Platzieren von Menüs in einem Menü erfolgt mithilfe der MenuChild.Menu
Methode, wobei eine andere als Parameter übergeben wird MenuConfiguration
.
[VisualStudioContribution]
public static MenuConfiguration MyChildMenu => new("My Child Menu!");
[VisualStudioContribution]
public static MenuConfiguration MyParentMenu => new("My Parent Menu!")
{
Children = new[]
{
MenuChild.Menu(MyChildMenu),
},
};
Trennen von Menüelementen in Gruppen
Elemente innerhalb eines Menüs können gruppiert werden, indem sie zwischen MenuChild.Separator
Elementen stehen. Visuell sieht dies wie eine dünne Linie zwischen zwei Elementen aus.
[VisualStudioContribution]
public static MenuConfiguration MyMenu1 => new("%MyMenu.DisplayName%")
{
Children = new[]
{
MenuChild.Command<MyCommand1>(), // Assuming there is a `Command` defined in the extension called `MyCommand1`
MenuChild.Menu(MyMenu2), // Assuming there is a `MenuConfiguration` defined in the extension called `MyMenu2`
MenuChild.Separator,
MenuChild.Command<MyCommand2>(), // Assuming there is a `Command` defined in the extension called `MyCommand2`
MenuChild.Menu(MyMenu3), // Assuming there is a `MenuConfiguration` defined in the extension called `MyMenu3`
},
};
Dies kann auch mithilfe der MenuChild.Group
Methode zum Definieren einer Gruppeninline erreicht werden. Anschließend verwenden Sie die GroupChild
Klasse, um übergeordnete Elemente für die Gruppe zu verwenden.
[VisualStudioContribution]
public static MenuConfiguration MyMenu1 => new("%MyMenu.DisplayName%")
{
Children = new[]
{
MenuChild.Group(
GroupChild.Command<MyCommand1>(), // Assuming there is a `Command` defined in the extension called `MyCommand1`
GroupChild.Menu(MyMenu2)), // Assuming there is a `MenuConfiguration` defined in the extension called `MyMenu2`
MenuChild.Group(
GroupChild.Command<MyCommand2>(), // Assuming there is a `Command` defined in the extension called `MyCommand2`
GroupChild.Menu(MyMenu3)), // Assuming there is a `MenuConfiguration` defined in the extension called `MyMenu3`
},
};
In den beiden vorherigen Beispielen wäre das resultierende Menü in der IDE identisch. Das Menü MyMenu1
würde wie das Menü im folgenden Screenshot aussehen:
Erstellen einer Symbolleiste
Um eine Symbolleiste mit dem neuen Erweiterbarkeitsmodell zu erstellen, fügen Sie eine statische ToolbarConfiguration
Eigenschaft hinzu, die die Klasse mit dem VisualStudioContribution
Attribut schmückt. Diese statische Eigenschaft kann für jede Klasse in Ihrem Erweiterungsprojekt platziert werden. In den neuen Extensibility Model-Beispielen sind sie für die Einfachheit der Extension
Klasse vorhanden.
[VisualStudioContribution]
public class ExtensionEntrypoint : Extension
{
[VisualStudioContribution]
public static ToolbarConfiguration MyToolbar => new("%MyToolbar.DisplayName%");
}
Wenn Sie die Placement
Eigenschaft der ToolbarConfiguration
null
Symbolleiste verlassen, wird sie auf der Standardsymbolleiste platziert und kann sichtbar gemacht werden, indem Sie die View -> Toolbars
Symbolleiste im Menü auswählen.
ToolbarConfiguration-Klasse
Die ToolbarConfiguration
Klasse verfügt über einige Eigenschaften, mit denen Sie vertraut sein sollten:
Eigenschaft | Type | Erforderlich | BESCHREIBUNG |
---|---|---|---|
DisplayName | String | Ja | Der Standardanzeigename der Symbolleiste. Umgeben Sie diese Zeichenfolge mit dem Zeichen "%", um die Lokalisierung dieser Zeichenfolge zu aktivieren. Siehe " Lokalisieren von Metadaten". |
Tooltiptext | String | Nein | Der Text, der als QuickInfo angezeigt werden soll, wenn die Symbolleiste mit dem Mauszeiger oder dem Fokus angezeigt wird. Umgeben Sie diese Zeichenfolge mit dem Zeichen "%", um die Lokalisierung dieser Zeichenfolge zu aktivieren. Siehe " Lokalisieren von Metadaten". |
Positionierung | CommandPlacement[] | Nein | Gibt die vorhandenen Gruppen in Visual Studio an, zu denen die Symbolleiste übergeordnet wird. Weitere Informationen finden Sie unter " Platzieren eines Befehls in der IDE". Wenn Sie diese Eigenschaft so verlassen, wie null sie die Symbolleiste auf der Standardsymbolleiste platzieren und sichtbar gemacht werden können, indem Sie die View -> Toolbars Symbolleiste im Menü auswählen |
Children | ToolbarChild[] | Nein | Beschreibt den Satz von Befehlen, Menüs und Gruppen, die dieser Symbolleiste übergeordnet werden sollen. Die Reihenfolge, in der diese Elemente im Array definiert sind, stellen die Reihenfolge dar, in der sie visuell in der IDE angezeigt werden. Unter " Elemente auf einer Symbolleiste platzieren" anzeigen |
Platzieren von Elementen auf einer Symbolleiste
Das Platzieren von Befehlen auf einer Symbolleiste erfolgt mithilfe der ToolbarChild.Command<T>
Methode, wobei das Vorlagenargument durch den Klassennamen des Command
Typs ersetzt wird.
[VisualStudioContribution]
public static ToolbarConfiguration MyToolbar => new("%MyToolbar.DisplayName%")
{
Children = new[]
{
ToolbarChild.Command<MyCommand>(),
},
};
Trennen von Symbolleistenelementen in Gruppen
Elemente in einer Symbolleiste können gruppiert werden, indem sie zwischen ToolbarChild.Separator
Elementen stehen. Visuell sieht dies wie eine dünne Linie zwischen zwei Elementen aus.
[VisualStudioContribution]
public static ToolbarConfiguration MyToolbar => new("%MyToolbar.DisplayName%")
{
Children = new[]
{
ToolbarChild.Command<MyCommand1>(), // Assuming there is a `Command` defined in the extension called `MyCommand1`
ToolbarChild.Separator,
ToolbarChild.Command<MyCommand2>(), // Assuming there is a `Command` defined in the extension called `MyCommand2`
},
};
Dies kann auch mithilfe der ToolbarChild.Group
Methode zum Definieren einer Gruppeninline erreicht werden. Anschließend verwenden Sie die ToolbarChild
Klasse, um übergeordnete Elemente für die Gruppe zu verwenden.
[VisualStudioContribution]
public static ToolbarConfiguration MyToolbar => new("%MyToolbar.DisplayName%")
{
Children = new[]
{
ToolbarChild.Group(
GroupChild.Command<MyCommand1>(), // Assuming there is a `Command` defined in the extension called `MyCommand1`
ToolbarChild.Group(
GroupChild.Command<MyCommand2>(), // Assuming there is a `Command` defined in the extension called `MyCommand2`
},
};
In den beiden Beispielen würde die resultierende Symbolleiste in der IDE identisch sein. Die Symbolleiste MyToolbar
würde wie die Symbolleiste im folgenden Screenshot aussehen:
Erstellen einer Gruppe
Eine Gruppe ist eine visuelle Gruppierung von Elementen, in denen ein Trennzeichen zwischen den letzten und ersten Elementen benachbarter Gruppen platziert wird. In den obigen Abschnitten wird beschrieben, wie Gruppen innerhalb des Kontexts der Children
Eigenschaft eines oder ToolbarConfiguration
mehrerer MenuConfiguration
Elemente erstellt werden. Es ist auch möglich, Gruppen innerhalb ihrer eigenen CommandGroupConfiguration
zu definieren. Dies ist nützlich, wenn Sie eine Gruppe zu einem vorhandenen Menü oder einer vorhandenen Symbolleiste in Visual Studio überziehen möchten, ohne ihr eigenes Menü oder die eigene Symbolleiste zu definieren. Es kann auch hilfreich sein, wenn Sie Ihren Code auf eine Weise formatieren möchten, die Ihre Gruppendefinitionen von Ihren Menü- und Symbolleistendefinitionen trennt.
Um eine Gruppe mit dem neuen Erweiterbarkeitsmodell zu erstellen, fügen Sie eine statische CommandGroupConfiguration
Eigenschaft hinzu. Diese statische Eigenschaft kann für jede Klasse in Ihrem Erweiterungsprojekt platziert werden. In den neuen Extensibility Model-Beispielen sind sie für die Einfachheit der Extension
Klasse vorhanden. Wenn ein CommandGroupConfiguration
Attribut angibt Placement
, sollte es auch mit dem VisualStudioContribution
Attribut versehen werden.
public static CommandGroupConfiguration MyGroup => new();
[VisualStudioContribution]
private static CommandGroupConfiguration MyGroupWithPlacement => new(GroupPlacement.KnownPlacements.ToolsMenu);
CommandGroupConfiguration-Klasse
Die CommandGroupConfiguration
Klasse verfügt über einige Parameter, mit denen Sie vertraut sein sollten:
Parameter | Type | Erforderlich | Beschreibung |
---|---|---|---|
Platzierung | GroupPlacement | Nein | Gibt das vorhandene Menü oder die Symbolleiste in Visual Studio an, zu dem die Gruppe übergeordnet wird. Anzeigen unter " Platzieren einer Gruppe in der IDE". |
Children | GroupChild[] | Nein | Beschreibt den Satz von Befehlen und Menüs, die dieser Gruppe übergeordnet werden sollen. Die Reihenfolge, in der diese Elemente im Array definiert sind, stellen die Reihenfolge dar, in der sie visuell in der IDE angezeigt werden. Anzeigen von Elementen in einer Gruppe |
Platzieren einer Gruppe in der IDE
Es gibt eine Reihe von gut definierten Stellen in Visual Studio, an denen Befehle platziert werden können. Diese Platzierungen werden durch die Eigenschaft CommandPlacement.KnownPlacements
für die Klasse Commands.GroupPlacement
definiert. Der aktuelle Satz von KnownPlacements
ist:
ToolsMenu
– Der Befehl wird in einer Gruppe unter dem Menü "Extras" auf oberster Ebene in Visual Studio platziert.ViewOtherWindowsMenu
– Der Befehl wird in einer Gruppe unter dem Menü "Ansicht"> der obersten Ebene " "Andere Windows" in Visual Studio platziert.ExtensionsMenu
– Der Befehl wird in Einer Gruppe unter dem Menü "Erweiterungen" der obersten Ebene in Visual Studio platziert.
[VisualStudioContribution]
public static CommandGroupConfiguration MyGroup1 => new(GroupPlacement.KnownPlacements.ToolsMenu);
[VisualStudioContribution]
public static CommandGroupConfiguration MyGroup2 => new(GroupPlacement.KnownPlacements.ExtensionsMenu.WithPriority(0x100));
Platzieren von Elementen in einer Gruppe
Befehle und Menüs können mithilfe der Arrayeigenschaft auf der Children
CommandGroupConfiguration
.
Platzieren von Befehlen in einer Gruppe
Das Platzieren von Befehlen in einer Gruppe erfolgt mithilfe der GroupChild.Command<T>
Methode, wobei das Vorlagenargument durch den Klassennamen des Typs Command
ersetzt wird.
[VisualStudioContribution]
public static CommandGroupConfiguration MyGroup => new(GroupPlacement.KnownPlacements.ToolsMenu)
{
Children = new[]
{
GroupChild.Command<MyCommand>(),
},
};
Platzieren von Menüs in einer Gruppe
Das Platzieren von Menüs in einer Gruppe erfolgt mithilfe der GroupChild.Menu
Methode, die einen MenuConfiguration
als Parameter übergibt.
[VisualStudioContribution]
public static MenuConfiguration MyMenu => new("%MyMenu.DisplayName%");
[VisualStudioContribution]
public static CommandGroupConfiguration MyGroup => new(GroupPlacement.KnownPlacements.ToolsMenu)
{
Children = new[]
{
GroupChild.Menu(MyMenu),
},
};
Platzieren von Gruppen in einem Menü oder einer Symbolleiste
Das Platzieren einer Gruppe in einem Menü erfolgt mithilfe der MenuChild.Group
Methode, indem ein CommandGroupConfiguration
Parameter übergeben wird. Das Platzieren einer Gruppe auf einer Symbolleiste erfolgt mithilfe der ToolbarChild.Group
Methode, indem ein CommandGroupConfiguration
Parameter übergeben wird. Gruppen, die auf diese Weise menüs oder Symbolleisten zugeordnet sind, können nicht über die Placement
Eigenschaft des CommandGroupConfiguration
Satzes auf einen beliebigen Wert verfügen, außer null
, und sie sollte nicht mit dem VisualStudioContribution
Attribut versehen werden.
private static CommandGroupConfiguration MyGroup => new()
{
Children = new[]
{
GroupChild.Command<MyCommand1>(), // Assuming there is a `Command` defined in the extension called `MyCommand1`
GroupChild.Command<MyCommand2>(), // Assuming there is a `Command` defined in the extension called `MyCommand2`
},
};
[VisualStudioContribution]
public static MenuConfiguration MyMenu => new("%MyMenu.DisplayName%")
{
Children = new[]
{
MenuChild.Group(MyGroup),
},
};
private static CommandGroupConfiguration MyGroup => new()
{
Children = new[]
{
GroupChild.Command<MyCommand1>(), // Assuming there is a `Command` defined in the extension called `MyCommand1`
GroupChild.Command<MyCommand2>(), // Assuming there is a `Command` defined in the extension called `MyCommand2`
},
}
[VisualStudioContribution]
public static ToolbarConfiguration MyToolbar => new("%MyToolbar.DisplayName%")
{
Children = new[]
{
ToolbarChild.Group(MyGroup),
},
};
Platzierungsordnung (Priorität)
Platzierungen werden basierend auf dem Wert ihrer Priority
Eigenschaft sortiert, wenn ein übergeordnetes Element zu einem in VSCT definierten Steuerelement relativ zu anderen Elementen, die der gleichen Gruppe, einem Menü oder einer Symbolleiste zugeordnet sind, zugeordnet wird. Bei der Priority
-Eigenschaft handelt es sich um eine unsigned short
. Der Standardwert Priority
für ein CommandPlacement
und GroupPlacement
ist 0
und kann durch Aufrufen der CommandPlacement.WithPriority
Methoden oder GroupPlacement.WithPriority
Methoden geändert werden, wobei der gewünschte Priority
Wert übergeben wird. Dies Priority
kann auch mithilfe der CommandPlacement.VsctParent
Methoden und GroupPlacement.VsctParent
methoden festgelegt und direkt an die gewünschte Priority
übergeben werden.
Die Priority
Eigenschaft ist nicht beteiligt, wenn elemente zum Steuern über Konfigurationsobjekte mithilfe des VisualStudio.Extensibility-Modells definiert werden (d. h. die Gruppe, das Menü oder die Symbolleiste, für die übergeordnete Elemente definiert wurden, mithilfe CommandGroupConfiguration
von , MenuConfiguration
oder ToolbarConfiguration
).
GroupPlacement
GroupPlacement.KnownPlacements.ToolsMenu.WithPriority(0x0500);
// Parenting a group to the "Help" top level menu
GroupPlacement.VsctParent(new Guid("{d309f791-903f-11d0-9efc-00a0c911004f}"), id: 0x0088, priority: 0x0500);
CommandPlacement
CommandPlacement.KnownPlacements.ToolsMenu.WithPriority(0x0500);
// Parenting a command to the "Help -> About" group
CommandPlacement.VsctParent(new Guid("{d309f791-903f-11d0-9efc-00a0c911004f}"), id: 0x016B, priority: 0x0801);