创建和管理模式对话框
在 Visual Studio 中创建模式对话框时,必须确保对话框的父窗口在显示对话框时处于禁用状态,然后在对话框关闭后重新启用父窗口。 如果不这样做,可能会收到错误: 由于模式对话框处于活动状态,Microsoft Visual Studio 无法关闭。关闭活动对话框,然后重试。
有两种方法可以执行此操作。 如果有 WPF 对话框,建议从中派生它 DialogWindow,然后调用 ShowModal 以显示对话框。 如果执行此操作,则无需管理父窗口的模式状态。
如果对话框不是 WPF,或者出于某种其他原因,无法从 DialogWindow中派生对话框类,则必须通过自己调用 GetDialogOwnerHwnd 和管理模式状态来获取对话框的父级,方法是在显示对话框之前使用参数 0(false)调用 EnableModeless 该方法,并在关闭对话框后再次使用参数 1(true)调用该方法。
创建派生自 DialogWindow 的对话框
创建名为 OpenDialogTest 的 VSIX 项目,并添加名为 OpenDialog 的菜单命令。 有关如何执行此操作的详细信息,请参阅 使用菜单命令创建扩展。
若要使用该DialogWindow类,必须添加对以下程序集的引用(在“添加引用”对话框的“框架”选项卡中):
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 的命令。 单击此命令时,应会看到对话框窗口。