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
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.
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
Em OpenDialog.cs, adicione a seguinte
using
instrução:using Microsoft.VisualStudio.PlatformUI;
Declare uma classe chamada
TestDialogWindow
que deriva de DialogWindow:class TestDialogWindow : DialogWindow {. . .}
Para poder minimizar e maximizar a caixa de diálogo, defina HasMaximizeButton e HasMinimizeButton para true:
internal TestDialogWindow() { this.HasMaximizeButton = true; this.HasMinimizeButton = true; }
No método, substitua
OpenDialog.ShowMessageBox
o código existente pelo seguinte:TestDialogWindow testDialog = new TestDialogWindow(); testDialog.ShowModal();
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
Para este procedimento, você pode usar a solução OpenDialogTest criada no procedimento anterior, com as mesmas referências de assembly.
Adicione as seguintes
using
declarações:using System.Windows; using Microsoft.Internal.VisualStudio.PlatformUI;
Crie uma classe chamada
TestDialogWindow2
que deriva de Window:class TestDialogWindow2 : Window {. . .}
Adicione uma referência privada a IVsUIShell:
private IVsUIShell shell;
Adicione um construtor que defina a referência para IVsUIShell:
public TestDialogWindow2(IVsUIShell uiShell) { shell = uiShell; }
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); }
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.