天天看點

VS Addin開發小技巧:擷取Solution Explorer中檔案項的路徑

 在VS2008中,當我們打開一個文檔時,在頂部的Tab上有幾個實用的菜單項:

<a href="http://images.cnblogs.com/cnblogs_com/anderslly/WindowsLiveWriter/VSAddinSolutionExplorer_127BE/vs-document-context-menu_2.jpg"></a>

這裡主要看其中的兩項:Copy Full Path和Open Containing Folder,可以擷取文檔的路徑或者打開包含目前文檔的檔案夾,尤其是後者,是經常會用到的。

不過在Solution Explorer中,卻沒有對應的菜單項,當你需要的時候,隻好先打開文檔,再使用上面的菜單。現在考慮如何在Addin中添加這兩個缺失的菜單。

對于打開的文檔,都會有一個Document類型的執行個體與之對應,通過它的FullName屬性可以了解目前文檔的完整路徑,有了這個路徑,上述菜單功能就容易實作了。

在Solution Explorer中,有些不同,對于其中的檔案項,對應的是ProjectItem的執行個體,它倒是有個Document屬性,不過如果文檔沒打開,那麼這個屬性就為null,對于我們此處的需求來說,Document就用不上了。仔細觀察一下就會發現,ProjectItem有個Properties屬性,而該集合屬性有若幹有用的資訊,其中的FullPath正是我們需要的!接下來就好辦了。

首先添加兩個指令到檔案項的上下文菜單:

<a></a>

VS Addin開發小技巧:擷取Solution Explorer中檔案項的路徑

C# Code - 添加指令

CommandBar projectItemCommandBar = <b>helper.GetCommandBarByName(</b><b>"</b><b>Item"</b><b>);</b>

try

{

    helper.AddNamedCommand2(projectItemCommandBar, COPY_FULL_PATH_COMMAND_NAME,

        "Copy Full Path", "Copy Full Path", false, 0, projectItemCommandBar.Controls.Count + 1);

    helper.AddNamedCommand2(projectItemCommandBar, OPEN_CONTAINING_FOLDER_COMMAND_NAME,

        "Open Containing Folder", "Open Containing Folder", false, 0, projectItemCommandBar.Controls.Count + 1);

}

catch

對于Copy Full Path指令,可以這樣實作:

VS Addin開發小技巧:擷取Solution Explorer中檔案項的路徑

C# Code - Copy Full Path Command

private void CopyFullPath()

    SelectedItems items = _applicationObject.SelectedItems;

    ProjectItem item = items.Item(1).ProjectItem;

    string fullPath = item.Properties.Item("FullPath").Value.ToString();

    Clipboard.SetText(fullPath);

而對于Open Containing Folder也是類似:

VS Addin開發小技巧:擷取Solution Explorer中檔案項的路徑

C# Code - OpenContainingFolder Command

private void OpenContainingFolder()

    System.Diagnostics.Process.Start("explorer.exe",

        string.Format("/select, \"{0}\"", fullPath));

除了這兩個基本的指令,根據這個路徑,我們還可以去做更多的事情。比如在最近的一個項目中,假設項目名稱為MyProj,那麼他們規定存放解決方案的目錄必須MyProj,如D:\MyWorks\MyProj(也可以不這樣,但那樣會更麻煩),在此之後,會頻繁使用到從MyProj開始的相對路徑。如果手工去做,顯然會浪費很多時間,通過上面的方法,完全可以擷取檔案路徑,然後截取MyProj之後的部分,時間長了會節省很多時間。

看下來,這是一個相當簡單的技巧,但是卻很實用。目前很少有資料提到這個地方,而且它還隐藏在Properties這裡面,這又是一個VS Addin API的一個不好的地方——不是通過簡單的屬性直接開放,而是堆放在一些集合屬性中——這時必須要耐心地去檢視集合的每一項才能知道是否有自己需要的東西。

本文轉自一個程式員的自省部落格園部落格,原文連結:http://www.cnblogs.com/anderslly/archive/2009/08/30/retrieve-project-item-full-path.html,如需轉載請自行聯系原作者。