创建和管理模式对话框

在 Visual Studio 中创建模式对话框时,必须确保对话框的父窗口在显示对话框时处于禁用状态,然后在对话框关闭后重新启用父窗口。 如果不这样做,可能会收到错误: 由于模式对话框处于活动状态,Microsoft Visual Studio 无法关闭。关闭活动对话框,然后重试。

有两种方法可以执行此操作。 如果有 WPF 对话框,建议从中派生它 DialogWindow,然后调用 ShowModal 以显示对话框。 如果执行此操作,则无需管理父窗口的模式状态。

如果对话框不是 WPF,或者出于某种其他原因,无法从 DialogWindow中派生对话框类,则必须通过自己调用 GetDialogOwnerHwnd 和管理模式状态来获取对话框的父级,方法是在显示对话框之前使用参数 0(false)调用 EnableModeless 该方法,并在关闭对话框后再次使用参数 1(true)调用该方法。

创建派生自 DialogWindow 的对话框

  1. 创建名为 OpenDialogTestVSIX 项目,并添加名为 OpenDialog菜单命令。 有关如何执行此操作的详细信息,请参阅 使用菜单命令创建扩展。

  2. 若要使用该DialogWindow类,必须添加对以下程序集的引用(在“添加引用”对话框的“框架”选项卡中):

    • PresentationCore

    • PresentationFramework

    • WindowsBase

    • System.Xaml

  3. OpenDialog.cs 中,添加以下 using 语句:

    using Microsoft.VisualStudio.PlatformUI;
    
  4. 声明派 TestDialogWindow 生自 DialogWindow

    class TestDialogWindow : DialogWindow
    {. . .}
    
  5. 若要最小化和最大化对话框,请设置 HasMaximizeButtonHasMinimizeButton 设置为 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 的命令。 单击此命令时,应会看到对话框窗口。