【问题标题】:Add menu item to .cs files (only) in Visual Studio solution explorer?在 Visual Studio 解决方案资源管理器中将菜单项添加到 .cs 文件(仅)?
【发布时间】:2012-11-04 14:21:07
【问题描述】:

我想在 VS 2010 的解决方案资源管理器中向 .cs 文件添加上下文菜单项?我可以将它添加到项目中,但不仅可以添加到 .cs 文件中吗?任何帮助,将不胜感激。

【问题讨论】:

标签: c# visual-studio-2010 visual-studio-addins


【解决方案1】:

在你的OnBeforeQueryStatus方法中你需要获取当前选中的对象并确定文件类型,然后你可以为MenuCommand设置Visible属性。

要启用OnBeforeQueryStatus,您需要将以下属性添加到您的包中:

[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionExists)]
public sealed class YourPackage : Package

然后在您的命令构造函数中,您需要将您的回调绑定到BeforeQueryStatus

... 
    var commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
    if (commandService == null) return;
    var menuCommandId = new CommandID(CommandSet, CommandId);
    var menuItem = new OleMenuCommand(this.MenuItemCallback, menuCommandId);
    menuItem.BeforeQueryStatus +=
        new EventHandler(OnBeforeQueryStatus);
    commandService.AddCommand(menuItem);
...

OnBeforeQueryStatus:

private void OnBeforeQueryStatus(object sender, EventArgs e)
{
    var myCommand = sender as OleMenuCommand;
    if (null == myCommand) return;
    var selectedObject = Util.GetProjectItem();
    myCommand.Visible = selectedObject.Name.EndsWith(".cs") && this.Enabled;
}

获取项目项:

public static ProjectItem GetProjectItem()
{
    IntPtr hierarchyPointer, selectionContainerPointer;
    Object selectedObject = null;
    IVsMultiItemSelect multiItemSelect;
    uint projectItemId;

    var monitorSelection =
        (IVsMonitorSelection)Package.GetGlobalService(
            typeof(SVsShellMonitorSelection));

    monitorSelection.GetCurrentSelection(out hierarchyPointer,
        out projectItemId,
        out multiItemSelect,
        out selectionContainerPointer);

    var selectedHierarchy = Marshal.GetTypedObjectForIUnknown(
        hierarchyPointer,
        typeof(IVsHierarchy)) as IVsHierarchy;

    if (selectedHierarchy != null)
    {
        ErrorHandler.ThrowOnFailure(selectedHierarchy.GetProperty(
            projectItemId,
            (int)__VSHPROPID.VSHPROPID_ExtObject,
            out selectedObject));

    }
    return selectedObject as ProjectItem;
}

所有这些你应该只在以.cs结尾的项目文件上看到你的按钮

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多