Condividi tramite


Creare e gestire finestre di dialogo modali

Quando si crea una finestra di dialogo modale all'interno di Visual Studio, è necessario assicurarsi che la finestra padre della finestra di dialogo sia disabilitata mentre viene visualizzata la finestra di dialogo, quindi riabilitare la finestra padre dopo la chiusura della finestra di dialogo. In caso contrario, è possibile che venga visualizzato l'errore: Microsoft Visual Studio non può essere arrestato perché è attiva una finestra di dialogo modale. Chiudere la finestra di dialogo attiva e riprovare.

Esistono due modi per eseguire questa operazione. Il modo consigliato, se si dispone di una finestra di dialogo WPF, consiste nel derivarlo da DialogWindowe quindi chiamare ShowModal per visualizzare la finestra di dialogo. In questo caso, non è necessario gestire lo stato modale della finestra padre.

Se la finestra di dialogo non è WPF o per altri motivi non è possibile derivare la classe della finestra di dialogo da DialogWindow, è necessario ottenere l'elemento padre della finestra di dialogo chiamando GetDialogOwnerHwnd e gestire manualmente lo stato modale chiamando il EnableModeless metodo con un parametro 0 (false) prima di visualizzare la finestra di dialogo e chiamare di nuovo il metodo con un parametro 1 (true) dopo aver chiuso la finestra di dialogo.

Creare una finestra di dialogo derivata da DialogWindow

  1. Creare un progetto VSIX denominato OpenDialogTest e aggiungere un comando di menu denominato OpenDialog. Per altre informazioni su come eseguire questa operazione, vedere Creare un'estensione con un comando di menu.

  2. Per usare la DialogWindow classe , è necessario aggiungere riferimenti agli assembly seguenti (nella scheda Framework della finestra di dialogo Aggiungi riferimento ):

    • PresentationCore

    • PresentationFramework

    • WindowsBase

    • System.Xaml

  3. In OpenDialog.cs aggiungere l'istruzione seguente using :

    using Microsoft.VisualStudio.PlatformUI;
    
  4. Dichiarare una classe denominata TestDialogWindow che deriva da DialogWindow:

    class TestDialogWindow : DialogWindow
    {. . .}
    
  5. Per ridurre al minimo e ingrandire la finestra di dialogo, impostare e HasMinimizeButton impostare HasMaximizeButton su true:

    internal TestDialogWindow()
    {
        this.HasMaximizeButton = true;
        this.HasMinimizeButton = true;
    }
    
  6. OpenDialog.ShowMessageBox Nel metodo sostituire il codice esistente con il codice seguente:

    TestDialogWindow testDialog = new TestDialogWindow();
    testDialog.ShowModal();
    
  7. Compilare ed eseguire l'applicazione. Verrà visualizzata l'istanza sperimentale di Visual Studio. Nel menu Strumenti dell'istanza sperimentale dovrebbe essere visualizzato un comando denominato Invoke OpenDialog. Quando si fa clic su questo comando, verrà visualizzata la finestra di dialogo. Dovrebbe essere possibile ridurre al minimo e ingrandire la finestra.

Creare e gestire una finestra di dialogo non derivata da DialogWindow

  1. Per questa procedura, è possibile usare la soluzione OpenDialogTest creata nella procedura precedente, con gli stessi riferimenti all'assembly.

  2. Aggiungere le dichiarazioni seguenti using :

    using System.Windows;
    using Microsoft.Internal.VisualStudio.PlatformUI;
    
  3. Creare una classe denominata TestDialogWindow2 che deriva da Window:

    class TestDialogWindow2 : Window
    {. . .}
    
  4. Aggiungere un riferimento privato a IVsUIShell:

    private IVsUIShell shell;
    
  5. Aggiungere un costruttore che imposta il riferimento a IVsUIShell:

    public TestDialogWindow2(IVsUIShell uiShell)
    {
        shell = uiShell;
    }
    
  6. OpenDialog.ShowMessageBox Nel metodo sostituire il codice esistente con il codice seguente:

    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. Compilare ed eseguire l'applicazione. Nel menu Strumenti dovrebbe essere visualizzato un comando denominato Invoke OpenDialog. Quando si fa clic su questo comando, verrà visualizzata la finestra di dialogo.