1

我正在尝试创建一个 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>

我希望模板在解决方案资源管理器中显示时使用嵌套在主窗口文件中的 .vm.cs 文件创建自己。

我找到了以下方法,但我在使用 Visual Studio 2010 时遇到了麻烦。这是2008年写的,现在还适用吗?

代码项目文章

4

4 回答 4

6

其实很简单...

 <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>
于 2014-04-09T17:41:56.427 回答
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 模板),并启发自己。

于 2016-01-25T11:17:56.457 回答
0

事实证明,相同的方法适用于 VS 2010。需要进行一些调整,但这篇Code Project 文章涵盖了基本思想。

于 2012-10-16T12:53:43.810 回答
0

您需要实现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>
于 2017-05-04T18:00:23.577 回答