Erstellen und Verwalten modaler Dialogfelder
Wenn Sie ein modales Dialogfeld in Visual Studio erstellen, müssen Sie sicherstellen, dass das übergeordnete Fenster des Dialogfelds deaktiviert ist, während das Dialogfeld angezeigt wird, und aktivieren Sie dann das übergeordnete Fenster erneut, nachdem das Dialogfeld geschlossen wurde. Wenn Sie dies nicht tun, wird möglicherweise die Fehlermeldung angezeigt: Microsoft Visual Studio kann nicht heruntergefahren werden, da ein modales Dialogfeld aktiv ist. Schließen Sie das aktive Dialogfeld, und versuchen Sie es erneut.
Hierfür gibt es zwei Möglichkeiten. Die empfohlene Methode, wenn Sie über ein WPF-Dialogfeld verfügen, besteht darin, es abzuleiten DialogWindowund dann aufzurufen ShowModal , um das Dialogfeld anzuzeigen. In diesem Fall müssen Sie den modalen Zustand des übergeordneten Fensters nicht verwalten.
Wenn Das Dialogfeld nicht WPF ist oder sie aus einem anderen Grund die Dialogfeldklasse DialogWindownicht ableiten können, müssen Sie das übergeordnete Element des Dialogfelds abrufen, indem Sie den modalen Zustand selbst aufrufen GetDialogOwnerHwnd und verwalten, indem Sie die EnableModeless Methode mit einem Parameter von 0 (false) aufrufen, bevor Sie das Dialogfeld anzeigen und die Methode erneut mit einem Parameter von 1 (true) aufrufen, nachdem das Dialogfeld geschlossen wurde.
Erstellen eines dialogfelds, das von DialogWindow abgeleitet ist
Erstellen Sie ein VSIX-Projekt namens OpenDialogTest , und fügen Sie einen Menübefehl namens OpenDialog hinzu. Weitere Informationen dazu finden Sie unter Erstellen einer Erweiterung mit einem Menübefehl.
Um die DialogWindow Klasse zu verwenden, müssen Sie Verweise auf die folgenden Assemblys hinzufügen (auf der Registerkarte "Framework" des Dialogfelds "Verweis hinzufügen"):
PresentationCore
PresentationFramework
Windowsbase
System.Xaml
Fügen Sie in OpenDialog.cs die folgende
using
Anweisung hinzu:using Microsoft.VisualStudio.PlatformUI;
Deklarieren Sie eine Klasse mit dem Namen
TestDialogWindow
, die von DialogWindow:class TestDialogWindow : DialogWindow {. . .}
Um das Dialogfeld zu minimieren und zu maximieren, legen Sie folgendes HasMaximizeButton fest und HasMinimizeButton auf "true":
internal TestDialogWindow() { this.HasMaximizeButton = true; this.HasMinimizeButton = true; }
Ersetzen Sie in der
OpenDialog.ShowMessageBox
Methode den vorhandenen Code durch Folgendes:TestDialogWindow testDialog = new TestDialogWindow(); testDialog.ShowModal();
Erstellen Sie die Anwendung, und führen Sie sie aus. Die experimentelle Instanz von Visual Studio sollte angezeigt werden. Im Menü "Extras" der experimentellen Instanz sollte ein Befehl mit dem Namen Invoke OpenDialog angezeigt werden. Wenn Sie auf diesen Befehl klicken, sollte das Dialogfeld angezeigt werden. Sie sollten das Fenster minimieren und maximieren können.
Erstellen und Verwalten eines Dialogfelds, das nicht von DialogWindow abgeleitet ist
Für dieses Verfahren können Sie die In der vorherigen Prozedur erstellte OpenDialogTest-Lösung mit denselben Assemblyverweisen verwenden.
Fügen Sie die folgenden
using
Deklarationen hinzu:using System.Windows; using Microsoft.Internal.VisualStudio.PlatformUI;
Erstellen Sie eine Klasse mit dem Namen
TestDialogWindow2
, die von Window:class TestDialogWindow2 : Window {. . .}
Hinzufügen eines privaten Verweises zu IVsUIShell:
private IVsUIShell shell;
Fügen Sie einen Konstruktor hinzu, der den Verweis IVsUIShellauf :
public TestDialogWindow2(IVsUIShell uiShell) { shell = uiShell; }
Ersetzen Sie in der
OpenDialog.ShowMessageBox
Methode den vorhandenen Code durch Folgendes: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); }
Erstellen Sie die Anwendung, und führen Sie sie aus. Im Menü "Extras" sollte ein Befehl mit dem Namen "Invoke OpenDialog" angezeigt werden. Wenn Sie auf diesen Befehl klicken, sollte das Dialogfeld angezeigt werden.