Creación de ventanas de herramientas de Visual Studio

Las ventanas de herramientas son una manera de agregar una interfaz de usuario compleja e interacciones a Visual Studio. Normalmente proporcionan una manera fácil de interactuar con varias API y características. Por ejemplo, la ventana de herramientas de Explorador de soluciones proporciona una vista basada en árboles del proyecto actual,solución/carpeta y proporciona gestos sencillos para la apertura, el cambio de nombre y la creación de archivos.

Las ventanas de herramientas son de instancia única, lo que significa que solo se puede abrir una instancia de la ventana de herramientas a la vez. Cuando se cierra una ventana de herramientas en el IDE, solo está visiblemente oculta, en lugar de estar completamente cerrada y desechada de documentos similares.

Introducción

Para empezar, siga el tutorial creación de la primera extensión .

Trabajar con Ventanas de herramientas

Esta guía está diseñada para cubrir los principales escenarios de usuario al trabajar con Windows de herramientas:

Creación de una ventana de herramientas

Crear una ventana de herramientas con el nuevo modelo de extensibilidad es tan sencillo como extender la clase base y adornar la clase ToolWindow con el atributo VisualStudioContribution.

[VisualStudioContribution]
public class MyToolWindow : ToolWindow

Atributo ToolWindow

La ToolWindow clase abstracta requiere la implementación de la ToolWindowConfiguration configuración, que tiene algunas propiedades con las que debe familiarizarse:

Parámetro Type Obligatorio Descripción Valor predeterminado
Colocación ToolWindowPlacement No Ubicación en Visual Studio donde se debe abrir la primera vez la ventana de herramientas. ToolWindowPlacement.DockedTo permite acoplar la ventana de herramientas a un GUID que coincida con un identificador antiguo de la ventana de herramientas de estilo VSIX. Vea más sobre ToolWindowPlacement. ToolWindowPlacement.Floating
DockDirection Acoplar No Dirección relativa a la ubicación donde se debe acoplar la ventana de herramientas cuando se abra la primera vez. Consulta Dock. Dock.None
AllowAutoCreation Booleano No Especifica si la ventana de herramientas se puede crear automáticamente. Si se establece en false, las ventanas de herramientas que están abiertas cuando Se cierra Visual Studio no se restaurarán automáticamente cuando Visual Studio se vuelva a abrir. true

Ejemplo

[VisualStudioContribution]
public class MyToolWindow : ToolWindow
{
    public MyToolWindow(VisualStudioExtensibility extensibility)
        : base(extensibility)
    {
        this.Title = "My Tool Window";
    }

    public override ToolWindowConfiguration ToolWindowConfiguration => new()
    {
        Placement = ToolWindowPlacement.Floating,
        DockDirection = Dock.Right,
        AllowAutoCreation = true,
    };

    public override Task<IRemoteUserControl> GetContentAsync(CancellationToken cancellationToken)
    {
        // Create and return a RemoteUserControl
    }
}

Agregar contenido a una ventana de herramientas

Dado que las extensiones de VisualStudio.Extensibility podrían estar fuera de proceso desde el IDE, no podemos usar directamente WPF como capa de presentación para el contenido de Tool Windows. En su lugar, agregar contenido a una ventana de herramientas requiere la creación de remoteUserControl y la plantilla de datos correspondiente para ese control. Aunque hay algunos ejemplos sencillos a continuación, se recomienda leer la documentación de la interfaz de usuario remota al agregar contenido de la ventana de herramientas.

[VisualStudioContribution]
public class MyToolWindow : ToolWindow
{
    public MyToolWindow(VisualStudioExtensibility extensibility)
        : base(extensibility)
    {
        this.Title = "My Tool Window";
    }

    public override ToolWindowConfiguration ToolWindowConfiguration => new()
    {
        Placement = ToolWindowPlacement.DocumentWell,
    };

