前言
在之前的兩篇隨筆中,我介紹了Add-In的運行機制,這樣對Add-In的事件、生命週期 、與VS如何互動可以有個基本的瞭解了。現在是時候看看如何在VS中完成一些操作,這才 是Add-In開發的目的所在。
一般的,Add-In應當提供一些介面元素,這樣使用者可以進行某些操作,比如在主菜單 內添加一個功能表項目,或者在編輯器的操作功能表內添加一個功能表項目,在本文中就來看看如 何實現這些。
關於命令(Command)
考慮一個極為常見的情境:在編寫代碼的過程中,選中一段文本,點擊Edit->Copy (或工具列按鈕)或者按下Ctrl+C,我們可以把選中文本拷貝到剪貼簿,這個過程的背後 發生了什嗎?
是什麼完成的拷貝操作呢?答案是命令。可以認為命令就是某個特定的功能,如Copy 、Paste、Cut等等。VS本身就內建大量的命令(有數千個之多),而上面說到的功能表項目、 工具列或快速鍵則執行了這些命令。通過Tools->Options菜單可以查看命令列表:
圖1:VS的命令列表
值得注意的是,執行命令並非必須通過介面元素,比如在命令視窗中:
圖2:在命令視窗執行命令
這樣也可以執行同樣的命令。現在我們知道存在多種方式來執行命令,即菜單、工具 欄、快速鍵或命令視窗,這裡統稱為觸發者。在VS中,觸發者與命令是分離開來的:使用者 通過觸發者來執行命令,而命令負責檢查自身的狀態(名稱、是否可見、是否可用等等) 並執行。這意味著,命令可以對應一個或多個功能表項目,也可以不對應任何功能表項目。
另一方面,對於同一個命令,比如Edit.Copy,仍然可能有不同的情況。在文字編輯器 內和在解決方案管理器內的Edit.Copy命令執行內容並不相同。這裡有一個命令目標 (Command Target)的概念,VS將命令轉向給了命令目標,而命令目標按自己的實現來執 行該命令。總結下來就是:
對象 |
職責 |
觸發者 |
提供一種方式供使用者使用 |
命令 |
一個邏輯實體,檢查自身的狀態,可以執行命令,也可以轉向一個 命令目標 |
命令目標 |
根據傳遞過來的命令,按自己的實現來執行它 |