Visual Studio包:设置自定义解决方案资源管理器上下文菜单项的可见性

本文关键字:上下文 资源管理器 菜单项 可见性 解决方案 自定义 Studio 设置 Visual | 更新日期: 2023-09-27 18:05:13

我正在创建一个Visual Studio包(这是我的第一次),我的最终目标是为解决方案资源管理器创建一个仅适用于某些文件类型的上下文菜单项。(我认为这将是一个常见的事情,但没有找到任何像样的教程,所以如果你知道任何请告诉我)

我遵循一个简单的MSDN指南,首先在工具栏中创建一个项目(我忘记了链接到哪里),这工作得很好。

然后我找到了一种将其移动到解决方案资源管理器上下文菜单的方法。这是通过操作.vsct文件并使用如下元素实现的:

<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/>

这可能无关紧要,但我正在努力营造气氛。

现在,因为我想只显示特定文件类型的项,所以我需要找到一种在按下右键按钮时检查文件的方法。长话短说,我找到了这个,并以以下代码结束:

protected override void Initialize()
{
    //stuff
    OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
    menuItem.BeforeQueryStatus += menuItem_BeforeQueryStatus;
    //more stuff
}
void menuItem_BeforeQueryStatus(object sender, EventArgs e)
{
    var myCommand = sender as OleMenuCommand;
    myCommand.Text = "NEW NAME";
}

在上面的例子中,我只是试图设置文本来尝试证明它是有效的,我知道有一个Visible属性,但我希望这一步首先工作。触发BeforeQueryStatus事件,调试显示代码按预期执行。但是,上下文菜单项没有变化,它与原始文本保持一致。

我在这里错过了什么?为什么不更新?

Visual Studio包:设置自定义解决方案资源管理器上下文菜单项的可见性

好了,我终于找到了这个问题的解决方案,你需要做几件事…

第一步:

我们需要指定VSPackage应该"自动加载",我们这样做是为了代码将在ContextMenu显示时执行,因为通常VSPackage不会在UI显示之前初始化(即菜单项已被点击)。为此,我们向Package类添加一个属性,如下所示:

[ProvideAutoLoad("{f1536ef8-92ec-443c-9ed7-fdadf150da82}")]
public sealed class MyFirstPackage : Package

您可能想知道GUID值是什么,在这种情况下,它代表UICONTEXT_SolutionExists常数,这意味着当解决方案存在时包将自动加载(因此当我们创建一个新的或加载一个时)。我从这里得到了这个信息,因为你可能会告诉有许多不同的VSConstants可以使用。

下面是更多的资源,它们列出了可以使用的其他GUID值:

  • GUID List 1
  • GUID List 2

step2 :

现在BeforeQueryStatus代码在正确的地方执行,它仍然令人困惑的是为什么代码实际上没有改变任何东西(在我的问题中,我试图改变Text)。好吧,答案是,因为我们需要给予包这样做的权限(至少我是这样认为的)。

要做到这一点,我们必须编辑.vsct文件。在里面我们可以找到一个Buttons元素,里面应该是我们的ContextMenu Button。默认情况下,有一些注释提到了CommandFlag节点的使用——这就是我们想要的。

为了允许我们的包更改Text,我们必须添加以下节点:

<CommandFlag>TextChanges</CommandFlag>

现在,如果我们运行vpackage,它应该都像预期的那样工作!

如果您希望允许更改菜单项的Visibility(这是我最初的目标),那么您可以使用以下CommandFlag:

<CommandFlag>DynamicVisibility</CommandFlag>

这里有一个完整的命令标志列表,并描述了它们的作用。

不直接使用musefan回答中提到的guid,您可以使用:

    [ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionExists)]

请参考:UIContextGuids类获取所有guid常量。

相关文章: