Share via


Crear y administrar cuadros de diálogo modales

Al crear un cuadro de diálogo modal dentro de Visual Studio, debe asegurarse de que la ventana primaria del cuadro de diálogo esté deshabilitada mientras se muestra el cuadro de diálogo y vuelva a habilitar la ventana primaria después de cerrar el cuadro de diálogo. Si no lo hace, puede recibir el error: Microsoft Visual Studio no se puede apagar porque hay un cuadro de diálogo modal activo. Cierre el cuadro de diálogo activo e inténtelo de nuevo.

Hay dos maneras de hacerlo. La manera recomendada, si tiene un cuadro de diálogo de WPF, es derivarlo de DialogWindowy, a continuación, llamar ShowModal a para mostrar el cuadro de diálogo. Si lo hace, no es necesario administrar el estado modal de la ventana primaria.

Si el cuadro de diálogo no es WPF, o por algún otro motivo no puede derivar la clase de cuadro de diálogo de DialogWindow, debe obtener el elemento primario del cuadro de diálogo llamando GetDialogOwnerHwnd a y administra el estado modal usted mismo, llamando al EnableModeless método con un parámetro de 0 (false) antes de mostrar el cuadro de diálogo y llamar al método de nuevo con un parámetro de 1 (true) después de cerrar el cuadro de diálogo.

Crear un cuadro de diálogo derivado de DialogWindow

  1. Cree un proyecto VSIX denominado OpenDialogTest y agregue un comando de menú denominado OpenDialog. Para obtener más información sobre cómo hacerlo, vea Crear una extensión con un comando de menú.

  2. Para usar la DialogWindow clase , debe agregar referencias a los ensamblados siguientes (en la pestaña Marco del cuadro de diálogo Agregar referencia ):

    • PresentationCore

    • PresentationFramework

    • WindowsBase

    • System.Xaml

  3. En OpenDialog.cs, agregue la siguiente using instrucción:

    using Microsoft.VisualStudio.PlatformUI;
    
  4. Declare una clase denominada TestDialogWindow que deriva de DialogWindow:

    class TestDialogWindow : DialogWindow
    {. . .}
    
  5. Para poder minimizar y maximizar el cuadro de diálogo, establezca HasMaximizeButton y HasMinimizeButton en true:

    internal TestDialogWindow()
    {
        this.HasMaximizeButton = true;
        this.HasMinimizeButton = true;
    }
    
  6. En el OpenDialog.ShowMessageBox método , reemplace el código existente por lo siguiente:

    TestDialogWindow testDialog = new TestDialogWindow();
    testDialog.ShowModal();
    
  7. Compile y ejecute la aplicación. Debería aparecer la instancia experimental de Visual Studio. En el menú Herramientas de la instancia experimental debería ver un comando denominado Invoke OpenDialog. Al hacer clic en este comando, debería ver la ventana del cuadro de diálogo. Debería poder minimizar y maximizar la ventana.

Crear y administrar un cuadro de diálogo no derivado de DialogWindow

  1. Para este procedimiento, puede usar la solución OpenDialogTest que creó en el procedimiento anterior, con las mismas referencias de ensamblado.

  2. Agregue las siguientes using declaraciones:

    using System.Windows;
    using Microsoft.Internal.VisualStudio.PlatformUI;
    
  3. Cree una clase denominada TestDialogWindow2 que derive de Window:

    class TestDialogWindow2 : Window
    {. . .}
    
  4. Agregue una referencia privada a IVsUIShell:

    private IVsUIShell shell;
    
  5. Agregue un constructor que establezca la referencia a IVsUIShell:

    public TestDialogWindow2(IVsUIShell uiShell)
    {
        shell = uiShell;
    }
    
  6. En el OpenDialog.ShowMessageBox método , reemplace el código existente por lo siguiente:

    IVsUIShell uiShell = (IVsUIShell)ServiceProvider.GetService(typeof(SVsUIShell));
    
    TestDialogWindow2 testDialog2 = new TestDialogWindow2(uiShell);
    //get the owner of this dialog
    IntPtr hwnd;
    uiShell.GetDialogOwnerHwnd(out hwnd);
    testDialog2.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;
    uiShell.EnableModeless(0);
    try
    {
        WindowHelper.ShowModal(testDialog2, hwnd);
    }
    finally
    {
        // This will take place after the window is closed.
        uiShell.EnableModeless(1);
    }
    
  7. Compile y ejecute la aplicación. En el menú Herramientas debería ver un comando denominado Invocar OpenDialog. Al hacer clic en este comando, debería ver la ventana del cuadro de diálogo.