Visual Studio 2010 插件 - 向解决方案资源管理器添加上下文菜单 [英] Visual Studio 2010 Plug-in - Adding a context-menu to the Solution Explorer
问题描述
我想在 Visual Studio 2010 的解决方案资源管理器的上下文菜单中为特定文件类型添加一个新选项.例如,右键单击 *.cs 文件将显示现有的上下文菜单以及我的新选项".
I want to add a new option in Visual Studio 2010's solution explorer's context menu for a specific file type. So for example, right clicking on a *.cs file will show the existing context menu plus "my new option".
我想知道代码会是什么样子;并且希望得到一个指向开发 Visual Studio 插件的良好参考的指针.我看到的教程/参考资料非常糟糕.
I'm wondering what the code would look like; and would love a pointer to a good reference for developing visual studio plug-ins. The tutorials/references I'm seeing are conspicuously horrid.
谢谢!
推荐答案
我花了大约 5 个小时来做这件事.
It took me about 5 hours to do this.
有 2 个选项,Visual Studio 插件(或共享插件)与 Visual Studio 包.
There are 2 options, Visual studio Add-in (or shared Add-in) vs Visual studio package.
该包要复杂得多,可以为您提供更多控制,但对于解决方案资源管理器上的上下文菜单,则不需要它.
The package is far more complicated to give you far more control, but for a context menu on the solution explorer it is not needed.
新项目 -> 其他项目类型 -> 可扩展性 -> Visual Studio 插件.
So new project-> Other Project Types -> Extensibility -> Visual Studio Add-in.
这是一个演练 - 链接
我也关注了这个 - 链接
我建议您保留添加到工具菜单的选项,直到上下文菜单正常工作,或者提供一个放置设置对话框的位置(如果您不编写工具-> 选项页面.
I recommend you leave on the option for add to tools menu until you have the context menu working, or to provide a place to put a settings dialog (if you don't write a Tool-> options page.
这是连接代码:
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
if (connectMode == ext_ConnectMode.ext_cm_UISetup)
{
object[] contextGUIDS = new object[] { };
Commands2 commands = (Commands2)_applicationObject.Commands;
string toolsMenuName = "Tools";
//Place the command on the tools menu.
//Find the MenuBar command bar, which is the top-level command bar holding all the main menu items:
Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];
//Find the Tools command bar on the MenuBar command bar:
CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
// get popUp command bars where commands will be registered.
CommandBars cmdBars = (CommandBars)(_applicationObject.CommandBars);
CommandBar vsBarItem = cmdBars["Item"]; //the pop up for clicking a project Item
CommandBar vsBarWebItem = cmdBars["Web Item"];
CommandBar vsBarMultiItem = cmdBars["Cross Project Multi Item"];
CommandBar vsBarFolder = cmdBars["Folder"];
CommandBar vsBarWebFolder = cmdBars["Web Folder"];
CommandBar vsBarProject = cmdBars["Project"]; //the popUpMenu for right clicking a project
CommandBar vsBarProjectNode = cmdBars["Project Node"];
//This try/catch block can be duplicated if you wish to add multiple commands to be handled by your Add-in,
// just make sure you also update the QueryStatus/Exec method to include the new command names.
try
{
//Add a command to the Commands collection:
Command command = commands.AddNamedCommand2(_addInInstance, "HintPaths", "HintPaths", "Executes the command for HintPaths", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
//Add a control for the command to the tools menu:
if ((command != null) && (toolsPopup != null))
{
//command.AddControl(toolsPopup.CommandBar, 1);
command.AddControl(vsBarProject);
}
}
catch (System.ArgumentException argEx)
{
System.Diagnostics.Debug.Write("Exception in HintPaths:" + argEx.ToString());
//If we are here, then the exception is probably because a command with that name
// already exists. If so there is no need to recreate the command and we can
// safely ignore the exception.
}
}
}
此代码检查用户选择的是否是一个项目,例如:
This code checks to see if what the user has selected is a project for instance:
private Project GetProject()
{
if (_applicationObject.Solution == null || _applicationObject.Solution.Projects == null || _applicationObject.Solution.Projects.Count < 1)
return null;
if (_applicationObject.SelectedItems.Count == 1 && _applicationObject.SelectedItems.Item(1).Project != null)
return _applicationObject.SelectedItems.Item(1).Project;
return null;
}
请注意,您的代码中的某些字符串名称必须匹配,我不确定它们是哪些,因为我昨天刚做过.
Note that certain string names in your code have to match up and I'm not sure which ones they are quite yet as I just did this yesterday.
这篇关于Visual Studio 2010 插件 - 向解决方案资源管理器添加上下文菜单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!