3

我正在为我的公司创建一个用于 MVC 4 应用程序的自定义 VSTemplate,它使用的向导与您创建新的 MVC4 应用程序时出现的向导相当。当开发人员创建这种类型的新应用程序时,我想应用两个模板之一,如下所示:

VS 项目向导

这两个条目都对应于在我的 VSIX 项目中名为 ProjectTemplates 的文件夹下定义的模板:

解决方案资源管理器

我的问题是,向导运行时如何应用正确的模板?我知道如何创建一个包含多个项目的 vstemplate(使用 vstemplate 中的 ProjectCollection 节点),但这并不是我真正想要做的,因为它们永远不会部署在一起。我看到我可以将两个 vstemplates 作为资产添加到我的 vsixmanifest 文件中,但我不确定如何有条件地仅应用一个模板。

谢谢!

4

1 回答 1

7

您需要将“可选”模板的文件包含在“根”模板文件夹的子目录中,但将它们从“根”模板中排除TemplateContent Element

您的IWizard实现需要保留对EnvDTE.DTE对象的引用( 的第一个参数RunStarted),并在ProjectFinishedGenerating使用与用户选择的模板匹配的模板中将项目添加到解决方案中。

public class SelectTemplatesWizard : IWizard
{
    private EnvDTE.DTE _dte = null;

    private string _solutionDir = null;

    private string _templateDir = null;

    public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
    {
        // Store the reference to the environment for later use
        _dte = automationObject as EnvDTE.DTE;

        /*
          The value of the item in the replacements dictionary for the key 
          $destinationdirectory$ is populated with the physical location of
          the directory (named based on the user entered project name) created
          sibling to the solution file.

          The solution directory will be this directories parent 
          when the Type attribute of the VSTemplate element is ProjectGroup
        */
        _solutionDir = System.IO.Path.GetDirectoryName(replacementsDictionary["$destinationdirectory$"]);

        // customParams[0] is a default custom param that contains the physical location of the template that is currently being applied
        _templateDir = System.IO.Path.GetDirectoryName(customParams[0] as string);
    }

    public void ProjectFinishedGenerating(Project project)
    {
        int userSelected = 1;
        string name= null, projectPath= null, templatePath = null;

        switch (userSelected)
        {
            case 0:
                {
                    name = "Angular";
                    projectPath = System.IO.Path.Combine(_solutionDir, "Angular");
                    templatePath = System.IO.Path.Combine(_templateDir , "Angular\Angular.vstemplate");
                }
                break;
            case 1:
                {
                    name = "MVC4";
                    projectPath = System.IO.Path.Combine(_solutionDir, "MVC4");
                    templatePath = System.IO.Path.Combine(_templateDir , "MVC4\MVC4.vstemplate");
                }
                break;
        }
        _dte.Solution.AddFromTemplate(templatePath, projectPath, name);
    }

    /* Other IWizard methods excluded for brevity */
}
于 2013-11-20T21:27:22.610 回答