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

C# Visual Studio包:设置自定义解决方案资源管理器上下文菜单项的可见性,c#,visual-studio-2012,visual-studio-package,C#,Visual Studio 2012,Visual Studio Package,我正在创建一个VisualStudio软件包(这是我第一次),我的最终目标是为解决方案资源管理器创建一个仅适用于某些文件类型的上下文菜单项。(我认为这是一件很平常的事情,但没有找到任何关于它的像样的教程,所以如果你知道任何,请告诉我) 我遵循了一个简单的MSDN指南,首先在工具栏中创建了一个项目(我忘记了链接它的位置),这很好 然后我找到了一种方法,将其移动到解决方案资源管理器上下文菜单。这是通过操纵.vsct文件并使用如下元素实现的: <Parent guid="guidSHLMainM

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

我遵循了一个简单的MSDN指南,首先在工具栏中创建了一个项目(我忘记了链接它的位置),这很好

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

<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/>
在上面的示例中,我只是试图设置文本以尝试并证明它是有效的,我知道有一个
Visible
属性,但我希望先执行此步骤。触发
BeforeQueryStatus
事件,调试显示代码按预期执行。但是,上下文菜单项没有更改,它与原始文本保持一致


我错过了什么?为什么不更新?

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

步骤1

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

[ProvideAutoLoad("{f1536ef8-92ec-443c-9ed7-fdadf150da82}")]
public sealed class MyFirstPackage : Package
您可能想知道GUID值是什么,在本例中,它表示
UICONTEXT\u SolutionExists
常量,这意味着当解决方案存在时,包将自动加载(因此当我们创建新的解决方案或加载解决方案时),正如你可能知道的,有一种方法是可以使用的

以下是列出可使用的其他GUID值的更多资源:

步骤2

既然
BeforeQueryStatus
代码在正确的位置执行,为什么代码实际上没有改变任何东西仍然令人困惑(在我的问题中,我试图改变
文本
)。好的,答案是,因为我们需要给予包这样做的许可(至少我是这样认为的)

为此,我们必须编辑
.vsct
文件。在里面我们可以找到一个
按钮
元素,里面应该是我们的上下文菜单
按钮
。默认情况下,有一些注释提到了
CommandFlag
节点的使用-这就是我们想要的

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

<CommandFlag>TextChanges</CommandFlag>

这里有一个向导,对它们的功能进行了描述。

您可以使用以下向导,而不是直接使用musefan回答中提到的guid:

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

请参阅:获取所有guid常量。

很好的发现,我相信这对其他人非常有用。出于某些原因,这里也可以找到相同的guid:Microsoft.VisualStudio.VSConstants.UICONTEXT。我在这个页面上找到了这些信息。从Visual Studio 2015开始,您可以使用基于规则的UI上下文,从而可以基于指定的布尔表达式加载包。将介绍如何创建仅在.config文件上处于活动状态的菜单命令。
<CommandFlag>DynamicVisibility</CommandFlag>
    [ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionExists)]