Compartilhar via


Criar e gerenciar caixas de diálogo modais

Quando você cria uma caixa de diálogo modal dentro do Visual Studio, você deve certificar-se de que a janela pai da caixa de diálogo está desabilitada enquanto a caixa de diálogo é exibida e, em seguida, reabilite a janela pai depois que a caixa de diálogo é fechada. Se você não fizer isso, você pode receber o erro: Microsoft Visual Studio não é possível desligar porque uma caixa de diálogo modal está ativa. Feche a caixa de diálogo ativa e tente novamente.

Há duas maneiras de fazer isso. A maneira recomendada, se você tiver uma caixa de diálogo WPF, é derivá-la de e chamar ShowModal para exibir a caixa de DialogWindowdiálogo. Se você fizer isso, não precisará gerenciar o estado modal da janela pai.

Se sua caixa de diálogo não for WPF, ou por algum outro motivo você não pode derivar sua classe de caixa de diálogo de , então você deve obter o pai da caixa de diálogo chamando e gerenciar o estado modal você mesmo, chamando o método com um parâmetro de 0 (false) antes de exibir a caixa de diálogo e chamando GetDialogOwnerHwnd o EnableModeless método novamente com um parâmetro de 1 (true) depois de fechar a caixa de DialogWindowdiálogo.

Criar uma caixa de diálogo derivada de DialogWindow

  1. Crie um projeto VSIX chamado OpenDialogTest e adicione um comando de menu chamado OpenDialog. Para obter mais informações sobre como fazer isso, consulte Criar uma extensão com um comando de menu.

  2. Para usar a DialogWindow classe, você deve adicionar referências aos seguintes assemblies (na guia Framework da caixa de diálogo Adicionar Referência ):

    • ApresentaçãoCore

    • ApresentaçãoFramework

    • Base do Windows

    • System.Xaml

  3. Em OpenDialog.cs, adicione a seguinte using instrução:

    using Microsoft.VisualStudio.PlatformUI;
    
  4. Declare uma classe chamada TestDialogWindow que deriva de DialogWindow:

    class TestDialogWindow : DialogWindow
    {. . .}
    
  5. Para poder minimizar e maximizar a caixa de diálogo, defina HasMaximizeButton e HasMinimizeButton para true:

    internal TestDialogWindow()
    {
        this.HasMaximizeButton = true;
        this.HasMinimizeButton = true;
    }
    
  6. No método, substitua OpenDialog.ShowMessageBox o código existente pelo seguinte:

    TestDialogWindow testDialog = new TestDialogWindow();
    testDialog.ShowModal();
    
  7. Compile e execute o aplicativo. A instância experimental do Visual Studio deve aparecer. No menu Ferramentas da instância experimental, você verá um comando chamado Invoke OpenDialog. Quando você clica nesse comando, você deve ver a janela de diálogo. Você deve ser capaz de minimizar e maximizar a janela.

Criar e gerenciar uma caixa de diálogo não derivada de DialogWindow

  1. Para este procedimento, você pode usar a solução OpenDialogTest criada no procedimento anterior, com as mesmas referências de assembly.

  2. Adicione as seguintes using declarações:

    using System.Windows;
    using Microsoft.Internal.VisualStudio.PlatformUI;
    
  3. Crie uma classe chamada TestDialogWindow2 que deriva de Window:

    class TestDialogWindow2 : Window
    {. . .}
    
  4. Adicione uma referência privada a IVsUIShell:

    private IVsUIShell shell;
    
  5. Adicione um construtor que defina a referência para IVsUIShell:

    public TestDialogWindow2(IVsUIShell uiShell)
    {
        shell = uiShell;
    }
    
  6. No método, substitua OpenDialog.ShowMessageBox o código existente pelo seguinte:

    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 e execute o aplicativo. No menu Ferramentas você deve ver um comando chamado Invoke OpenDialog. Quando você clica nesse comando, você deve ver a janela de diálogo.