【问题标题】:VSIX Get Project associated with its Context MenuVSIX 获取与其上下文菜单关联的项目
【发布时间】:2020-05-19 08:59:40
【问题描述】:

我想为一个项目创建一个上下文菜单命令。通过将 .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


    【解决方案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的项目。

    【讨论】:

      【解决方案2】:

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多