程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Visual Studio 2008可擴展性開發(八):關於用戶界面的種種(上)

Visual Studio 2008可擴展性開發(八):關於用戶界面的種種(上)

編輯:關於.NET

前言

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved