mus*_*fan 14 c# visual-studio-2012 visual-studio-package
我正在创建一个Visual Studio包(这是我的第一次),我的最终目标是为解决方案资源管理器创建一个仅适用于某些文件类型的上下文菜单项.(我认为这将是一个常见的事情,但没有找到任何体面的教程,所以如果你知道任何请告诉我)
我按照一个简单的MSDN指南首先在工具栏中创建一个项目(我忘记链接它的位置),这很好.
然后我找到了将其移动到Solution Explorer上下文菜单的方法.这是通过操作.vsct文件并具有如下元素来实现的:
<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/>
Run Code Online (Sandbox Code Playgroud)
这可能没关系,但我试图设置场景.
现在,因为我只想显示某些文件类型的项目,所以我需要找到一种方法来在按下右键单击按钮时检查文件.缩短搜索时间,我找到了这个并最终得到以下代码:
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";
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我只是试图设置文本来尝试并证明它有效,我知道有一个Visible属性,但我希望这一步先工作.该BeforeQueryStatus事件被触发,并且调试显示代码按预期执行.但是,上下文菜单项没有变化,它保留原始文本.
我在这里错过了什么?为什么不更新?
mus*_*fan 23
好的,所以我终于找到了解决这个问题的方法,你需要做几件事......
第1步:
我们需要指定VSPackage应该"自动加载",我们这样做是为了在显示ContextMenu时执行代码,因为通常VSPackage在UI显示之前不会初始化(即菜单项已被点击).为此,我们向Package类添加一个属性,如下所示:
[ProvideAutoLoad("{f1536ef8-92ec-443c-9ed7-fdadf150da82}")]
public sealed class MyFirstPackage : Package
Run Code Online (Sandbox Code Playgroud)
您可能想知道GUID值是什么,在这种情况下它代表UICONTEXT_SolutionExists常量,这意味着当解决方案存在时,包将自动加载(因此当我们创建一个新的或加载一个时).我从这里得到了这些信息,因为你可能会知道有许多不同的VSConstants可以使用.
以下是一些列出可以使用的其他GUID值的资源:
第2步:
既然BeforeQueryStatus代码正在正确的位置执行,那么为什么代码实际上没有改变任何东西仍然令人困惑(在我的问题中我试图改变它Text).嗯,答案是,因为我们需要授予包的权限(至少这是我认为的方式).
为此,我们必须编辑该.vsct文件.在那里我们可以找到一个Buttons元素,里面应该是我们的ContextMenu Button.默认情况下,有一些注释提到了CommandFlag节点的使用- 这就是我们想要的.
为了给我们的包更改权限,Text我们必须添加以下节点:
<CommandFlag>TextChanges</CommandFlag>
Run Code Online (Sandbox Code Playgroud)
现在,如果我们运行VSPackage,它应该按预期工作!
如果您希望允许更改Visibility菜单项(这是我最初的目标),那么您可以使用以下内容CommandFlag:
<CommandFlag>DynamicVisibility</CommandFlag>
Run Code Online (Sandbox Code Playgroud)
这里有一个完整的命令标志列表,并描述了它们的作用.
而不是直接使用musefan的答案中提到的guid,你可以使用:
[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionExists)]
Run Code Online (Sandbox Code Playgroud)
请参阅:所有guid常量的UIContextGuids类.
| 归档时间: |
|
| 查看次数: |
3474 次 |
| 最近记录: |