Поделиться через


Создание модальных диалоговых окон и управление ими

При создании модального диалогового окна в Visual Studio необходимо убедиться, что родительское окно диалогового окна отключено во время отображения диалогового окна, а затем повторно включите родительское окно после закрытия диалогового окна. Если этого не сделать, может появиться сообщение об ошибке: Microsoft Visual Studio не может завершить работу, так как модальное диалоговое окно активно. Закройте активное диалоговое окно и повторите попытку.

Это можно сделать двумя способами. Рекомендуемый способ, если у вас есть диалоговое окно WPF, является производный от DialogWindowнего, а затем вызов ShowModal для отображения диалогового окна. Если это сделать, вам не нужно управлять модальным состоянием родительского окна.

Если диалоговое окно не является WPF или по какой-либо другой причине вы не можете наследить класс DialogWindowдиалогового окна, необходимо получить родительский элемент диалогового GetDialogOwnerHwnd окна путем вызова модального состояния самостоятельно, EnableModeless вызвав метод с параметром 0 (false), прежде чем отображать диалоговое окно и снова вызывать метод с параметром 1 (true) после закрытия диалогового окна.

Создание диалогового окна, производного от DialogWindow

  1. Создайте проект VSIX с именем OpenDialogTest и добавьте команду меню с именем OpenDialog. Дополнительные сведения о том, как это сделать, см. в разделе "Создание расширения" с помощью команды меню.

  2. Чтобы использовать DialogWindow класс, необходимо добавить ссылки на следующие сборки (на вкладке Framework диалогового окна "Добавить ссылку ").

    • PresentationCore

    • PresentationFramework

    • WindowsBase

    • System.Xaml

  3. В OpenDialog.cs добавьте следующую using инструкцию:

    using Microsoft.VisualStudio.PlatformUI;
    
  4. Объявите класс с именем TestDialogWindow , производным от DialogWindow:

    class TestDialogWindow : DialogWindow
    {. . .}
    
  5. Чтобы свести к минимуму и развернуть диалоговое окно, задайте HasMaximizeButton и HasMinimizeButton установите значение true:

    internal TestDialogWindow()
    {
        this.HasMaximizeButton = true;
        this.HasMinimizeButton = true;
    }
    
  6. В методе OpenDialog.ShowMessageBox замените существующий код следующим кодом:

    TestDialogWindow testDialog = new TestDialogWindow();
    testDialog.ShowModal();
    
  7. Выполните сборку приложения и запустите его. Должен появиться экспериментальный экземпляр Visual Studio. В меню "Сервис" экспериментального экземпляра должна появиться команда Invoke OpenDialog. Щелкнув эту команду, вы увидите диалоговое окно. Вы можете свести к минимуму и развернуть окно.

Создание диалогового окна и управление ими, не производных от DialogWindow

  1. Для этой процедуры можно использовать решение OpenDialogTest , созданное в предыдущей процедуре, с теми же ссылками на сборки.

  2. Добавьте следующие using объявления:

    using System.Windows;
    using Microsoft.Internal.VisualStudio.PlatformUI;
    
  3. Создайте класс с именем TestDialogWindow2 , производным от Window:

    class TestDialogWindow2 : Window
    {. . .}
    
  4. Добавление частной ссылки в IVsUIShell:

    private IVsUIShell shell;
    
  5. Добавьте конструктор, который задает ссылку на IVsUIShell:

    public TestDialogWindow2(IVsUIShell uiShell)
    {
        shell = uiShell;
    }
    
  6. В методе 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);
    }
    
  7. Выполните сборку приложения и запустите его. В меню "Сервис" должна появиться команда Invoke OpenDialog. Щелкнув эту команду, вы увидите диалоговое окно.