嵌套文件项模板(Nested Files in Item Template)

2019-10-17 07:32发布

我想创建一个Visual Studio项目模板,将创造一个WPF窗口与视图模型附加文件

像下面

VMWindow.xaml --- VMWindow.xaml.cs --- VMWindow.vm.cs

我可以用下面的.vstemplate文件创建模板

<VSTemplate Type="Item" Version="2.0.0"
    xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
  <TemplateData>
    <Name>Viewmodel Dialog Box</Name>
    <Description>Viewmodel Dialog Box</Description>
    <Icon>Icon.ico</Icon>
    <ProjectType>CSharp</ProjectType>
    <DefaultName>VMDialog</DefaultName>
  </TemplateData>
  <TemplateContent>
    <ProjectItem TargetFileName="$fileinputname$.xaml" SubType="Window">ViewModelDialogTemplate.xaml</ProjectItem>
    <ProjectItem TargetFileName="$fileinputname$.xaml.cs">ViewModelDialogTemplate.xaml.cs</ProjectItem>
    <ProjectItem TargetFileName="$fileinputname$.vm.cs">ViewModelDialogTemplate.vm.cs</ProjectItem>
  </TemplateContent>
</VSTemplate>

我想为模板与嵌套在主窗口内的文件在Solution Explorer中显示当.vm.cs文件创建本身。

我发现下面的HOWTO,我有Visual Studio 2010中跟随它虽然麻烦。 这是写于2008年,这是否仍然适用?

代码项目的文章

Answer 1:

这其实很容易...

 <ProjectItem TargetFileName="$fileinputname$.xaml" SubType="Window">ViewModelDialogTemplate.xaml</ProjectItem>
    <ProjectItem TargetFileName="$fileinputname$.xaml/$fileinputname$.xaml.cs">ViewModelDialogTemplate.xaml.cs</ProjectItem>
    <ProjectItem TargetFileName="$fileinputname$.xaml/$fileinputname$.vm.cs">ViewModelDialogTemplate.vm.cs</ProjectItem>


Answer 2:

还有一个更简单的方法。 您可以在VS用来构造复合项相同的向导拉。 你这样做通过模板的末尾添加元素,在<TemplateContent> ...

<WizardExtension>
    <Assembly>Microsoft.VisualStudio.Web.Application, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
    <FullClassName>Microsoft.VisualStudio.Web.Application.WATemplateWizard</FullClassName>
</WizardExtension>

然后,你需要告诉向导母公司的延伸,和孩子的延伸......

<CustomParameters>
  <CustomParameter Name="$ParentExtension$" Value=".xaml"/>
  <CustomParameter Name="$ChildExtension$" Value=".cs"/>
</CustomParameters>

此元素进入内部<TemplateContent>。

该解决方案进行测试,并在VS2012的工作,你可以看到在调用向导硬编码的版本。 如果您有问题的版本,查找文件webform.vstemplate(Visual Studio的模板的.aspx),并激励自己。



Answer 3:

事实证明同样的方法适用于VS 2010年需要进行一些调整,但这个代码项目的文章涵盖了基本思路。



Answer 4:

您需要实现Microsoft.VisualStudio.TemplateWizard.IWizard接口 ,并编写代码一点点地从项目中移除新的项目,并将其重新添加为其他项目的孩子。 下面是从QueryFirst是采取与扩展.gen.cs的任何文件,并使其成为同名.sql文件的子工作的例子...

    public void ProjectItemFinishedGenerating(ProjectItem
        item)
    {
        string path = item.FileNames[0];
        string parentPath = null;
        if (path.EndsWith(".gen.cs"))
            parentPath = path.Replace(".gen.cs", ".sql");
        if (path.EndsWith("Results.cs"))
            parentPath = path.Replace("Results.cs", ".sql");
        if (!string.IsNullOrEmpty(parentPath))
        {
            ProjectItem parent = item.DTE.Solution.FindProjectItem(parentPath);
            if (parent == null)
                return;
                item.Remove();
                parent.ProjectItems.AddFromFile(path);
        }


    }

要附加的代码模板,你需要在你的.vstemplate文件这样的事情...

<WizardExtension>
    <Assembly>QueryFirst, Version=1.0.0.0, Culture=neutral, PublicKeyToken=4688a60b10e39f04</Assembly>
    <FullClassName>QueryFirst.WizardImplementation</FullClassName>
</WizardExtension>


文章来源: Nested Files in Item Template