我正在尝试创建一个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文件中创建自己。
我找到了以下howto,但我在使用Visual Studio 2010时遇到了麻烦。它写于2008年,这仍然适用吗?
答案 0 :(得分: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>
答案 1 :(得分:2)
有一种更简单的方法。您可以引入VS用于构造复合项目的同一向导。您可以通过在&lt; TemplateContent&gt; ...
之后在模板末尾添加元素来完成此操作<CustomParameters>
<CustomParameter Name="$ParentExtension$" Value=".xaml"/>
<CustomParameter Name="$ChildExtension$" Value=".cs"/>
</CustomParameters>
然后你需要告诉向导父项的扩展名和子项的扩展名......
{{1}}
此元素进入&lt; TemplateContent&gt;。
此解决方案已经过测试并在VS2012中运行,您可以在向导调用中看到硬编码的版本。如果您有版本问题,请查找文件webform.vstemplate(visual studio的.aspx模板),并启发自己。
答案 2 :(得分:0)
事实证明,同样的方法适用于VS 2010.需要一些改编,但这个Code Project article涵盖了基本的想法。
答案 3 :(得分:0)
您需要实现Microsoft.VisualStudio.TemplateWizard.IWizard interface,并编写一些代码以从项目中删除新项目并将其重新添加为另一项目的子项。以下是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>