VSIX获取与其上下文菜单关联的项目

问题描述 投票:0回答:2

我想为项目创建上下文菜单命令。通过将.vsct文件中的ID设置为“ IDM_VS_CTXT_PROJNODE”,我设法使命令显示在右侧菜单上。我的代码示例被正确调用:

    private FirstCommand(AsyncPackage package, OleMenuCommandService commandService)
    {
        this.package = package ?? throw new ArgumentNullException(nameof(package));
        commandService = commandService ?? throw new ArgumentNullException(nameof(commandService));

        var menuCommandID = new CommandID(CommandSet, CommandId);
        var menuItem = new MenuCommand(StartNotepad, menuCommandID);
        commandService.AddCommand(menuItem);
    }


    private void StartNotepad(object sender, EventArgs e)
    {
        //example code  
        /*var process = new Process();
        process.StartInfo.FileName = "Notepad.exe";
        process.Start();*/
    }

我现在需要有关项目的信息(目录,名称等)。但是vsix项目上的所有示例仅显示了如何获取当前项目(我什至不知道那是我单击的项目)还是对我不起作用。它们都很老,我不知道它们是否是目前的最佳做法。

所以我的问题是如何在StartNotepad()中获取有关项目的信息?感谢您的帮助。

c# visual-studio visual-studio-extensions
2个回答
1
投票

使用以下方法获取您单击的项目:

private EnvDTE.UIHierarchyItem GetSelectedSolutionExplorerItem()
{
    EnvDTE.UIHierarchy solutionExplorer = dte.ToolWindows.SolutionExplorer;
    object[] items = solutionExplorer.SelectedItems as object[];
    if (items.Length != 1)
        return null;

    return items[0] as EnvDTE.UIHierarchyItem;
}

然后将其转换为带有GetSelectedSolutionExplorerItem()?.Object as EnvDTE.Project的项目。


0
投票

Sergey的回答帮助我找到了解决方案。唯一缺少的想法是如何以异步方式获取dte:

private EnvDTE.UIHierarchyItem GetSelectedSolutionExplorerItem()
{
    ThreadHelper.ThrowIfNotOnUIThread();
    var dte = ServiceProvider.GetServiceAsync(typeof(DTE)).Result as DTE2;
    if (dte == null) return null;
    var solutionExplorer = dte.ToolWindows.SolutionExplorer;
    object[] items = solutionExplorer.SelectedItems as object[];
    if (items.Length != 1)
        return null;

    return items[0] as UIHierarchyItem;
}
© www.soinside.com 2019 - 2024. All rights reserved.