轉帖|其它|編輯:郝浩|2010-10-25 15:41:44.000|閱讀 443 次
概述:本篇我將展示如何深入挖掘VS2010 Extension,使它成為鋒利的軍刀,而不是繡花枕頭。鑒于此,這里就從上面提到了的Feature——注釋和取消注釋選擇的代碼來剖析,希望可以為大家拓寬思路,更好的利用VS2010。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在上一篇(VS2010 Extension (1)實踐)里,主要展示了如何使用MEF擴展VS2010,來擴展編輯控制和展現自己的UI;在實現QuickToolbar的時候,發現MEF僅僅提供了很基本的編輯控制,如果需要高級的操作,比如注釋選擇的代碼,就捉襟見肘,很是麻煩。
本篇我將展示如何深入挖掘VS2010 Extension,使它成為鋒利的軍刀,而不是繡花枕頭。鑒于此,這里就從上面提到了的Feature——注釋和取消注釋選擇的代碼來剖析,希望可以為大家拓寬思路,更好的利用VS2010。
首先回顧一下上篇中的實現,當時是基于TextViewLine做注釋代碼的,這里有兩個潛在問題:其一,TextViewLine,顧名思義,是“可視區域”的行,所以如果選擇超出可視區域,超出的部分就沒有注釋掉;其二,當選擇的結束位置在行的結尾時,無法實現IDE注釋代碼后保持Caret在選擇結尾而不跳到下一行的行為,當嘗試自己重新選擇并移動Caret就會收到ITextSpanshot無效的異常。
上面提到了VS2010 Extension對編輯器的編輯行為的控制能力僅僅提供了通用的,比如Cut/Copy/Paste等等,而其他的諸如注釋/取消注釋代碼,添加、刪除、導航到Bookmark等程序員常用功能沒有暴露出來,具體可以參考IEditorOperations Interface(),這里的所有Member表達了其所支持的編輯操作。總之,這條路只有這么幾個目的地。
那么,還有其他方法嗎?貌似走到了死胡同了,但是當我們使用IDE時候,卻是可以很容易的通過Edit菜單找到所有的功能的,問題是,它們要怎樣才能為我所用呢?
我首先想到的是在VSSDK中找找,結果一個名字看起來很順眼的接口撞到眼里,它就是IVsUIShell Interface,MSDN上市這么說的:
This interface provides access to basic windowing functionality, including access to and creation of tool windows and document windows. provided by the environment.
也就是說這是一個由IDE提供的全局的Service,可以創建、訪問工具窗口和編輯窗口。瀏覽一下這個所有Member,發現了一個叫IVsUIShell.PostExecCommand(...)的方法,MSDN描述說通過它可以異步執行Command,那么,只要找到注釋代碼的Command,在通過這個接口就可以實現VS IDE一樣的注釋代碼的Feature了??釘懒?,就是它,當怎么得到它呢?現在請留心MSDN上的解釋,就是上面我使用紅色粗體表示出來的部分——這個由IDE提供的全局的Service,那么可以通過Package.GetGlobalService(...)來獲?。?/p>
IVsUIShell shell = Package.GetGlobalService(typeof(IVsUIShell)) as IVsUIShell;
接下來是找到自己需要Command,然后PostExecCommand就搞定了;而VS提供的Command有兩部分組成:Guid和CommandID,這個大部分都在VSConstants Class里面,以注釋代碼為例,其Guid是:VsConstants.VSStd2k,而CommandID是VSConstants.VSStd2kCmdID.COMMENTBLOCK。下面是我包裝的注釋和取消注釋的代碼片段:
public static void ProcessComments(bool comment)
{
IVsUIShell shell = Package.GetGlobalService(typeof(IVsUIShell)) as IVsUIShell;
if (shell != null)
{
Guid std2k = VSConstants.VSStd2K;
uint cmdId = comment ?
(uint)VSConstants.VSStd2KCmdID.COMMENT_BLOCK :
(uint)VSConstants.VSStd2KCmdID.UNCOMMENT_BLOCK;
object arg = null;
shell.PostExecCommand(ref std2k, cmdId, 0, ref arg);
}
}
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客轉載