VS 2019如何自定义解决方案资源管理器右键操作创建预设目录结构
VS 2019 解决方案资源管理器自定义右键菜单实现方案
首先确保你的VS 2019已安装「Visual Studio 扩展开发」工作负载,未安装的话可以通过Visual Studio Installer添加该组件。
步骤1:新建VSIX项目
- 打开VS 2019,新建项目,搜索「VSIX 项目」,创建空VSIX项目,可自定义项目名称,例如
ABCFolderExtension
步骤2:添加自定义命令
- 右键刚创建的项目 -> 选择「添加」->「新建项」-> 搜索「自定义命令」,选择「命令」模板,命名为
CreateFolderStructureCommand.cs
步骤3:添加菜单显示状态控制逻辑
在自定义命令类的构造函数中添加BeforeQueryStatus事件绑定,用于控制仅右键选中名为ABC的文件夹时才显示菜单:
public CreateFolderStructureCommand(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 OleMenuCommand(this.Execute, menuCommandID); // 绑定显示状态控制事件 menuItem.BeforeQueryStatus += MenuItem_BeforeQueryStatus; commandService.AddCommand(menuItem); } private void MenuItem_BeforeQueryStatus(object sender, EventArgs e) { OleMenuCommand menuCommand = sender as OleMenuCommand; if (menuCommand == null) return; DTE2 dte = (DTE2)Package.GetGlobalService(typeof(DTE)); SelectedItems selectedItems = dte.SelectedItems; bool isVisible = false; if (selectedItems.Count == 1) { SelectedItem selectedItem = selectedItems.Item(1); ProjectItem projectItem = selectedItem.ProjectItem; // 校验选中项为文件夹且名称为ABC if (projectItem != null && projectItem.Kind == Constants.vsProjectItemKindPhysicalFolder && projectItem.Name == "ABC") { isVisible = true; } } menuCommand.Visible = isVisible; }
步骤4:编写文件夹生成逻辑
修改自定义命令类的Execute方法,实现选中菜单后自动生成指定子文件夹:
private void Execute(object sender, EventArgs e) { DTE2 dte = (DTE2)Package.GetGlobalService(typeof(DTE)); SelectedItems selectedItems = dte.SelectedItems; if (selectedItems.Count != 1) return; SelectedItem selectedItem = selectedItems.Item(1); ProjectItem abcFolder = selectedItem.ProjectItem; // 二次校验,避免异常 if (abcFolder == null || abcFolder.Kind != Constants.vsProjectItemKindPhysicalFolder || abcFolder.Name != "ABC") { return; } // 要生成的子文件夹列表 List<string> subFolders = new List<string> { "Models", "Enums", "Interfaces", "Implementations" }; foreach (string folderName in subFolders) { try { // 文件夹不存在时才创建 bool isExist = abcFolder.ProjectItems .Cast<ProjectItem>() .Any(item => item.Name.Equals(folderName, StringComparison.OrdinalIgnoreCase)); if (!isExist) { abcFolder.ProjectItems.AddFolder(folderName, Constants.vsProjectItemKindPhysicalFolder); } } catch (Exception ex) { // 可根据需求自行添加异常提示逻辑 System.Diagnostics.Debug.WriteLine($"创建文件夹失败:{ex.Message}"); } } }
步骤5:配置菜单展示位置
打开项目中的.vsct配置文件,修改自定义按钮的配置,指定菜单出现在项目项右键上下文菜单中:
<Button guid="guidABCFolderExtensionPackageCmdSet" id="CreateFolderStructureCommandId" priority="0x0100" type="Button"> <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/> <CommandFlag>DynamicVisibility</CommandFlag> <CommandFlag>DefaultInvisible</CommandFlag> <Strings> <ButtonText>创建文件夹结构</ButtonText> </Strings> </Button>
步骤6:测试与部署
- 按F5启动调试,会自动打开VS 2019实验实例,打开任意项目创建名为
ABC的文件夹,右键即可看到「创建文件夹结构」选项,点击即可生成对应层级的子文件夹 - 调试无误后,右键项目选择「生成」,输出目录下的
.vsix文件就是安装包,双击即可安装到本地正式VS 2019环境中
内容的提问来源于stack exchange,提问作者Prashant
相关产品推荐
相关产品推荐

