创建多实例工具窗口

可以编程工具窗口,以便可以同时打开它的多个实例。 默认情况下,工具窗口只能打开一个实例。

使用多实例工具窗口时,可以同时显示多个相关的信息源。 例如,可以在多实例工具窗口中放置多行 TextBox 控件,以便在编程会话期间同时提供多个代码片段。 此外,还可以在多实例工具窗口中放置控件 DataGrid 和下拉列表框,以便可以同时跟踪多个实时数据源。

创建基本(单实例)工具窗口

  1. 使用 VSIX 模板创建名为 MultiInstanceToolWindow 的项目,并添加名为 MIToolWindow 的自定义工具窗口项模板。

    注意

    有关使用工具窗口创建扩展的详细信息,请参阅 使用工具窗口创建扩展。

创建工具窗口多实例

  1. 打开 MIToolWindowPackage.cs 文件并查找ProvideToolWindow属性。 MultiInstances=true和参数,如以下示例所示:

    [PackageRegistration(UseManagedResourcesOnly = true)]
        [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] // Info on this package for Help/About
        [ProvideMenuResource("Menus.ctmenu", 1)]
        [ProvideToolWindow(typeof(MultiInstanceToolWindow.MIToolWindow), MultiInstances = true)]
        [Guid(MIToolWindowPackage.PackageGuidString)]
        public sealed class MIToolWindowPackage : Package
    {. . .}
    
  2. MIToolWindowCommand.cs 文件中,找到 ShowToolWindos() 该方法。 在此方法中 FindToolWindow ,调用该方法并设置其 create 标志 false ,以便它将循环访问现有工具窗口实例,直到找到可用 id 实例。

  3. 若要创建工具窗口实例,请调用 FindToolWindow 该方法并将其 id 设置为可用值及其 create 标志 true

    默认情况下,方法0的参数FindToolWindow值为 id 。 此值将创建一个单实例工具窗口。 要托管多个实例,每个实例必须有自己的唯 id一性。

  4. ShowIVsWindowFrame工具窗口实例的属性返回Frame的对象调用该方法。

  5. 默认情况下, ShowToolWindow 工具窗口项模板创建的方法将创建单实例工具窗口。 以下示例演示如何修改 ShowToolWindow 方法以创建多个实例。

    private void ShowToolWindow(object sender, EventArgs e)
    {
        for (int i = 0; i < 10; i++)
        {
            ToolWindowPane window = this.package.FindToolWindow(typeof(MIToolWindow), i, false);
            if (window == null)
            {
                // Create the window with the first free ID.
                window = (ToolWindowPane)this.package.FindToolWindow(typeof(MIToolWindow), i, true);
                if ((null == window) || (null == window.Frame))
                {
                    throw new NotSupportedException("Cannot create tool window");
                }
    
            IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;
            Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(windowFrame.Show());
            break;
            }
        }
    }