In this For Work blog entry, I am going to create a Visual Studio Item Template for a Windows Form. We have several patterns of forms that we need to create over and over again. I want to be able to create my own Form with all my setting set by default, include some standard controls and derive from my base class, etc.
I am not using Export Template because I want to see all the working parts.
The Process
Create a Starter Form
Create a form that has everything I want in my template in a WinForm project. In this case I will pretend that we created a WinForm called MyForm.cs.
Gather the Template Files together
I created a directory somewhere on the file system and copy the form’s source files into that directory. Add to those files an ico file and a new text files with a .vstemplate extension. So for my template, I would put the following files”
MyForm.cs | The Form’s code file. Not yet changed, will replace class name and namespace later. |
MyForm.Designer.cs | The Form’s designer code files. Will also need replace class name and namespace. |
MyForm.resx | (Optional) Form’s resources, In this example, I use this to set a different icon. |
BICYCLE.ICO | The Icon file that appears in the Add New Item dialog |
MyFormCS.vstemplate | Empty file. Will be the Template metadata file. |
Add/Replace Template Parameters in Source files
In the process Template Parameters are substituted with values created by the New Item Wizard when the new item is created. They are declared in the form of $parameter$
In my demo, I use the following Template Parameters:
rootnamespace | The full namespace of the item; “root” namespace suggests something different |
safeitemrootname | The name of the item (or class) being created. |
So given the following code:
using System; using System.Windows.Forms; namespace ItemTemplatePlayGround { public partial class MyForm : Form { public MyForm() { InitializeComponent(); } …
I change the code to read:
using System; using System.Windows.Forms; namespace $rootnamespace$ { public partial class $safeitemrootname$ : Form { public $safeitemrootname$() { InitializeComponent(); }
…
Fill out the .vstemplate file
The .vstemplate file contains most the metadata that Visual Studio needs use my template. Things like the name and description of the template, the icon that is displayed in the new New Item dialog, the project type, etc. It also contains a list of all the files that make up the templates and instructions on how to handle them. (NOTE: the physical location of the template file determines the Template’s “Language” and “Category”, so I can’t claim that it contains all the metadata).
Notice that Template Parameters appear in the .vstemplate file.
<VSTemplate Type="Item" Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"> <TemplateData> <Name>My Lame Form</Name> <Description>An empty Form</Description> <DefaultName>MyForm.cs</DefaultName> <ProjectType>CSharp</ProjectType> <Icon>BICYCLE.ico</Icon> </TemplateData> <TemplateContent> <ProjectItem TargetFileName="$fileinputname$.cs" ReplaceParameters="true" SubType="Form">MyForm.cs</ProjectItem> <ProjectItem TargetFileName="$fileinputname$.Designer.cs" ReplaceParameters="true">MyForm.Designer.cs</ProjectItem> <ProjectItem TargetFileName="$fileinputname$.Designer.resx" ReplaceParameters="true">MyForm.Designer.resx</ProjectItem> </TemplateContent> </VSTemplate>
I have chosen not to go over every detail of the .vstemplate file. There are denser articles on the web that cover them in painful detail.
The TempateData section gives data about the template as a whole. Name and Description are what you think they are. DefaultName is used to propose a name in the Add New Item dialog. ProjectType is the language of the item; either CSharp or VisualBasic. Icon refers to the icon (.ico) file that provides the icon next to the project type name in the New Item dialog.
The TemplateContent contains ProjectItem elements for each of the files in the template (except the icon file and the .vstemplate itself). If your project contains 5 files total, there should be 3 ProjectItem elements.
Within the ProjectItem element, the TargetFileName attribute is the name of the new file created by the template. ReplaceParameters determines if Template Parameters in this file are replaced. SubType determines the Visual Studio Editor used to design this file; you only need this attribute if this file uses a designer. The Element’s inner text represents the name of the file within the template itself. The element value is the before file name and the TargetFileName is the after.
Where are my template files?
The default your item template files are located in My Documents\Visual Studio 2008\Templates\ItemTemplates\Language. On my system, Visual Studio 2008 was looking in C:\Users\jacks\Documents\Visual Studio 2005\Templates\ItemTemplates. So, it is a good idea to make sure that Visual Studio is looking in the right place.
To check/change the template location: Tools => Options, select the Projects and Solutions group and the General tab.