Welcome

首页 / 软件开发 / .NET编程技术 / Visual Studio 2008可扩展性开发(八):关于用户界面的种种(上)

Visual Studio 2008可扩展性开发(八):关于用户界面的种种(上)2011-04-05 博客园 Anders Cui前言

Add-In大多需要一定的用户界面,前面的随笔中采用的主要方式是菜单和自定义窗体 。对于菜单,可以是VS的主菜单,也可以是在某个特定的上下文菜单,比如编辑器;对于 自定义窗体,用起来也很简单,就像在Windows应用程序中添加一个窗体一样。本文将介 绍关于用户界面的其它内容,包括:

1) 访问VS中的各个窗口,如Output窗口、Command窗口等;

2)创建自定义的工具窗口

关于VS中的窗口

我们在VS中会遇到各种窗口,如Solution Explorer、Toolbox、Output Window或者是 打开的文本编辑器,虽然它们看起来各不相同,但是在AOM模型中它们仍然有共通之处。

1)访问VS中的窗口

首先想到的一个问题,如何获取上述窗口的引用?DTE2接口有一个Windows集合属性, 通过它可以访问某个特定的窗口。

该接口实现了IEnumerable,所以我们可以使用foreach语句对它进行遍历:

C# Code - 遍历VS的窗口集合

foreach (Window win in _applicationObject.Windows)
{
_applicationObject.ToolWindows.OutputWindow.ActivePane.OutputString (win.Caption + Environment.NewLine);
}

另外,通过Windows集合的Item方法,我们可以使用数字索引或窗口的标题获取某个特 定的窗口,比如:

C# Code - 使用数字索引获取Window引用

Window win = _applicationObject.Windows.Item(1);
win.SetFocus();

这种方式的问题在于,窗口的数字索引是不确定的,而窗口的标题也是如此。对于 Solution Explorer,当我们打开一个解决方案时,它的标题是“Solution ‘NEnhancer ’ (6 projects)”这样的格式。

幸运的是,对于VS内的工具窗口(Solution Explorer、Toolbox、Output Window等等 ),它们都有一个唯一的索引,这些索引是GUID,这样就很容易获取想要的窗口了:

C# Code - 使用GUID访问Window

Window slnWin = _applicationObject.Windows.Item (EnvDTE.Constants.vsWindowKindSolutionExplorer);
slnWin.SetFocus();

GUID显然难以记住,所以这里要使用EnvDTE.Constants中定义的常量,这样不仅方便 获取窗口,性能也要比使用数字或标题索引好一些(你可以试一下获取Server Explorer )。

现在有办法获取窗口的引用了,不过Window接口毕竟是针对所有窗口的通用接口,如 果要针对某个窗口完成一些特定的任务,就需要考虑别的方法了。

2)Window接口的Object属性

使用Object属性可以获取特定于某个窗口的对象,看下面的例子:

C# Code - 获取工具窗口所承载的对象

Window taskListWin = _applicationObject.Windows.Item (EnvDTE.Constants.vsWindowKindTaskList);
TaskList taskList = taskListWin.Object as TaskList;
MessageBox.Show(string.Format("You have {0} tasks.", taskList.TaskItems.Count));

关于这个Object属性,也许在看了后面的自定义工具窗口就很容易明白了。这里通过 TaskList接口访问Task List窗口。其它的窗口如Command Window、Error List等与此类 似。对于这些最重要的工具窗口,AOM提供了更为方便的API。