如何通过VSIX为特定文件类型添加右键上下文菜单?
给VS Solution Explorer里的.xyz文件添加专属右键按钮
方法一:通过.vsct配置文件做静态约束
- 打开扩展项目里的
.vsct文件,找到你自定义按钮的<Command>节点,给它加上<VisibilityConstraints>配置 - 添加针对文件类型的可见性规则,示例如下:
<VisibilityConstraints> <!-- 先确保解决方案有项目时才显示 --> <VisibilityItem guid="guidYourExtensionCmdSet" id="cmdidYourXYZButton" context="guidVSStd97, UICONTEXT_SolutionHasProject"/> <!-- 关联.xyz文件的上下文(需先定义对应的UICONTEXT) --> <VisibilityItem guid="guidYourExtensionCmdSet" id="cmdidYourXYZButton" context="guidXYZFileContext, UICONTEXT_FileTypeXYZ"/> </VisibilityConstraints> - 静态配置的灵活性稍弱,适合VS已预先识别的文件类型
方法二:在命令逻辑里动态判断(更灵活)
- 打开你的命令实现类(一般是继承
OleMenuCommand的.cs文件),重写QueryStatus方法,实时判断当前选中的是不是.xyz文件 - 示例代码:
public override void QueryStatus(object sender, EventArgs e) { var menuCmd = sender as OleMenuCommand; if (menuCmd == null) return; // 获取Solution Explorer里选中的项 var dte = Package.GetGlobalService(typeof(DTE)) as DTE; var selectedItems = dte?.ToolWindows.SolutionExplorer.SelectedItems.Cast<object>(); if (selectedItems == null) { menuCmd.Visible = false; return; } // 判断选中项里有没有.xyz文件 bool showButton = selectedItems.Any(item => { if (item is ProjectItem projItem && projItem.Kind == EnvDTE.Constants.vsProjectItemKindPhysicalFile) { return Path.GetExtension(projItem.Name).Equals(".xyz", StringComparison.OrdinalIgnoreCase); } return false; }); menuCmd.Visible = showButton; menuCmd.Enabled = showButton; } - 这个方法无需依赖VS的文件类型注册,能直接判断选中文件的扩展名,适用性更强
额外提示
- 如果需要让VS把.xyz当成特定类型文件处理,可以在
.pkgdef文件里加一行注册:[$RootKey$\Languages\File Extensions\.xyz] @="XYZ Custom File"
内容的提问来源于stack exchange,提问作者Jerry Nixon
相关产品推荐
相关产品推荐

