VS Addin开发小技巧:获取Solution Explorer中文件项的路径

简介:
  在VS2008中,当我们打开一个文档时,在顶部的Tab上有几个实用的菜单项:

vs-document-context-menu

这里主要看其中的两项:Copy Full Path和Open Containing Folder,可以获取文档的路径或者打开包含当前文档的文件夹,尤其是后者,是经常会用到的。

不过在Solution Explorer中,却没有对应的菜单项,当你需要的时候,只好先打开文档,再使用上面的菜单。现在考虑如何在Addin中添加这两个缺失的菜单。

对于打开的文档,都会有一个Document类型的实例与之对应,通过它的FullName属性可以了解当前文档的完整路径,有了这个路径,上述菜单功能就容易实现了。

在Solution Explorer中,有些不同,对于其中的文件项,对应的是ProjectItem的实例,它倒是有个Document属性,不过如果文档没打开,那么这个属性就为null,对于我们此处的需求来说,Document就用不上了。仔细观察一下就会发现,ProjectItem有个Properties属性,而该集合属性有若干有用的信息,其中的FullPath正是我们需要的!接下来就好办了。

首先添加两个命令到文件项的上下文菜单:

复制代码
C# Code - 添加命令
CommandBar projectItemCommandBar = helper.GetCommandBarByName("Item");

try
{
    helper.AddNamedCommand2(projectItemCommandBar, COPY_FULL_PATH_COMMAND_NAME,
        
"Copy Full Path""Copy Full Path"false0, projectItemCommandBar.Controls.Count + 1);

    helper.AddNamedCommand2(projectItemCommandBar, OPEN_CONTAINING_FOLDER_COMMAND_NAME,
        
"Open Containing Folder""Open Containing Folder"false0, projectItemCommandBar.Controls.Count + 1);
}
catch
{
}
复制代码


对于Copy Full Path命令,可以这样实现:

复制代码
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也是类似:

复制代码
C# Code - OpenContainingFolder Command
private void OpenContainingFolder()
{
    SelectedItems items 
= _applicationObject.SelectedItems;
    ProjectItem item 
= items.Item(1).ProjectItem;

    
string fullPath = item.Properties.Item("FullPath").Value.ToString();
    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,如需转载请自行联系原作者。

目录
相关文章
|
Java 中间件 API
【C/C++ 线程 】深入浅出:理解 std::thread 的局限性
【C/C++ 线程 】深入浅出:理解 std::thread 的局限性
627 2
IEEE 754规格化浮点数所能表示的最大值和最小值
IEEE 754规格化浮点数所能表示的最大值和最小值
4291 1
IEEE 754规格化浮点数所能表示的最大值和最小值
|
安全 数据安全/隐私保护
配置samba的访问密码和用户名
出于安全问题,需要为samba配置密码: $ smbpasswd -a 按提示输入想使用的密码即可 另外 /etc/samba/smb.conf 的 [global] 段必须有: security = user 如此这般,局域网的人访问你的电脑都需要以上命令设置的用户名和密码。
11531 2
|
11月前
|
Java 索引
Java“StringIndexOutOfBoundsException”解决
Java中的“StringIndexOutOfBoundsException”异常通常发生在尝试访问字符串中不存在的索引时。解决方法包括:1. 检查字符串长度,确保索引值在有效范围内;2. 使用条件语句避免越界访问;3. 对输入进行有效性验证。
1051 6
|
11月前
|
物联网
物联网:NB卡是否支持2/3/4G网络
在讨论“NB卡是否支持2/3/4G网络”的问题时,我们首先需要明确“NB卡”指的是什么。在通信领域中,“NB卡”通常指的是支持NB-IoT(Narrowband Internet of Things,窄带物联网)技术的SIM卡或模块。NB-IoT是一种专为物联网设计的窄带无线通信技术,它基于现有的蜂窝网络进行构建,但专注于低功耗广域网(LPWAN)应用。
STM32CubeMX RS485接口使用
STM32CubeMX RS485接口使用
1342 8
|
搜索推荐 测试技术
MBTI:探索你的性格类型
MBTI:探索你的性格类型
311 4
|
设计模式 存储 安全
C++多线程管理的艺术:从基础到设计模式
C++多线程管理的艺术:从基础到设计模式
227 0
|
安全 算法 程序员
【C++ 空指针的判断】深入理解 C++11 中的 nullptr 和 nullptr_t
【C++ 空指针的判断】深入理解 C++11 中的 nullptr 和 nullptr_t
1075 0
|
安全 Java
BufferedInputStream 源码学习笔记
BufferedInputStream是一个带有内存缓冲的InputStream. BufferedInputStream是继承自FilterInputStream。 FilterInputStream继承自InputStream属于输入流中的链接流,同时引用了InputStream,将In
1866 63