Создание модальных диалоговых окон и управление ими
При создании модального диалогового окна в Visual Studio необходимо убедиться, что родительское окно диалогового окна отключено во время отображения диалогового окна, а затем повторно включите родительское окно после закрытия диалогового окна. Если этого не сделать, может появиться сообщение об ошибке: Microsoft Visual Studio не может завершить работу, так как модальное диалоговое окно активно. Закройте активное диалоговое окно и повторите попытку.
Это можно сделать двумя способами. Рекомендуемый способ, если у вас есть диалоговое окно WPF, является производный от DialogWindowнего, а затем вызов ShowModal для отображения диалогового окна. Если это сделать, вам не нужно управлять модальным состоянием родительского окна.
Если диалоговое окно не является WPF или по какой-либо другой причине вы не можете наследить класс DialogWindowдиалогового окна, необходимо получить родительский элемент диалогового GetDialogOwnerHwnd окна путем вызова модального состояния самостоятельно, EnableModeless вызвав метод с параметром 0 (false), прежде чем отображать диалоговое окно и снова вызывать метод с параметром 1 (true) после закрытия диалогового окна.
Создание диалогового окна, производного от DialogWindow
Создайте проект VSIX с именем OpenDialogTest и добавьте команду меню с именем OpenDialog. Дополнительные сведения о том, как это сделать, см. в разделе "Создание расширения" с помощью команды меню.
Чтобы использовать DialogWindow класс, необходимо добавить ссылки на следующие сборки (на вкладке Framework диалогового окна "Добавить ссылку ").
PresentationCore
PresentationFramework
WindowsBase
System.Xaml
В OpenDialog.cs добавьте следующую
using
инструкцию:using Microsoft.VisualStudio.PlatformUI;
Объявите класс с именем
TestDialogWindow
, производным от DialogWindow:class TestDialogWindow : DialogWindow {. . .}
Чтобы свести к минимуму и развернуть диалоговое окно, задайте HasMaximizeButton и HasMinimizeButton установите значение true:
internal TestDialogWindow() { this.HasMaximizeButton = true; this.HasMinimizeButton = true; }
В методе
OpenDialog.ShowMessageBox
замените существующий код следующим кодом:TestDialogWindow testDialog = new TestDialogWindow(); testDialog.ShowModal();
Выполните сборку приложения и запустите его. Должен появиться экспериментальный экземпляр Visual Studio. В меню "Сервис" экспериментального экземпляра должна появиться команда Invoke OpenDialog. Щелкнув эту команду, вы увидите диалоговое окно. Вы можете свести к минимуму и развернуть окно.
Создание диалогового окна и управление ими, не производных от DialogWindow
Для этой процедуры можно использовать решение OpenDialogTest , созданное в предыдущей процедуре, с теми же ссылками на сборки.
Добавьте следующие
using
объявления:using System.Windows; using Microsoft.Internal.VisualStudio.PlatformUI;
Создайте класс с именем
TestDialogWindow2
, производным от Window:class TestDialogWindow2 : Window {. . .}
Добавление частной ссылки в IVsUIShell:
private IVsUIShell shell;
Добавьте конструктор, который задает ссылку на IVsUIShell:
public TestDialogWindow2(IVsUIShell uiShell) { shell = uiShell; }
В методе
OpenDialog.ShowMessageBox
замените существующий код следующим кодом: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); }
Выполните сборку приложения и запустите его. В меню "Сервис" должна появиться команда Invoke OpenDialog. Щелкнув эту команду, вы увидите диалоговое окно.