Erstellen benutzerdefinierter Toolfenster

Benutzerdefinierte Toolfenster sind großartige Optionen zum Hinzufügen komplexer UI zu Visual Studio.

Ein Toolfenster ist ein zentrales Benutzeroberflächenkonzept in Visual Studio. Im folgenden Video wird gezeigt, wie Sie ein benutzerdefiniertes Fenster hinzufügen.

Ein Toolfenster ist ein Fenster, das wie die Projektmappen-Explorer, die Fehlerliste und andere bekannte Toolfenster verschoben und angedockt werden kann. Ein Toolfenster besteht aus einer äußeren Shell, die von Visual Studio bereitgestellt wird, und einem benutzerdefinierten inneren UI-Steuerelement, das normalerweise ein XAML <usercontrol>ist, das von der Erweiterung bereitgestellt wird.

Hinweis

Um eine neue Erweiterung mit einem Toolfenster zu erstellen, erstellen Sie ein neues Projekt mit der VSIX Project w/Tool Window (Community) -Vorlage, und überspringen Sie den Rest dieses Rezepts. Weitere Informationen finden Sie unter "Erste Schritte ".

Das Hinzufügen eines Toolfensters zu einer vorhandenen Erweiterung erfordert vier einfache Schritte:

  1. Erstellen Sie eine Äußere Shellklasse für ein Toolfenster.
  2. Fügen Sie dem Toolfenster einen XAML-Code <usercontrol> hinzu.
  3. Registrieren Sie das Toolfenster.
  4. Erstellen Sie einen Befehl, um das Toolfenster anzuzeigen.

Beginnen wir mit Schritt 1.

Erstellen des Toolfensters

Mithilfe der BaseToolWindow<T> generischen Basisklasse werden wir aufgefordert, einige grundlegende Informationen bereitzustellen. Wir müssen den Titel des Toolfensters angeben, das XAML-Benutzersteuerelement erstellen und zurückgeben und die tatsächliche ToolWindowPane Klasse festlegen, die von Visual Studio zum Erstellen der äußeren Shell des Fensters verwendet wird.

using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using Community.VisualStudio.Toolkit;
using EnvDTE80;
using Microsoft.VisualStudio.Imaging;
using Microsoft.VisualStudio.Shell;

public class MyToolWindow : BaseToolWindow<MyToolWindow>
{
    public override string GetTitle(int toolWindowId) => "My Tool Window";

    public override Type PaneType => typeof(Pane);

    public override async Task<FrameworkElement> CreateAsync(int toolWindowId, CancellationToken cancellationToken)
    {
        await Task.Delay(2000); // Long running async task
        return new MyUserControl();
    }

    // Give this a new unique guid
    [Guid("d3b3ebd9-87d1-41cd-bf84-268d88953417")] 
    internal class Pane : ToolWindowPane
    {
        public Pane()
        {
            // Set an image icon for the tool window
            BitmapImageMoniker = KnownMonikers.StatusInformation;
        }
    }
}

Sie müssen eine Instanz ihres benutzerdefinierten Benutzersteuerelements aus der CreateAsync(int, CancellationToken) Methode erstellen, die dann automatisch an die Toolfenstershell übergeben wird, wenn es von Visual Studio erstellt wird.

Zuerst müssen Sie jedoch das Benutzersteuerelement erstellen.

Hinzufügen des XAML-Benutzersteuerelements

Dabei kann es sich um einen beliebigen XAML-Code mit der CodeBehind-Klasse handeln. Hier sehen Sie also ein einfaches Beispiel für eine <usercontrol> einzelne Schaltfläche:

<UserControl x:Class="MyUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:toolkit="clr-namespace:Community.VisualStudio.Toolkit;assembly=Community.VisualStudio.Toolkit"
             mc:Ignorable="d"
             toolkit:Themes.UseVsTheme="True"
             d:DesignHeight="300" d:DesignWidth="300"
             Name="MyToolWindow">
    <Grid>
        <StackPanel Orientation="Vertical">
            <Label Margin="10" HorizontalAlignment="Center">My Window</Label>
            <Button Content="Click me!" Click="button1_Click" Width="120" Height="80" Name="button1"/>
        </StackPanel>
    </Grid>
</UserControl>

Jetzt haben wir unsere Toolfensterklasse, die unser benutzerdefiniertes Steuerelement zurückgibt. Der nächste Schritt besteht darin, unser Toolfenster mit Visual Studio zu registrieren.

Registrieren des Toolfensters

Das Registrieren des Toolfensters bedeutet, dass wir Visual Studio über das Vorhandensein und das Instanziieren von Visual Studio informieren. Dazu verwenden wir die Paketklasse mithilfe des [ProvideToolWindow] Attributs.

[ProvideToolWindow(typeof(MyToolWindow.Pane))]
public sealed class MyPackage : ToolkitPackage
{
     protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
     {
         this.RegisterToolWindows();
     }
}

Hinweis

Beachten Sie, dass die Paketklasse von der ToolkitPackage und nicht von oder AsyncPackage.Package

Sie können angeben, über welche Formatvorlage das Toolfenster verfügen soll und wo es standardmäßig angezeigt werden soll. Das folgende Beispiel zeigt, dass das Toolfenster im gleichen Dockingcontainer wie Projektmappen-Explorer in einer verknüpften Formatvorlage platziert werden soll.

[ProvideToolWindow(typeof(MyToolWindow.Pane), Style = VsDockStyle.Linked, Window = WindowGuids.SolutionExplorer)]

Um das Toolfenster standardmäßig sichtbar zu machen, können Sie die Sichtbarkeit in verschiedenen UI-Kontexten mithilfe des [ProvideToolWindowVisibility] Attributs angeben.

[ProvideToolWindowVisibility(typeof(MyToolWindow.Pane), VSConstants.UICONTEXT.NoSolution_string)]

Befehl zum Anzeigen des Toolfensters

Dies ist identisch mit jedem anderen Befehl, und Sie können sehen, wie Sie eins im Menü- und Befehlsrezept hinzufügen.

Die Befehlshandlerklasse, die das Toolfenster anzeigt, sieht ungefähr wie folgt aus:

using Community.VisualStudio.Toolkit;
using Microsoft.VisualStudio.Shell;
using Task = System.Threading.Tasks.Task;

[Command(PackageIds.RunnerWindow)]
internal sealed class MyToolWindowCommand : BaseCommand<MyToolWindowCommand>
{
    protected override async Task ExecuteAsync(OleMenuCmdEventArgs e) =>
        await MyToolWindow.ShowAsync();
}

Die Befehlsplatzierung für Toolfenster befindet sich in der Regel unter "Ansicht –> Andere Fenster" im Menü Standard.

Das ist alles. Herzlichen Glückwunsch, Sie haben jetzt Ihr benutzerdefiniertes Toolfenster erstellt.

Herunterladen des Quellcodes

Den Quellcode für dieses Rezept finden Sie im Beispiel-Repository.