Udostępnij za pośrednictwem


Tworzenie modalnych okien dialogowych i zarządzanie nimi

Po utworzeniu modalnego okna dialogowego w programie Visual Studio należy upewnić się, że okno nadrzędne okna dialogowego jest wyłączone, gdy zostanie wyświetlone okno dialogowe, a następnie ponownie włącz okno nadrzędne po zamknięciu okna dialogowego. Jeśli tego nie zrobisz, może zostać wyświetlony błąd: Program Microsoft Visual Studio nie może zostać zamknięty, ponieważ modalne okno dialogowe jest aktywne. Zamknij aktywne okno dialogowe i spróbuj ponownie.

Istnieją dwa sposoby na to. Zalecanym sposobem, jeśli masz okno dialogowe WPF, jest wyprowadzenie go z DialogWindowelementu , a następnie wywołanie ShowModal w celu wyświetlenia okna dialogowego. Jeśli to zrobisz, nie musisz zarządzać modalnym stanem okna nadrzędnego.

Jeśli okno dialogowe nie jest WPF lub z jakiegoś innego powodu nie można uzyskać klasy okna dialogowego z DialogWindow, musisz uzyskać element nadrzędny okna dialogowego, wywołując GetDialogOwnerHwnd sam stan modalny i zarządzając nim, wywołując EnableModeless metodę z parametrem 0 (false) przed wyświetleniem okna dialogowego i wywołaniem metody ponownie za pomocą parametru 1 (true) po zamknięciu okna dialogowego.

Tworzenie okna dialogowego pochodzącego z okna dialogowegoWindow

  1. Utwórz projekt VSIX o nazwie OpenDialogTest i dodaj polecenie menu o nazwie OpenDialog. Aby uzyskać więcej informacji o tym, jak to zrobić, zobacz Create an extension with a menu command (Tworzenie rozszerzenia za pomocą polecenia menu).

  2. Aby użyć DialogWindow klasy, należy dodać odwołania do następujących zestawów (na karcie Struktura okna dialogowego Dodawanie odwołania ):

    • Rdzeń prezentacji

    • Element PresentationFramework

    • Windowsbase

    • System.xaml

  3. W pliku OpenDialog.cs dodaj następującą using instrukcję:

    using Microsoft.VisualStudio.PlatformUI;
    
  4. Zadeklaruj klasę o nazwie TestDialogWindow , która pochodzi z klasy DialogWindow:

    class TestDialogWindow : DialogWindow
    {. . .}
    
  5. Aby móc zminimalizować i zmaksymalizować okno dialogowe, ustaw HasMaximizeButton wartość i HasMinimizeButton na true:

    internal TestDialogWindow()
    {
        this.HasMaximizeButton = true;
        this.HasMinimizeButton = true;
    }
    
  6. W metodzie OpenDialog.ShowMessageBox zastąp istniejący kod następującym kodem:

    TestDialogWindow testDialog = new TestDialogWindow();
    testDialog.ShowModal();
    
  7. Skompiluj i uruchom aplikację. Powinno zostać wyświetlone eksperymentalne wystąpienie programu Visual Studio. W menu Narzędzia wystąpienia eksperymentalnego powinien zostać wyświetlone polecenie o nazwie Invoke OpenDialog. Po kliknięciu tego polecenia powinno zostać wyświetlone okno dialogowe. Powinno być możliwe zminimalizowanie i zmaksymalizowanie okna.

Tworzenie okna dialogowego i zarządzanie nim nie pochodzi z okna dialogowegoWindow

  1. W tej procedurze można użyć rozwiązania OpenDialogTest utworzonego w poprzedniej procedurze z tymi samymi odwołaniami do zestawu.

  2. Dodaj następujące using deklaracje:

    using System.Windows;
    using Microsoft.Internal.VisualStudio.PlatformUI;
    
  3. Utwórz klasę o nazwie TestDialogWindow2 , która pochodzi z klasy Window:

    class TestDialogWindow2 : Window
    {. . .}
    
  4. Dodaj odwołanie prywatne do :IVsUIShell

    private IVsUIShell shell;
    
  5. Dodaj konstruktor, który ustawia odwołanie na :IVsUIShell

    public TestDialogWindow2(IVsUIShell uiShell)
    {
        shell = uiShell;
    }
    
  6. W metodzie OpenDialog.ShowMessageBox zastąp istniejący kod następującym kodem:

    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. Skompiluj i uruchom aplikację. W menu Narzędzia powinno zostać wyświetlone polecenie o nazwie Invoke OpenDialog. Po kliknięciu tego polecenia powinno zostać wyświetlone okno dialogowe.