上一次我们实现了一个带有命令(Command)的package,这一次让我们更进一步:创建一个被称为工具窗(Tool Window)的界面。那么,什么是工具窗呢?让我们想象一下:解决方案浏览器(Solution Explorer)、工具箱(Toolbox)、错误列表(Error List),它们都是工具窗(Tool Window)。
像前几篇一样,我们依然选择选择Visual Studio Integration Package类型作为项目类型,这一次我们把它命名为SimpleToolWindow。当项目向导出现后,我们选择C#做为开发语言,并利用向导为我们的程序集自动生成一个key文件。在VSPackage Information页面,我们输入如下内容:
在下一步,我们选中Tool Window复选框,以便为我们的package创建一个工具窗。
紧接着,向导会要求我们填入工具窗口的名字(标题)和对应命令的ID,请按照下图填入:
虽然我们没有选择菜单命令(Menu Command),但向导会帮我们在“视图|其他窗口”子菜单下帮我们创建一个菜单项。该菜单项会和我们的工具窗关联起来。
在向导的最后一步我们可以建立集成测试项目和单元测试项目,请勾掉这两个选项并且点击Finish按钮。向导会在几秒钟内帮我们创建项目的源文件。
生成并运行SimpleToolWindow项目。当Visual Studio实验室启动后,你可以在“视图|其他窗口”菜单下看到一个新的菜单项:
单击这个菜单项,就会打开我们的工具窗。通过拖动它的标题栏,可以移动它到任何位置或者固定它,就像其他的工具窗一样:
同时,向导帮这个工具窗生成了代码逻辑:当点击这个窗口的按钮时,它会弹出一个消息框。
源文件分析(What is inside?)
向导帮我们生成了PkgCmdID.cs文件,这个文件的功能和上一篇SimpleCommand中的一样。在这里这个文件定义了“视图|其他窗口”菜单下的命令MyToolWindow的标识符。
向导也生成了用于定义菜单资源的SimpleToolWindow.vsct文件,这和上一篇的SimpleCommand一样。
和上一篇的SimpleCommand相比,真正不一样的地方是这里多了两个新文件。MyControl.cs文件定义了工具窗用到的用户控件MyControl类,MyToolWindow.cs文件定义了应用MyControl实例的工具窗类。当我们改变工具窗的大小时,会自动改变嵌入的MyControl的大小。
现在让我们看一下MyControl控件的实例是怎样嵌入在工具窗中的,下面是MyToolWindow.cs文件中的代码:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Microsoft.VisualStudio.Shell;
namespace MyCompany.SimpleToolWindow
6: {
)]
class MyToolWindow : ToolWindowPane
9: {
private MyControl control;
11:
null)
13: {
this.Caption = Resources.ToolWindowTitle;
this.BitmapResourceID = 301;
this.BitmapIndex = 1;
new MyControl();
18: }
19:
public IWin32Window Window
21: {
return (IWin32Window)control; }
23: }
24: }
25: }