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
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).
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
W pliku OpenDialog.cs dodaj następującą
using
instrukcję:using Microsoft.VisualStudio.PlatformUI;
Zadeklaruj klasę o nazwie
TestDialogWindow
, która pochodzi z klasy DialogWindow:class TestDialogWindow : DialogWindow {. . .}
Aby móc zminimalizować i zmaksymalizować okno dialogowe, ustaw HasMaximizeButton wartość i HasMinimizeButton na true:
internal TestDialogWindow() { this.HasMaximizeButton = true; this.HasMinimizeButton = true; }
W metodzie
OpenDialog.ShowMessageBox
zastąp istniejący kod następującym kodem:TestDialogWindow testDialog = new TestDialogWindow(); testDialog.ShowModal();
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
W tej procedurze można użyć rozwiązania OpenDialogTest utworzonego w poprzedniej procedurze z tymi samymi odwołaniami do zestawu.
Dodaj następujące
using
deklaracje:using System.Windows; using Microsoft.Internal.VisualStudio.PlatformUI;
Utwórz klasę o nazwie
TestDialogWindow2
, która pochodzi z klasy Window:class TestDialogWindow2 : Window {. . .}
Dodaj odwołanie prywatne do :IVsUIShell
private IVsUIShell shell;
Dodaj konstruktor, który ustawia odwołanie na :IVsUIShell
public TestDialogWindow2(IVsUIShell uiShell) { shell = uiShell; }
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); }
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.