Creación de cuadros de diálogo de Visual Studio

Los diálogos son una manera de solicitar a un usuario información o permitir personalizaciones del comportamiento de las características. Por ejemplo, el cuadro de diálogo Herramientas/Opciones tiene páginas individuales que permiten al usuario controlar el comportamiento de características como temas, editores y pestañas de documento.

Introducción

Para empezar, siga la sección Crear el proyecto en la sección Introducción.

Trabajo con diálogos

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

Crear un cuadro de diálogo

Crear una ventana de herramientas con el nuevo modelo de extensibilidad es tan sencillo como llamar al método ShowDialogAsync desde los asistentes de shellExtensibility y pasar el contenido del cuadro de diálogo.

Screenshot of a Dialog.

ShowDialogAsync

El método ShowDialogAsync tiene varias sobrecargas con las que debe familiarizarse:

Sobrecargas

Parámetros

Nombre Tipo Descripción
content Microsoft.VisualStudio.RpcContracts.RemoteUI.IRemoteUserControl Contenido del cuadro de diálogo.
title System.String Título del cuadro de diálogo.
options Microsoft.VisualStudio.RpcContracts.Notifications.DialogOption Opciones para mostrar el cuadro de diálogo.
cancellationToken System.Threading.CancellationToken CancellationToken para cancelar el cuadro de diálogo.
public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
	// Ownership of the RemoteUserControl is transferred to Visual Studio, so it shouldn't be disposed by the extension
	#pragma warning disable CA2000 // Dispose objects before losing scope
	var control = new MyDialogControl(null);
	#pragma warning restore CA2000 // Dispose objects before losing scope

	await this.Extensibility.Shell().ShowDialogAsync(control, cancellationToken);
}

Para obtener más información sobre cómo crear un control RemoteUserControl, consulte Interfaz de usuario remota.

Personalizar el título del cuadro de diálogo

Cuando la extensión muestre un cuadro de diálogo, puede proporcionar una cadena de título personalizada que se mostrará en la región de subtítulo del cuadro de diálogo.

Screenshot showing a Dialog title.

public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
	// Ownership of the RemoteUserControl is transferred to Visual Studio, so it shouldn't be disposed by the extension
	#pragma warning disable CA2000 // Dispose objects before losing scope
	var control = new MyDialogControl(null);
	#pragma warning restore CA2000 // Dispose objects before losing scope

	await this.Extensibility.Shell().ShowDialogAsync(control, "My Dialog Title", cancellationToken);
}

Personalizar los botones de diálogo

Cuando se muestra un diálogo en el IDE, se pueden seleccionar determinadas combinaciones de botones de diálogo predefinidos y acciones predeterminadas. Las combinaciones predefinidas de botón y acción se pueden encontrar en Microsoft.VisualStudio.RpcContracts.Notifications.DialogOption.

Screenshot of a Dialog button.

Además, puede crear su propia combinación de botones y acciones predeterminadas desde:

  • Microsoft.VisualStudio.RpcContracts.Notifications.DialogButton

      public enum DialogButton
      {
      	// Hides all of the dialog buttons.
      	None,
      	// Shows a single close button.
      	Close,
      	// Shows a single OK button.
      	OK,
      	// Shows an OK and Cancel button.
      	OKCancel
      }
    
  • Microsoft.VisualStudio.RpcContracts.Notifications.DialogResult

    public enum DialogResult
      {
      	// The dialog was closed via the System.Threading.CancellationToken or using an
      	// action provided by the Microsoft.Visual Studio.RpcContracts.RemoteUI.IRemoteUserControl
      	// content.
      	None,
      	// The user clicked the Close button.
      	Close,
      	// The user clicked the OK button.
      	OK,
      	// The user clicked the Cancel button, or clicked the nonclient close button, or
      	// pressed the Esc key.
      	Cancel
    }
    

Ejemplos

Agregar un botón cancelar:

public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
	// Ownership of the RemoteUserControl is transferred to Visual Studio, so it shouldn't be disposed by the extension
	#pragma warning disable CA2000 // Dispose objects before losing scope
	var control = new MyDialogControl(null);
	#pragma warning restore CA2000 // Dispose objects before losing scope

	await this.Extensibility.Shell().ShowDialogAsync(control, DialogOption.OKCancel, cancellationToken);
}

Sin botones de diálogo:

public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
	// Ownership of the RemoteUserControl is transferred to Visual Studio, so it shouldn't be disposed by the extension
	#pragma warning disable CA2000 // Dispose objects before losing scope
	var control = new MyDialogControl(null);
	#pragma warning restore CA2000 // Dispose objects before losing scope

	await this.Extensibility.Shell().ShowDialogAsync(control, new DialogOption(DialogButton.None, DialogResult.None), cancellationToken);
}

Obtención del resultado del cuadro de diálogo

Si necesita saber si un usuario cerró positivamente un cuadro de diálogo o lo descartó, puede esperar la llamada a ShowDialogAsyncy devolverá un Microsoft.VisualStudio.RpcContracts.Notifications.DialogResult, que representa la acción realizada por el usuario.

public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
	// Ownership of the RemoteUserControl is transferred to Visual Studio, so it shouldn't be disposed by the extension
	#pragma warning disable CA2000 // Dispose objects before losing scope
	var control = new MyDialogControl(null);
	#pragma warning restore CA2000 // Dispose objects before losing scope

	DialogResult result = await this.Extensibility.Shell().ShowDialogAsync(control, "My Dialog Title", DialogOption.OKCancel, cancellationToken);

	if (result == DialogResult.OK)
	{
		// User clicked the OK button
	}
}

Pasos siguientes

Consulte el ejemplo DialogSample para obtener un ejemplo completo de creación de una extensión con un cuadro de diálogo.