    public override async Task InitializeAsync(CancellationToken cancellationToken)
    {
        // Do any work here that is needed before creating the control.
    }

    public override Task<IRemoteUserControl> GetContentAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult<IRemoteUserControl>(new MyToolWindowControl());
    }
}

MyToolWindowControl.cs: (se trata de un nombre de archivo de ejemplo y debe tener el mismo nombre que el archivo de plantilla de datos)

internal class MyToolWindowControl : RemoteUserControl
{
    public MyToolWindowControl()
        : base(dataContext: null)
    {
    }
}

MyToolWindowControl.xaml (este es un nombre de archivo de ejemplo y debe tener el mismo nombre que la clase que deriva de RemoteUserControl)

<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:vs="http://schemas.microsoft.com/visualstudio/extensibility/2022/xaml">
    <Label></Label>
</DataTemplate>

para obtener más información sobre cómo crear un RemoteUserControl, vea Interfaz de usuario remota.

Crear un comando para mostrar una ventana de herramientas

Un mecanismo común para mostrar una ventana de herramientas es agregar un comando que, cuando se invoca, muestra la ventana de herramientas llamando a ShellExtensibility.ShowToolWindowAsync().

ShowToolWindowAsync() tiene un parámetro booleano, activate:

  • Cuando true, la ventana de herramientas estará visible tanto en el IDE como en el foco especificado.
  • Cuando false, la ventana de herramientas estará visible en el IDE, pero solo puede ser visible como una pestaña en un grupo de pestañas si otras ventanas de herramientas están activas.

Ejemplo

[VisualStudioContribution]
public class MyToolWindowCommand : Command
{
    public MyToolWindowCommand(VisualStudioExtensibility extensibility)
        : base(extensibility)
    {
    }
    
    public override CommandConfiguration CommandConfiguration => new("My Tool Window")
    {
        Placements = new[] { CommandPlacement.KnownPlacements.ToolsMenu },
        Icon = new(ImageMoniker.KnownValues.ToolWindow, IconSettings.IconAndText),
    };

    public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
    {
        await this.Extensibility.Shell().ShowToolWindowAsync<MyToolWindow>(activate: true, cancellationToken);
    }
}

Consulte los documentos comandos para obtener más información sobre cómo crear y usar comandos.

Controlar la visibilidad de una ventana de herramientas

Otra forma de controlar la visibilidad de una ventana de herramientas, además de usar comandos, es usar restricciones de activación basadas en reglas. Esto permite que las ventanas de herramientas se abran automáticamente cuando se cumplan ciertas condiciones y se vuelvan a ocultar cuando esas condiciones ya no sean aplicables.

ToolWindowVisibleWhenAttribute

El VisibleWhen atributo tiene algunos parámetros con los que debe familiarizarse:

Parámetro Type Obligatorio Descripción
Expression Cadena Cadena de expresión booleana que, cuando es true, significará que el contexto está activo y se mostrará la ventana de herramientas.
TermNames String[] Nombres de los términos usados en la expresión.
TermValues String[] Valores de cada término. Los valores de término deben estar en el mismo orden que la matriz de nombres de términos.

Ejemplo

// The tool window will be shown if the active document is a .cs file, and
// will be hidden if the active document is any any other type of file.
public override ToolWindowConfiguration ToolWindowConfiguration => new()
{
    VisibleWhen = ActivationConstraint.ClientContext(ClientContextKey.Shell.ActiveSelectionFileName, @"\.cs$"),
};

Consulte Restricciones de activación basadas en reglas para obtener más información sobre los valores de término válidos.

Pasos siguientes

Asegúrese de leer cómo funciona la interfaz de usuario remota en el marco de extensibilidad de VisualStudio.Extensibility.

El contenido de la ventana de herramientas se crea mediante WPF, por lo que consulte la documentación de WPF para obtener instrucciones.

Consulte el ejemplo ToolWindow para obtener un ejemplo completo de creación de una extensión con una ventana de herramientas.