前言
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。
3)ToolWindows屬性
通過EnvDTE的ToolWindows屬性,我們可以快速地訪問那些重要的工具窗口,比如 OutputWindow:
C# Code - 操作OutputWindow
OutputWindow outputWin = _applicationObject.ToolWindows.OutputWindow;
outputWin.OutputWindowPanes.Add("NEnhancer");
outputWin.OutputWindowPanes.Item("NEnhancer").OutputString ("Hello!");
運行這段代碼後,看起來是這樣的:
4)UIHierarchy對象
更為特殊的是,對於一些用於表現樹形結構的窗口——如Solution Explorer、Server Explorer和Macro Explorer——它們背後的對象是UIHierarchy,與之相關的還有 UIHierarchyItems和UIHierarchyItem對象,這個在前面操作Solution Explorer時已經看 到過了,不再贅述。
有了這些准備知識,操作各個工具窗口就很容易了。下一步,我們來考慮如何添加自 己的工具窗口。
創建自定義工具窗口(ToolWindow)
VS內置的工具窗口畢竟是有限的,總有時候,我們需要創建自己的工具窗口。可以采 用兩種方式,一是使用ActiveX控件,二是使用.NET用戶控件。這裡將介紹第二種方式的 用法。
我們知道VS內置的命令對應著大量的快捷鍵,不太可能一下子把它們完全記住。如果 某個快捷鍵忘記了,如果在VS中可以查閱就方便了。所以這裡考慮創建一個工具窗口來完 成這個功能。這裡最關鍵的是Windows2.CreateToolWindow2方法,它的簽名是:
C# Code - CreateToolWindow2方法簽名
Window CreateToolWindow2(AddIn Addin, string Assembly, string Class,
string Caption, string GuidPosition, ref object ControlObject);
各個參數的作用是:
Addin:用於創建工具窗口的外接程序的實例,一般為當前的Addin;
Assembly:包含該用戶控件的程序集的完整名稱或文件路徑;
Class:實現該用戶控件的類的全名;
Caption:要在新工具窗口中顯示的標題;
GuidPosition:新窗口的唯一標識符,可用於在 Windows 集合中查找窗口;
ControlObject:要在新工具窗口中承載的用戶控件。
通過參數的信息大體可以了解到,我們首先得定義一個用戶控件,該控件將被承載在 新的工具窗口中。需要注意的是在調用 CreateToolWindow2 創建一個工具窗口之前,您 應將用戶控件 (ControlObject) 移動到與外接程序的程序集中,或設置用戶控件上的所 有屬性,以使其對 COM 是完全可見的。否則控件不會正確封送,而且CreateToolWindow2 將返回一個空值。現在可以用下面的代碼來創建工具窗口了:
C# Code - 創建自定義的工具窗口
object programmingObj = null;
string guidString = "{41F8DEA8-EB07-45b7-9B1D-EB969DC43EC5}";
Windows2 windows2 = _applicationObject.Windows as Windows2;
Assembly asm = Assembly.GetExecutingAssembly();
shortcutListWindow = windows2.CreateToolWindow2(_addInInstance, asm.Location,
"NEnhancer.ShortcutListControl", "Visual Studio Shortcut List",
guidString, ref programmingObj);
這裡的ShortcutListControl是一個用戶控件,它裡面實現了查看VS快捷鍵的功能。按 我的理解,VS將該控件的一個實例加載到一個工具窗口中,這樣工具窗口就可以使用控件 所實現的功能;另一方面,VS可以不考慮新窗口中實現的是什麼功能,對所有工具窗口一 視同仁。這樣自定義的工具窗口也可以像內置的工具窗口那樣操作,如floating、 dockable等等。
這段代碼要放在哪裡呢?通常我們希望VS在加載Add-In時創建工具窗口,可以使用 OnConnection方法,另外可以采取比較安全的方式,就是判斷connectMode參數,如果它 的值為ext_cm_AfterStartup,才進行創建,這時VS主窗口已經加載完畢了。在創建之後 ,在View菜單中添加一個菜單項來顯示該窗口,此時只要將Window實例的Visible屬性設 置為true就可以了。(可以在本文的最後下載到這些代碼)
從圖中可以看到正以標簽頁的形式顯示窗口,在窗口中按分類顯示快捷鍵及其描述信 息,所有這些信息來自dofactory。
關於使用ActiveX控件添加ToolWindow,可以參考Working with Microsoft Visual Studio 2005一書的228頁。
可以下載代碼,也可以下載可運行的Add-In(解壓縮後將文件放在[My Documents Path]\Visual Studio 2008\Addins下)。
我們身在何處?
本文介紹了VS工具窗口相關的內容。首先是如何訪問、操作那些內置的工具窗口,如 Solution Explorer、Output Window等等;然後介紹了如何創建自定義的工具窗口,在這 個窗口中可以查看VS的快捷鍵列表。
出處:http://www.cnblogs.com/anderslly/archive/2009/05/10/vs-addin- toolwindow.html