You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:27:02