<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="http://www.codeplex.com/rss.xsl"?><rss version="2.0"><channel><title>compositewpfshell Wiki &amp; Documentation Rss Feed</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Home</link><description>compositewpfshell Wiki Rss Description</description><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Home&amp;version=11</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt;The purpose of this project is to develop a standard WPF application shell using the Composite Application Guidance for WPF. This project will develop standards, patterns, and best practices for building composite applications using WPF.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Overview
&lt;/h1&gt;The Composite WPF Shell project builds on the Microsoft Patterns &amp;amp; Practices Composite Application Guidance for WPF. While the goal of the Composite Application Guidance project is to build a reusable framework for creating composite WPF-based applications, the goal of this project is to build a standard, reusable shell application based on the Composite Application Guidance, as well as a basic set of modules that provide reusable services for applications based on the shell.&lt;br /&gt; &lt;br /&gt;The application shell that is developed for this project is reusable for both commercial and noncommercial uses. The shell was developed using best practices and standard patterns in mind in order to give application developers a starting point for building their applications, without needing to spend additional time building a shell.&lt;br /&gt; &lt;br /&gt;This project was developed and contributed to the .NET developer community by consultants from &lt;a href="http://www.neudesic.com" class="externalLink"&gt;Neudesic&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Topics
&lt;/h1&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Users%20Guide&amp;amp;referringTitle=Home"&gt;Users Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Developer%20Information&amp;amp;referringTitle=Home"&gt;Developer Information&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Blog posts
&lt;/h1&gt;&lt;div class="rss"&gt;
	&lt;div class="accentbar"&gt;
		&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;ImaginaryRealities Software Company - Composite WPF Shell News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;
	&lt;/div&gt;&lt;div class="entry"&gt;
		&lt;div class="title"&gt;
			&lt;a href="http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx"&gt;New project: Composite WPF Shell&lt;/a&gt;
		&lt;/div&gt;&lt;div class="moreinfo"&gt;
			&lt;span class="date"&gt;Saturday, December 06, 2008&lt;/span&gt; &amp;nbsp;| &amp;nbsp;&lt;span class="source"&gt;From &lt;a href="http://www.imaginaryrealities.com/syndication.axd?category=91c2b02e-f654-47bd-b9b6-e0b9c8a83082" target="_blank"&gt;ImaginaryRealities Software Company - Composite WPF Shell&lt;/a&gt;&lt;/span&gt;
		&lt;/div&gt;&lt;p&gt;&lt;p&gt;
About a month ago, &lt;a href="http://davidpallmann.blogspot.com/" target="_blank"&gt;David Pallman&lt;/a&gt;, the leader of the Custom Application Development Practice Council at Neudesic, issued a call to action for more Neudesic consultants to give back to the community through open source &lt;a href="http://www.codeplex.com" target="_blank"&gt;CodePlex&lt;/a&gt; projects. So I answered his call, and I seem to be the only one at the moment. Nevertheless, I started the &lt;a href="http://www.codeplex.com/compositewpfshell" target="_blank"&gt;Composite WPF Shell&lt;/a&gt; project. Check it out.  
&lt;/p&gt;
&lt;p&gt;
The purpose of the Composite WPF Shell project is to capture a lot of the ideas, knowledge, and experiences that I&amp;rsquo;ve gained using the Microsoft Composite Application Guidance for WPF, or Prism, project. All of this knowledge is being incorporated into a starter shell project that can be used by others to build their composite applications. By starting off with my shell, developers will gain a lot of &amp;ldquo;out-of-the-box&amp;rdquo; features that they can reuse while focusing on delivering their application value and not spending a lot of time working on a shell. Hopefully I&amp;rsquo;ll also be able to convince clients to let me reuse it on their projects. 
&lt;/p&gt;
&lt;p&gt;
The Composite WPF Shell project has or will have a lot of features that others can learn from and build upon: 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Acceptance tests using &lt;a href="http://www.fitnesse.org" target="_blank"&gt;FitNesse&lt;/a&gt; and FitNesse.NET. As more WPF functionality will be built, application automation will be added using the &lt;a href="http://www.codeplex.com/white" target="_blank"&gt;White&lt;/a&gt; framework on CodePlex.&lt;/li&gt;
	&lt;li&gt;Full unit tests using xUnit.NET, including testing of user interface components in isolated application domains.&lt;/li&gt;
	&lt;li&gt;Workflow is fully integrated into the shell application. All user interface functionality will be driven through workflows that run on the client.&lt;/li&gt;
	&lt;li&gt;Integrated designer functionality will allow end-users to customize application workflows.&lt;/li&gt;
	&lt;li&gt;An add-in and extensibility architecture that will provide support for third-parties to extend applications based on the shell.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Over the next few weeks, I&amp;rsquo;ll be writing a lot more about the development of this project and explaining how to build new applications using the common shell as the basis for your applications. 
&lt;/p&gt;
&lt;div class="socialBookmarksContainer"&gt;&lt;a rel="nofollow" href="http://digg.com/submit/?url=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx" target="_blank" title="Digg It!"&gt;&lt;img src="///socialbookmarks/square/digg_24.png" style="border: 0;" alt="Digg It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx&amp;amp;title=New project: Composite WPF Shell" target="_blank" title="DZone It!"&gt;&lt;img src="///socialbookmarks/square/dzone_24.png" style="border: 0;" alt="DZone It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx" target="_blank" title="StumbleUpon"&gt;&lt;img src="///socialbookmarks/square/stumbleupon_24.png" style="border: 0;" alt="StumbleUpon" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://technorati.com/ping?url=http://www.imaginaryrealities.com/" target="_blank" title="Technorati"&gt;&lt;img src="///socialbookmarks/square/technorati_24.png" style="border: 0;" alt="Technorati" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://reddit.com/submit?url=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx&amp;amp;title=New project: Composite WPF Shell" target="_blank" title="Reddit"&gt;&lt;img src="///socialbookmarks/square/reddit_24.png" style="border: 0;" alt="Reddit" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://del.icio.us/post?url=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx&amp;amp;title=New project: Composite WPF Shell" target="_blank" title="Del.icio.us"&gt;&lt;img src="///socialbookmarks/square/delicious_24.png" style="border: 0;" alt="Del.icio.us" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.newsvine.com/_wine/save?u=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx" target="_blank"title="NewsVine"&gt;&lt;img src="///socialbookmarks/square/newsvine_24.png" style="border: 0;" alt="NewsVine" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://furl.net" target="_blank" title="Furl"&gt;&lt;img src="///socialbookmarks/square/furl_24.png" style="border: 0;" alt="Furl" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://blinklist.com/submit/" target="_blank" title="BlinkList"&gt;&lt;img src="///socialbookmarks/square/blinklist_24.png" style="border: 0;" alt="BlinkList" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div class="accentbar"&gt;
		&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;ImaginaryRealities Software Company - Composite WPF Shell News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;
	&lt;/div&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 06 Dec 2008 18:24:08 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20081206062408P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Home&amp;version=10</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt;The purpose of this project is to develop a standard WPF application shell using the Composite Application Guidance for WPF. This project will develop standards, patterns, and best practices for building composite applications using WPF.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Overview
&lt;/h1&gt;The Composite WPF Shell project builds on the Microsoft Patterns &amp;amp; Practices Composite Application Guidance for WPF. While the goal of the Composite Application Guidance project is to build a reusable framework for creating composite WPF-based applications, the goal of this project is to build a standard, reusable shell application based on the Composite Application Guidance, as well as a basic set of modules that provide reusable services for applications based on the shell.&lt;br /&gt; &lt;br /&gt;The application shell that is developed for this project is reusable for both commercial and noncommercial uses. The shell was developed using best practices and standard patterns in mind in order to give application developers a starting point for building their applications, without needing to spend additional time building a shell.&lt;br /&gt; &lt;br /&gt;This project was developed and contributed to the .NET developer community by consultants from &lt;a href="http://www.neudesic.com" class="externalLink"&gt;Neudesic&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Topics
&lt;/h1&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Users%20Guide&amp;amp;referringTitle=Home"&gt;Users Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Developer%20Information&amp;amp;referringTitle=Home"&gt;Developer Information&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Blog posts
&lt;/h1&gt;&lt;div class="rss"&gt;
	&lt;div class="accentbar"&gt;
		&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;ImaginaryRealities Software Company News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;
	&lt;/div&gt;&lt;div class="entry"&gt;
		&lt;div class="title"&gt;
			&lt;a href="http://www.imaginaryrealities.com/post/2008/12/06/Windows-Azure-Cloud-Computing-User-Group-starting-soon.aspx"&gt;Windows Azure Cloud Computing User Group starting soon&lt;/a&gt;
		&lt;/div&gt;&lt;div class="moreinfo"&gt;
			&lt;span class="date"&gt;Saturday, December 06, 2008&lt;/span&gt; &amp;nbsp;| &amp;nbsp;&lt;span class="source"&gt;From &lt;a href="http://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082" target="_blank"&gt;ImaginaryRealities Software Company&lt;/a&gt;&lt;/span&gt;
		&lt;/div&gt;&lt;p&gt;&lt;p&gt;On Thursday, December 11th, the Phoenix Neudesic office is hosting the first Cloud Computing User Group meeting based around the Microsoft Windows Azure technologies. If you’re interested in attending, here’s the link to the invite: &lt;a title="https://www.clicktoattend.com/invitation.aspx?code=133685" href="https://www.clicktoattend.com/invitation.aspx?code=133685"&gt;https://www.clicktoattend.com/invitation.aspx?code=133685&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Cloud Computing using Microsoft technologies is a new area that Neudesic is trying to push into and lead the way. Here in the local Phoenix area, I can see that we’ll be pushing a lot of cloud computing initiatives to our customers in 2009 as the technology gets closer to production use.&lt;/p&gt;  &lt;p&gt;I’ve volunteered to lead the local user group for at least the beginning. I won’t be at the first meeting, however, as I’ll be travelling to California for a weekend getaway, but David Pallmann will be introducing the Windows Azure platform.&lt;/p&gt;  &lt;p&gt;While the initial focus will be on Microsoft technologies, I do have to admit that I am quite interested in other cloud computing technologies, so I may see how to get those involved in this as well.&lt;/p&gt;  &lt;p&gt;If you have any question about the upcoming user group, send me an email and let me know.&lt;/p&gt;&lt;div class="socialBookmarksContainer"&gt;&lt;a rel="nofollow" href="http://digg.com/submit/?url=http://www.imaginaryrealities.com/post/2008/12/06/Windows-Azure-Cloud-Computing-User-Group-starting-soon.aspx" target="_blank" title="Digg It!"&gt;&lt;img src="///socialbookmarks/square/digg_24.png" style="border: 0;" alt="Digg It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http://www.imaginaryrealities.com/post/2008/12/06/Windows-Azure-Cloud-Computing-User-Group-starting-soon.aspx&amp;amp;title=Windows Azure Cloud Computing User Group starting soon" target="_blank" title="DZone It!"&gt;&lt;img src="///socialbookmarks/square/dzone_24.png" style="border: 0;" alt="DZone It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http://www.imaginaryrealities.com/post/2008/12/06/Windows-Azure-Cloud-Computing-User-Group-starting-soon.aspx" target="_blank" title="StumbleUpon"&gt;&lt;img src="///socialbookmarks/square/stumbleupon_24.png" style="border: 0;" alt="StumbleUpon" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://technorati.com/ping?url=http://www.imaginaryrealities.com/" target="_blank" title="Technorati"&gt;&lt;img src="///socialbookmarks/square/technorati_24.png" style="border: 0;" alt="Technorati" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://reddit.com/submit?url=http://www.imaginaryrealities.com/post/2008/12/06/Windows-Azure-Cloud-Computing-User-Group-starting-soon.aspx&amp;amp;title=Windows Azure Cloud Computing User Group starting soon" target="_blank" title="Reddit"&gt;&lt;img src="///socialbookmarks/square/reddit_24.png" style="border: 0;" alt="Reddit" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://del.icio.us/post?url=http://www.imaginaryrealities.com/post/2008/12/06/Windows-Azure-Cloud-Computing-User-Group-starting-soon.aspx&amp;amp;title=Windows Azure Cloud Computing User Group starting soon" target="_blank" title="Del.icio.us"&gt;&lt;img src="///socialbookmarks/square/delicious_24.png" style="border: 0;" alt="Del.icio.us" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.newsvine.com/_wine/save?u=http://www.imaginaryrealities.com/post/2008/12/06/Windows-Azure-Cloud-Computing-User-Group-starting-soon.aspx" target="_blank"title="NewsVine"&gt;&lt;img src="///socialbookmarks/square/newsvine_24.png" style="border: 0;" alt="NewsVine" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://furl.net" target="_blank" title="Furl"&gt;&lt;img src="///socialbookmarks/square/furl_24.png" style="border: 0;" alt="Furl" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://blinklist.com/submit/" target="_blank" title="BlinkList"&gt;&lt;img src="///socialbookmarks/square/blinklist_24.png" style="border: 0;" alt="BlinkList" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div class="entry"&gt;
		&lt;div class="title"&gt;
			&lt;a href="http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx"&gt;New project: Composite WPF Shell&lt;/a&gt;
		&lt;/div&gt;&lt;div class="moreinfo"&gt;
			&lt;span class="date"&gt;Saturday, December 06, 2008&lt;/span&gt; &amp;nbsp;| &amp;nbsp;&lt;span class="source"&gt;From &lt;a href="http://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082" target="_blank"&gt;ImaginaryRealities Software Company&lt;/a&gt;&lt;/span&gt;
		&lt;/div&gt;&lt;p&gt;&lt;p&gt;
About a month ago, &lt;a href="http://davidpallmann.blogspot.com/" target="_blank"&gt;David Pallman&lt;/a&gt;, the leader of the Custom Application Development Practice Council at Neudesic, issued a call to action for more Neudesic consultants to give back to the community through open source &lt;a href="http://www.codeplex.com" target="_blank"&gt;CodePlex&lt;/a&gt; projects. So I answered his call, and I seem to be the only one at the moment. Nevertheless, I started the &lt;a href="http://www.codeplex.com/compositewpfshell" target="_blank"&gt;Composite WPF Shell&lt;/a&gt; project. Check it out.  
&lt;/p&gt;
&lt;p&gt;
The purpose of the Composite WPF Shell project is to capture a lot of the ideas, knowledge, and experiences that I&amp;rsquo;ve gained using the Microsoft Composite Application Guidance for WPF, or Prism, project. All of this knowledge is being incorporated into a starter shell project that can be used by others to build their composite applications. By starting off with my shell, developers will gain a lot of &amp;ldquo;out-of-the-box&amp;rdquo; features that they can reuse while focusing on delivering their application value and not spending a lot of time working on a shell. Hopefully I&amp;rsquo;ll also be able to convince clients to let me reuse it on their projects. 
&lt;/p&gt;
&lt;p&gt;
The Composite WPF Shell project has or will have a lot of features that others can learn from and build upon: 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Acceptance tests using &lt;a href="http://www.fitnesse.org" target="_blank"&gt;FitNesse&lt;/a&gt; and FitNesse.NET. As more WPF functionality will be built, application automation will be added using the &lt;a href="http://www.codeplex.com/white" target="_blank"&gt;White&lt;/a&gt; framework on CodePlex.&lt;/li&gt;
	&lt;li&gt;Full unit tests using xUnit.NET, including testing of user interface components in isolated application domains.&lt;/li&gt;
	&lt;li&gt;Workflow is fully integrated into the shell application. All user interface functionality will be driven through workflows that run on the client.&lt;/li&gt;
	&lt;li&gt;Integrated designer functionality will allow end-users to customize application workflows.&lt;/li&gt;
	&lt;li&gt;An add-in and extensibility architecture that will provide support for third-parties to extend applications based on the shell.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Over the next few weeks, I&amp;rsquo;ll be writing a lot more about the development of this project and explaining how to build new applications using the common shell as the basis for your applications. 
&lt;/p&gt;
&lt;div class="socialBookmarksContainer"&gt;&lt;a rel="nofollow" href="http://digg.com/submit/?url=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx" target="_blank" title="Digg It!"&gt;&lt;img src="///socialbookmarks/square/digg_24.png" style="border: 0;" alt="Digg It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx&amp;amp;title=New project: Composite WPF Shell" target="_blank" title="DZone It!"&gt;&lt;img src="///socialbookmarks/square/dzone_24.png" style="border: 0;" alt="DZone It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx" target="_blank" title="StumbleUpon"&gt;&lt;img src="///socialbookmarks/square/stumbleupon_24.png" style="border: 0;" alt="StumbleUpon" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://technorati.com/ping?url=http://www.imaginaryrealities.com/" target="_blank" title="Technorati"&gt;&lt;img src="///socialbookmarks/square/technorati_24.png" style="border: 0;" alt="Technorati" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://reddit.com/submit?url=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx&amp;amp;title=New project: Composite WPF Shell" target="_blank" title="Reddit"&gt;&lt;img src="///socialbookmarks/square/reddit_24.png" style="border: 0;" alt="Reddit" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://del.icio.us/post?url=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx&amp;amp;title=New project: Composite WPF Shell" target="_blank" title="Del.icio.us"&gt;&lt;img src="///socialbookmarks/square/delicious_24.png" style="border: 0;" alt="Del.icio.us" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.newsvine.com/_wine/save?u=http://www.imaginaryrealities.com/post/2008/12/06/New-project-Composite-WPF-Shell.aspx" target="_blank"title="NewsVine"&gt;&lt;img src="///socialbookmarks/square/newsvine_24.png" style="border: 0;" alt="NewsVine" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://furl.net" target="_blank" title="Furl"&gt;&lt;img src="///socialbookmarks/square/furl_24.png" style="border: 0;" alt="Furl" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://blinklist.com/submit/" target="_blank" title="BlinkList"&gt;&lt;img src="///socialbookmarks/square/blinklist_24.png" style="border: 0;" alt="BlinkList" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div class="entry"&gt;
		&lt;div class="title"&gt;
			&lt;a href="http://www.imaginaryrealities.com/post/2008/12/06/I-passed-the-WPF-certification-exam.aspx"&gt;I passed the WPF certification exam&lt;/a&gt;
		&lt;/div&gt;&lt;div class="moreinfo"&gt;
			&lt;span class="date"&gt;Saturday, December 06, 2008&lt;/span&gt; &amp;nbsp;| &amp;nbsp;&lt;span class="source"&gt;From &lt;a href="http://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082" target="_blank"&gt;ImaginaryRealities Software Company&lt;/a&gt;&lt;/span&gt;
		&lt;/div&gt;&lt;p&gt;&lt;p&gt;On Thursday I took the Microsoft Technical Specialist certification exam for Windows Presentation Foundation. It was a very tough test. I think it was tougher than the .NET 2.0 Foundation exam which I took last year. I was interested in taking the exam to see if I knew as much as I thought that I did, and I thought that it would be a good marketing thing for the Phoenix Neudesic office to be able to claim at least one WPF-capable consultant in the office. I got an 88% on the test which is a lot better than I thought that I did. &lt;/p&gt;  &lt;p&gt;When I take tests like this, where all of the questions are multiple choice, I usually write down the questions that I want to review because I wasn’t sure of the answer, or that I knew that I used the wrong answer for. Then at the end of the test, I’ll circle back around and correct the answers or review the questions in more detail. With 51 questions, I knew that I could miss 14 and still pass, but after my initial pass through the test, I had at least 21 questions marked down to review. I was sweating bullets. Fortunately, upon further review, most of the questions had the correct answers, so there wasn’t much to worry about. I’m guessing that I missed 6 questions from my score. I did get all of the ClickOnce questions correctly which surprised me.&lt;/p&gt;  &lt;p&gt;Next up, studying for the Workflow Foundation certification test.&lt;/p&gt;&lt;div class="socialBookmarksContainer"&gt;&lt;a rel="nofollow" href="http://digg.com/submit/?url=http://www.imaginaryrealities.com/post/2008/12/06/I-passed-the-WPF-certification-exam.aspx" target="_blank" title="Digg It!"&gt;&lt;img src="///socialbookmarks/square/digg_24.png" style="border: 0;" alt="Digg It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http://www.imaginaryrealities.com/post/2008/12/06/I-passed-the-WPF-certification-exam.aspx&amp;amp;title=I passed the WPF certification exam" target="_blank" title="DZone It!"&gt;&lt;img src="///socialbookmarks/square/dzone_24.png" style="border: 0;" alt="DZone It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http://www.imaginaryrealities.com/post/2008/12/06/I-passed-the-WPF-certification-exam.aspx" target="_blank" title="StumbleUpon"&gt;&lt;img src="///socialbookmarks/square/stumbleupon_24.png" style="border: 0;" alt="StumbleUpon" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://technorati.com/ping?url=http://www.imaginaryrealities.com/" target="_blank" title="Technorati"&gt;&lt;img src="///socialbookmarks/square/technorati_24.png" style="border: 0;" alt="Technorati" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://reddit.com/submit?url=http://www.imaginaryrealities.com/post/2008/12/06/I-passed-the-WPF-certification-exam.aspx&amp;amp;title=I passed the WPF certification exam" target="_blank" title="Reddit"&gt;&lt;img src="///socialbookmarks/square/reddit_24.png" style="border: 0;" alt="Reddit" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://del.icio.us/post?url=http://www.imaginaryrealities.com/post/2008/12/06/I-passed-the-WPF-certification-exam.aspx&amp;amp;title=I passed the WPF certification exam" target="_blank" title="Del.icio.us"&gt;&lt;img src="///socialbookmarks/square/delicious_24.png" style="border: 0;" alt="Del.icio.us" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.newsvine.com/_wine/save?u=http://www.imaginaryrealities.com/post/2008/12/06/I-passed-the-WPF-certification-exam.aspx" target="_blank"title="NewsVine"&gt;&lt;img src="///socialbookmarks/square/newsvine_24.png" style="border: 0;" alt="NewsVine" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://furl.net" target="_blank" title="Furl"&gt;&lt;img src="///socialbookmarks/square/furl_24.png" style="border: 0;" alt="Furl" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://blinklist.com/submit/" target="_blank" title="BlinkList"&gt;&lt;img src="///socialbookmarks/square/blinklist_24.png" style="border: 0;" alt="BlinkList" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div class="entry"&gt;
		&lt;div class="title"&gt;
			&lt;a href="http://www.imaginaryrealities.com/post/2008/12/06/Back-to-Blogging.aspx"&gt;Back to Blogging&lt;/a&gt;
		&lt;/div&gt;&lt;div class="moreinfo"&gt;
			&lt;span class="date"&gt;Saturday, December 06, 2008&lt;/span&gt; &amp;nbsp;| &amp;nbsp;&lt;span class="source"&gt;From &lt;a href="http://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082" target="_blank"&gt;ImaginaryRealities Software Company&lt;/a&gt;&lt;/span&gt;
		&lt;/div&gt;&lt;p&gt;&lt;p&gt;I have been admittedly bad at blogging for the past couple of months. So the choice is that I either pick it back up again, or abandon it altogether. I’m not going to do the latter, so I better start blogging again. I think that I need to put an appointment on my calendar every day to write at least one blog post. What’s my excuse? Work and life, of course. Just too much going on between studying, client projects, work projects, etc.&lt;/p&gt;  &lt;p&gt;But now I’m back. And I will start blogging regularly once again.&lt;/p&gt;&lt;div class="socialBookmarksContainer"&gt;&lt;a rel="nofollow" href="http://digg.com/submit/?url=http://www.imaginaryrealities.com/post/2008/12/06/Back-to-Blogging.aspx" target="_blank" title="Digg It!"&gt;&lt;img src="///socialbookmarks/square/digg_24.png" style="border: 0;" alt="Digg It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http://www.imaginaryrealities.com/post/2008/12/06/Back-to-Blogging.aspx&amp;amp;title=Back to Blogging" target="_blank" title="DZone It!"&gt;&lt;img src="///socialbookmarks/square/dzone_24.png" style="border: 0;" alt="DZone It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http://www.imaginaryrealities.com/post/2008/12/06/Back-to-Blogging.aspx" target="_blank" title="StumbleUpon"&gt;&lt;img src="///socialbookmarks/square/stumbleupon_24.png" style="border: 0;" alt="StumbleUpon" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://technorati.com/ping?url=http://www.imaginaryrealities.com/" target="_blank" title="Technorati"&gt;&lt;img src="///socialbookmarks/square/technorati_24.png" style="border: 0;" alt="Technorati" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://reddit.com/submit?url=http://www.imaginaryrealities.com/post/2008/12/06/Back-to-Blogging.aspx&amp;amp;title=Back to Blogging" target="_blank" title="Reddit"&gt;&lt;img src="///socialbookmarks/square/reddit_24.png" style="border: 0;" alt="Reddit" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://del.icio.us/post?url=http://www.imaginaryrealities.com/post/2008/12/06/Back-to-Blogging.aspx&amp;amp;title=Back to Blogging" target="_blank" title="Del.icio.us"&gt;&lt;img src="///socialbookmarks/square/delicious_24.png" style="border: 0;" alt="Del.icio.us" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.newsvine.com/_wine/save?u=http://www.imaginaryrealities.com/post/2008/12/06/Back-to-Blogging.aspx" target="_blank"title="NewsVine"&gt;&lt;img src="///socialbookmarks/square/newsvine_24.png" style="border: 0;" alt="NewsVine" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://furl.net" target="_blank" title="Furl"&gt;&lt;img src="///socialbookmarks/square/furl_24.png" style="border: 0;" alt="Furl" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://blinklist.com/submit/" target="_blank" title="BlinkList"&gt;&lt;img src="///socialbookmarks/square/blinklist_24.png" style="border: 0;" alt="BlinkList" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div class="entry"&gt;
		&lt;div class="title"&gt;
			&lt;a href="http://www.imaginaryrealities.com/post/2008/09/14/Customizing-the-look-of-a-web-site-using-ASPNET-themes.aspx"&gt;Customizing the look of a web site using ASP.NET themes&lt;/a&gt;
		&lt;/div&gt;&lt;div class="moreinfo"&gt;
			&lt;span class="date"&gt;Sunday, September 14, 2008&lt;/span&gt; &amp;nbsp;| &amp;nbsp;&lt;span class="source"&gt;From &lt;a href="http://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082" target="_blank"&gt;ImaginaryRealities Software Company&lt;/a&gt;&lt;/span&gt;
		&lt;/div&gt;&lt;p&gt;&lt;p&gt;In this post, I'll continue my discussion of the construction of a new web site for ImaginaryRealities.com by discussing how I'm going to use ASP.NET themes to style and configure the &amp;quot;look&amp;quot; for my new web site. ASP.NET 2.0 introduced a new feature called themes which allows responsibilities on a web site to be truly separated between a developer that implements functionality and a designer that implements style. Using themes, the same web site can take on several different looks through a simple modification of the Web.config or application setting in a production environment. New looks can also be easily developed and deployed without making modifications to the existing web site. This post will discuss what ASP.NET themes are, how they work, and how they can be used in an ASP.NET web site or application. &lt;/p&gt;  &lt;h2&gt;What are ASP.NET themes?&lt;/h2&gt;  &lt;p&gt;An ASP.NET theme is basically a collection of files called &lt;strong&gt;skins&lt;/strong&gt;, CSS style sheets, and other theme-based resources such as images, icons, and backdrops that are used to style a web site. In ASP.NET, there are two types of themes: &lt;strong&gt;themes&lt;/strong&gt; and &lt;strong&gt;style sheet themes&lt;/strong&gt;. It's a confusing concept, but it will make sense in a moment. The important thing to know is that themes and style sheet themes are the same, but ASP.NET applies them differently depending on what theme is specified as the theme, and what theme is specified as a style sheet theme. I'll revisit this topic and explain themes and style sheet themes in a moment. First, let's look at what's in a theme.&lt;/p&gt;  &lt;p&gt;The first item that goes into an ASP.NET theme is usually a theme-specific CSS style sheet. Actually, a theme can have more than one CSS style sheet, but if you create multiple style sheets for your theme, you should know that ASP.NET automatically adds the style sheets in alphabetical order. This is important, for example, if you define one style sheet to control or modify the structure and layout of the document, and another style sheet that has colors and background images. A typical strategy that I employ is to prefix the style sheet's file name with a number indicating the order of inclusion. For example, I may have the following style sheets defined for my theme.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;01_Layouts.css &lt;/li&gt;    &lt;li&gt;02_Styles.css &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The second item that goes into an ASP.NET theme are files called skins. A skin file has a &lt;strong&gt;.skin&lt;/strong&gt; extension and contains markup for ASP.NET controls. At run time, ASP.NET will use the control definitions in a skin and will merge the skin definitions with the control definitions in a user control, page, or master page. This allows the designer to set style-specific attributes on an ASP.NET control in a skin, and let the developer specify the functional aspects of the control in the ASP.NET page or user control.&lt;/p&gt;  &lt;p&gt;Let's see an example of a skin in action. Most web sites will have some kind of logo in the upper left-hand corner of the web page. If the user clicks on the logo, they will typically be taken back to the home page of the web site. It's kind of a universal fail-safe if the user ever gets lost in the vast web of a large web site. In an ASP.NET page or master page, the developer may insert the following control definition for a hyperlink:&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:52c4d705-bebe-466b-b253-297372e8cae3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;asp:HyperLink ID="LogoLink" runat="server" SkinID="Logo"
        NavigateUrl="~/Default.aspx"
        Text="Return to the ImaginaryRealities.com home page" 
        ToolTip="Return to the ImaginaryRealities.com home page"
        meta:resourcekey="LogoLink" /&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(Notice the &lt;strong&gt;meta:resourcekey&lt;/strong&gt; attribute that will be used for globalizing the web page that we discussed in my &lt;a title="Globalizing ASP.NET web sites" href="http://www.imaginaryrealities.com/post/2008/09/13/Globalizing-ASPNET-web-sites.aspx" target="_blank"&gt;last post&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;This ASP.NET fragment uses the &lt;strong&gt;HyperLink&lt;/strong&gt; control to specify a hyperlink that will take the user back to the home page of the web site. It's great, but it's not the logo that I had in mind. When I view it in my development environment with the raw, non-styled HTML, I'll see the link &lt;em&gt;Return to the ImaginaryRealities.com home page&lt;strong&gt; &lt;/strong&gt;&lt;/em&gt;instead of a cool ImaginaryRealities Software Company logo.&lt;/p&gt;

&lt;p&gt;Later in the development phase for the web site, a designer (or me in a designer role) can sit down and create a skin for this hyperlink control that will use the new logo that I designed for my new web site (when I actually learn to design something cool). Here's what the skin would look like:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:713c9644-7682-44a6-8470-1d9f9a2c6bce" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;asp:HyperLink runat="server" SkinID="Logo"
        ImageUrl="Images/ImaginaryRealitiesLogo.png"/&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The key to this skin and the above control fragment is the &lt;strong&gt;SkinID&lt;/strong&gt; attribute. Notice how the two &lt;strong&gt;SkinID&lt;/strong&gt; values match? If I defined a &lt;strong&gt;HyperLink&lt;/strong&gt; skin without specifying the &lt;strong&gt;SkinID&lt;/strong&gt; attribute for it, then all of my hyperlinks on the page (the hyperlinks created with the &lt;strong&gt;HyperLink&lt;/strong&gt; control and not normal, non-ASP.NET &lt;strong&gt;&amp;lt;A&amp;gt;&lt;/strong&gt; tags) would appear as my web site logo. A skin control specified without a &lt;strong&gt;SkinID&lt;/strong&gt; attribute is called a generic skin because it is the default skin that is applied to all controls of that type. Generic skins could be useful if you wanted to apply a specific CSS style or class to all &lt;strong&gt;HyperLink&lt;/strong&gt; controls in your document.&lt;/p&gt;

&lt;p&gt;The third component of ASP.NET themes are called resources. A resource is basically a file such as an image or icon that is used for a theme. Let's say that I wanted to create a normal theme that my web site would regularly use, but I would like to change the colors and the look for major holidays such as the 4th of July, Halloween, Thanksgiving, Christmas, and St. Patrick's Day (since I'm an Irish-American of course). For the 4th of July, I want my logo to be shown with fireworks and the U.S. flag. For Halloween, I want more of an orange-color theme and I want to put a pumpkin on the logo. For Thanksgiving, I want a turkey prominently displayed around the logo. For Christmas, I want to use red and green colors and have presents, a Christmas Tree, Santa Claus, and a fireplace around my logo. And for St. Patrick's Day, I want to have more of an emerald green theme with shamrocks on my logo and a leprechaun sitting on top of it, drinking a pint of beer. I can do this by including these specific logo images in each of my themes, and then using a relative reference to the image in my skins just like I did in the above example.&lt;/p&gt;

&lt;p&gt;Back now to the different kinds of themes that ASP.NET supports. There's actually a third theme that I didn't tell you about yet. That is a &lt;strong&gt;global theme&lt;/strong&gt;. Global themes are installed in a global location on a web server and are accessible to all ASP.NET applications to use. I'm not really going to discuss installing and using global themes, because my web site is hosted on a third-party web hosting provider (&lt;a title="WebHost4Life" href="http://www.webhost4life.com" target="_blank"&gt;WebHost4Life&lt;/a&gt;), and I can't install or have any control over the global themes. However, it is important to understand how global themes play in the ASP.NET theme engine because themes have an order of precedence.&lt;/p&gt;

&lt;p&gt;When using ASP.NET themes, especially given so many choices as to where to put style information, there can be conflicts. What happens if you specify the color for a &lt;strong&gt;HyperLink&lt;/strong&gt; in three places: on the style sheet theme, on the page, and on the application theme? Which definition wins? That is determined by the order of precedence:&lt;/p&gt;

&lt;p&gt;&lt;a title="Order of precedence for ASP.NET themes" href="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/Customizingthelookofawebsiteus.NETthemes_6CDB/image_2.png" rel="lightbox"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="image" src="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/Customizingthelookofawebsiteus.NETthemes_6CDB/image_thumb.png" width="202" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Style sheet themes provide the initial value for control properties containing theme and style information. ASP.NET will also apply CSS style sheets in a style sheet theme before any other styles are applied to a page. ASP.NET will accomplish this by adding the CSS style sheets in a style sheet theme to the beginning of the &lt;strong&gt;&amp;lt;HEAD&amp;gt;&lt;/strong&gt; element in the rendered HTML page.&lt;/p&gt;

&lt;p&gt;Once the style sheet theme has been applied, then ASP.NET will apply the CSS styles and control settings in the page. Style settings in the ASP.NET master pages, page, or user controls will override settings that have been set in the style sheet theme's CSS style sheets or skins.&lt;/p&gt;

&lt;p&gt;Third, ASP.NET will apply the CSS style sheets and skins in the application theme. CSS styles or control settings in the application theme will override any competing settings in either the style sheet theme, master page, page, or user control. ASP.NET will include the CSS style sheets in the application theme at the end of the &lt;strong&gt;&amp;lt;HEAD&amp;gt;&lt;/strong&gt; element to ensure that the CSS styles in the application theme will override CSS styles defined in either the style sheet theme or the page.&lt;/p&gt;

&lt;p&gt;Finally, if a global ASP.NET theme has been defined on the web server or by the hosting provider (which is unusual), then the skin settings and CSS style sheets will override the competing settings in either the style sheet theme, page, or application theme.&lt;/p&gt;

&lt;h2&gt;Cascading style sheets&lt;/h2&gt;

&lt;p&gt;Before moving on to actually using themes, I want to revisit one of the most important concepts in CSS: the cascade. Remember that CSS is an acronym for &lt;strong&gt;Cascading Style Sheets&lt;/strong&gt;. What this means is that if multiple styles or style sheets are defined, then there are rules for which styles take precedence. You may be thinking that you'll only define a single CSS style sheet for your web application so that you won't have to deal with cascades or conflicting rules, but you'll actually never be able to avoid it. That's because browsers specify their own style sheet and users can apply their own style sheet to customize the look of web pages in their browser. An example of the latter case is a user that has vision problems and wants larger body text on web sites to reduce strain on his eyes.&lt;/p&gt;

&lt;p&gt;SitePoint has a &lt;a title="The Cascade" href="http://reference.sitepoint.com/css/cascade" target="_blank"&gt;good article&lt;/a&gt; that fully explains the process of &amp;quot;the cascade,&amp;quot; but here's a brief summary. Browsers classify style sheets into three categories: &lt;strong&gt;user agent style sheets, author style sheets, and user style sheets&lt;/strong&gt;. User agent style sheets define the default representation of HTML in a browser and are provided by the browser manufacturer. Internet Explorer's style sheet is going to be different than the style sheets for Firefox, Opera, and Safari. The default style sheets are usually designed to maximize the performance and look of pages in the selected web browser. Some browsers, such as Internet Explorer, will also let users apply their own style sheet to customize the default style sheet. This would be done for the purpose that I described earlier. Finally, author style sheets are defined by the web site author or designer to maximize the look of the web site such as the color schemes or to apply branding to the site. Also remember that web site authors can specify multiple style sheets for an application that may contain conflicting styles.&lt;/p&gt;

&lt;p&gt;The first step of rendering web pages in a browser is for a browser to take each HTML element in a web page and find all of the applicable styles that could apply to that element from the three sources of CSS styles. If there are no conflicts between the difference CSS style sheet sources, then the browser's job is easy and the browser can apply the selected styles to the HTML element. However, if there are conflicts, the process gets a little bit trickier.&lt;/p&gt;

&lt;p&gt;The next step for the browser, if there are conflicts, is to sort the applicable CSS styles based on their origin and level of importance. Importance is determined by whether a CSS style is specified using &lt;a title="!important Declarations" href="http://reference.sitepoint.com/css/importantdeclarations" target="_blank"&gt;the &lt;strong&gt;!important&lt;/strong&gt; modifier&lt;/a&gt;. If a CSS style has the &lt;strong&gt;!important&lt;/strong&gt; modifier, then the CSS style is considered an &lt;strong&gt;important declaration&lt;/strong&gt;, otherwise the CSS style is a &lt;strong&gt;normal declaration&lt;/strong&gt;. CSS styles are sorted in the following order (1 being the highest priority and 5 being the lowest):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Important declarations in user style sheets &lt;/li&gt;

  &lt;li&gt;Important declarations in author style sheets &lt;/li&gt;

  &lt;li&gt;Normal declarations in author style sheets &lt;/li&gt;

  &lt;li&gt;Normal declarations in user style sheets &lt;/li&gt;

  &lt;li&gt;User agent declarations &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What's important to see here is that important declarations in a user style sheet trump all other style definitions. So, if a user really wants your body text to be in a 48-point Times New Roman font, then it's going to be that way if the user applies the &lt;strong&gt;!important&lt;/strong&gt; modified to his custom CSS. There's nothing that you can do about it.&lt;/p&gt;

&lt;p&gt;What happens, if after this sorting, we still have a conflict? What if we have two conflicting rules at the same priority? We go to the third step in the cascading process: &lt;strong&gt;&lt;a title="Specificity" href="http://reference.sitepoint.com/css/specificity" target="_blank"&gt;specificity&lt;/a&gt;&lt;/strong&gt;. Specificity states that &amp;quot;when two or more declarations that apply to the same element, and set the same property, have the same importance and origin, the declaration with the most specific selector will take precedence (SitePoint, &lt;a title="http://reference.sitepoint.com/css/specificity" href="http://reference.sitepoint.com/css/specificity"&gt;http://reference.sitepoint.com/css/specificity&lt;/a&gt;).&amp;quot;&lt;/p&gt;

&lt;p&gt;Specificity is a math-based calculation to determine which CSS style is more specific to the HTML element being styled. First, the web browser will look at the HTML element to see if an inline &lt;strong&gt;style&lt;/strong&gt; attribute is specified. This can also be done in an ASP.NET control using the &lt;strong&gt;Style&lt;/strong&gt; property on the control, if it is supported. If an inline CSS style is specified, then that style is used. For example:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c504a99b-1448-43d6-9b53-9b949b0b9bc6" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;p style="font-size: 48px;"&amp;gt;This text is 48 pixels tall!&amp;lt;/p&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The above HTML fragment will have text that is 48 pixels in height. If the HTML element does not have an inline &lt;strong&gt;style&lt;/strong&gt; attribute, then the next step in the process is to look at the CSS rules and count the number of matching &lt;strong&gt;id&lt;/strong&gt; elements between the CSS rule and HTML element. Let's use the following HTML fragment for this example:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b8c000b8-7335-43a6-8e73-bb92cd2adf98" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;div id="doc4" class="yui-t2"&amp;gt;
    &amp;lt;div id="hd"&amp;gt;
        &amp;lt;div id="masthead"&amp;gt;...&amp;lt;/div&amp;gt;
        &amp;lt;div id="navigationBar"&amp;gt;
            &amp;lt;div id="navigation"&amp;gt;...&amp;lt;/div&amp;gt;
            &amp;lt;div id="search"&amp;gt;...&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div id="bd"&amp;gt;
        &amp;lt;div id="introduction"&amp;gt;...&amp;lt;/div&amp;gt;
        &amp;lt;div id="body"&amp;gt;....&amp;lt;/div&amp;gt;
        &amp;lt;div id="conclusion"&amp;gt;...&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Let's also create a CSS style sheet for this HTML document:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ad03a63e-c8d3-460c-a716-c03afa99c575" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="css"&gt;#doc4
{
    font: normal normal normal 12px Arial;
}

#introduction
{
    font: normal normal bold 16px "Times New Roman";
}

#bd #introduction
{
    font: italic normal normal 14px Verdana;
}

#doc4 #bd #introduction
{
    font: italic normal bold 10px Georgia;
}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;According to the rules of specificity, the 4th rule (&lt;strong&gt;#doc4 #bd #introduction)&lt;/strong&gt; is the most specific because it has the highest count of matching ID selectors. The next most specific rule would be the third rule (&lt;strong&gt;#bd #introduction)&lt;/strong&gt;, and the first two rules would have the same level of specificity. If two or more rules exist with the same level of specificity, or if there are no matching rules with &lt;strong&gt;id&lt;/strong&gt; selectors, then the next step is to do the same thing with &lt;strong&gt;class selectors&lt;/strong&gt;, &lt;strong&gt;attribute selectors&lt;/strong&gt;, and &lt;strong&gt;pseudo-classes&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3c22e826-b781-42e5-bed9-bfbb9df0dac8" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="css"&gt;/* class selector */
.bodyText { ... }

/* attribute selector */
input[type="submit"] { ... }

/* pseudo-selector */
a:hover { ... }&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;If a conflict still exists, then the final step in specificity is to count the number of matching &lt;strong&gt;element type selectors&lt;/strong&gt; (for example, DIV, INPUT, P, etc.) and &lt;strong&gt;pseudo-elements&lt;/strong&gt; (for example, &lt;strong&gt;first-letter&lt;/strong&gt;, &lt;strong&gt;first-line&lt;/strong&gt;, etc.).&lt;/p&gt;

&lt;p&gt;If after all of these steps there are still conflicts, then the decision is simple. Whichever CSS rule is specified last is the winner. This also plays into how ASP.NET themes work in regards to what order CSS style sheets are included in a page. Style sheet theme CSS files are always included at the beginning of the &lt;strong&gt;&amp;lt;HEAD&amp;gt;&lt;/strong&gt; element, followed by CSS style sheets specified by the page or master page. Application theme CSS files are then included at the end of the &lt;strong&gt;&amp;lt;HEAD&amp;gt;&lt;/strong&gt; element, followed by CSS style sheets from the global theme. Therefore, the rules of theme precedence also correspond to the rules of CSS cascades.&lt;/p&gt;

&lt;p&gt;The reason for reviewing how CSS cascades work is important if you use style sheet themes, because you need to have a very high level of specificity in your style sheet theme CSS files to counter lower-level CSS styles in CSS style sheets that are imported later in the process. In my earlier posts, I designed my web site using the Yahoo! User Interface Library's Reset CSS style sheet that neutralizes the differences in the default browser style sheets in order to implement a common default look to web pages. If I try to set a background color in a style sheet theme CSS file by only specifying the &lt;strong&gt;BODY&lt;/strong&gt; tag selector, this rule will be overridden by the Reset CSS definition that clears the page background. However, if I use the &lt;strong&gt;id&lt;/strong&gt; for my &lt;strong&gt;BODY&lt;/strong&gt; tag (remember, it's &lt;strong&gt;www-imaginaryrealities-com&lt;/strong&gt;), then my style sheet theme's CSS rule will have a higher precedence for the CSS &lt;strong&gt;background-color&lt;/strong&gt; attribute than the YUI Reset CSS's rule.&lt;/p&gt;

&lt;h2&gt;Creating an ASP.NET theme&lt;/h2&gt;

&lt;p&gt;Now that we have all of the theory of themes behind us, we can focus on building a theme in ASP.NET. In an ASP.NET web site, all themes are placed in a special folder named &lt;strong&gt;App_Themes&lt;/strong&gt; that is located in the root folder of your web site. Inside of the &lt;strong&gt;App_Themes&lt;/strong&gt; folder are more sub-folders. Each sub-folder contains a single theme that has the same name as the sub-folder. For example:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;~/App_Themes/Default: default theme&lt;/li&gt;

  &lt;li&gt;~/App_Themes/StPatricks: St. Patrick's Day theme&lt;/li&gt;

  &lt;li&gt;~/App_Themes/July4th: 4th of July theme&lt;/li&gt;

  &lt;li&gt;~/App_Themes/Halloween: Halloween theme&lt;/li&gt;

  &lt;li&gt;~/App_Themes/Thanksgiving: Thanksgiving theme&lt;/li&gt;

  &lt;li&gt;~/App_Themes/Christmas: Christmas theme&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside of each of the theme folders are all of the CSS style sheets for the theme, skins for ASP.NET controls, and related resources such as images, logos, music or audio files, and icons.&lt;/p&gt;

&lt;p&gt;With these themes defined, we need to look at the strategy for using the themes. If we avoid using style sheet themes, which we can, we would have to create our default theme and then copy that theme and modify it for each of the special holiday themes. That could be a lot of work if you later modify the look of your web site because then those changes have to be pushed to all of the holiday themes. What would be better is to just have the holiday themes modify those elements that the need to, such as the background color or web site logo.&lt;/p&gt;

&lt;p&gt;My typical strategy for using ASP.NET themes is to create the &lt;strong&gt;Default&lt;/strong&gt; theme and set this theme as the style sheet theme for my web site. If no other style rules are specified, then my default skins and CSS styles will be used. This means also that my &lt;strong&gt;Default&lt;/strong&gt; theme is larger than the other themes and has most of the images that I use on the web site. Also, remembering the rules of theme and CSS precedence, my &lt;strong&gt;Default&lt;/strong&gt; theme is also highly specific with regards to CSS because I remember that I am using the YUI! Reset CSS inside of my document. So, if I want to specify a default background image or color in my default theme, I can override the background reset in the YUI Reset CSS by specifying the &lt;strong&gt;id&lt;/strong&gt; value of my &lt;strong&gt;BODY&lt;/strong&gt; tag (&lt;strong&gt;www-imaginaryrealities-com&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;The only issue with using the &lt;strong&gt;Default&lt;/strong&gt; theme as the style sheet theme is that controls on the ASP.NET master page, page, or user controls can override my style settings. This is ok, because as a general rule I do not allow myself to put any kind of style information on ASP.NET controls in a page. I only do styling through CSS actually and at most will specify the name of the CSS class for an ASP.NET control to use. I usually never set the font or color information directly on a CSS control. But I leave myself the option for doing so if I decide at some point that it may be necessary. And if that is the case, I'll only do so on a skin and not on an actual control and I'll specify the &lt;strong&gt;SkinID&lt;/strong&gt; property on the skin and ASP.NET control.&lt;/p&gt;

&lt;p&gt;Once the &lt;strong&gt;Default&lt;/strong&gt; theme is established, then I can create the additional holiday themes as variations or deltas of the &lt;strong&gt;Default&lt;/strong&gt; theme. I only have to include the CSS styles and skins that I specifically want to override from the &lt;strong&gt;Default&lt;/strong&gt; theme. Plus, I only have to include the images and other resources that I want to show for my holiday look, and I can still have access to and use all of the original resources in the &lt;strong&gt;Default&lt;/strong&gt; theme that I don't want to override. When a holiday approaches and I want to apply my holiday theme, I simply configure my web site to apply the holiday theme on top of my &lt;strong&gt;Default&lt;/strong&gt; theme. We'll discuss how to do this next.&lt;/p&gt;

&lt;h2&gt;Using an ASP.NET theme&lt;/h2&gt;

&lt;p&gt;There are three ways to configure the style sheet theme or application theme for an ASP.NET web site or application:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Modify the Web.config file to apply the style sheet theme or application theme globally across the application.&lt;/li&gt;

  &lt;li&gt;Setting the themes declaratively on an ASP.NET page.&lt;/li&gt;

  &lt;li&gt;Setting the themes programmatically on an ASP.NET page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The themes in an ASP.NET web site or application can be applied globally to all pages in the application using the Web.config file:&lt;/p&gt;

&lt;p&gt;
  &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:461ef177-c8ac-485b-a6e5-8c15003d4686" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;system.web&amp;gt;
        &amp;lt;page styleSheetTheme="Default"
              theme="Christmas"&amp;gt;...&amp;lt;/page&amp;gt;
    &amp;lt;/system&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;You can also customize the theme by using a Web.config file in a sub-folder to apply a folder-specific theme. This could come in very handy if you were running an e-commerce store selling holiday goods and you wanted part of your site to have a Christmas theme while another part of your site has a Halloween theme.&lt;/p&gt;

&lt;p&gt;The Web.config is a great place to easily control the theme settings for your entire site, but what happens if you have a page or two that you always want to look different from the rest of the pages in your site? In this case, you can control the theme declaratively in the &lt;strong&gt;Page&lt;/strong&gt; directive at the top of an ASP.NET page:&lt;/p&gt;

&lt;p&gt;
  &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6704cb2d-4e21-4b5a-9b68-f9c44e0ade03" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@ Page StyleSheetTheme="Default" Theme="BahHumbug" %&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;In this case, I can set most of my site to use my Christmas theme, but I can have Mr. Scrooge's biography page to be very &amp;quot;business as usual.&amp;quot;&lt;/p&gt;

&lt;p&gt;Finally, you can set the style sheet theme and application theme for your web page programmatically, although there's a bit of a trick to it. When you set the themes programmatically, you need to do so at a specific point in the page's lifecycle, otherwise you'll get exceptions from ASP.NET. Specifically, the theme settings for a page can only be changed in the &lt;strong&gt;PreInit&lt;/strong&gt; event of the page lifecycle.&lt;/p&gt;

&lt;p&gt;Why would you set the theme programmatically? It turns out that this is a great technique that works if you are building a web site framework similar to &lt;a href="http://dev.communityserver.com/" target="_blank"&gt;Community Server&lt;/a&gt;, &lt;a href="http://www.dotnetblogengine.net" target="_blank"&gt;BlogEngine.NET&lt;/a&gt;, &lt;a href="http://www.myspace.com" target="_blank"&gt;MySpace&lt;/a&gt;, or &lt;a href="http://www.facebook.com/" target="_blank"&gt;FaceBook&lt;/a&gt;. If you build a web site that can be customized, or where each user can have their own sub-site, then you can allow users to choose their own themes for their sub-sites. You can store the theme selections in the definition of the sub-site, and when a user requests a page from the sub-site, you can set the sub-site theme while serving content from the same web site template such as a blog or community site template.&lt;/p&gt;

&lt;p&gt;Another area where setting the themes programmatically can help is in testing out a theme. Remember in my &lt;a title="Globalizing ASP.NET web sites" href="http://www.imaginaryrealities.com/post/2008/09/13/Globalizing-ASPNET-web-sites.aspx" target="_blank"&gt;last post&lt;/a&gt;, I modified the base &lt;strong&gt;WebsitePage&lt;/strong&gt; class to allow me to specify the culture values to test out translations without having to change my browser settings. Likewise, it would be great if I could pop open a browser or pop-up window and specify the themes in my query string so that I could test or preview a theme before turning it on for my web site or sub-site. I made a similar modification to the &lt;strong&gt;WebsitePage&lt;/strong&gt; class to set the themes during the &lt;strong&gt;PreInit&lt;/strong&gt; event from attributes specified in the request query string:&lt;/p&gt;

&lt;p&gt;
  &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e34de678-ac78-4a42-b8c0-a2bff55c2f6c" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;//------------------------------------------------------------------------
// &amp;lt;copyright file="WebsitePage.cs"
//            company="ImaginaryRealities Software Company"&amp;gt;
// Copyright (c) 2008 ImaginaryRealities Software Company
// &amp;lt;/copyright&amp;gt;
// &amp;lt;summary&amp;gt;
// Implements the WebsitePage abstract base class that is used as the base
// class for all web pages on the web site.
// &amp;lt;/summary&amp;gt;
//------------------------------------------------------------------------

namespace ImaginaryRealities.Website.UI.Framework
{
    using System.Globalization;
    using System.Threading;
    using System.Web.Configuration;
    using System.Web.UI;
    using Wintellect.Diagnostics;

    /// &amp;lt;summary&amp;gt;
    /// Abstract base class for web pages in the website.
    /// &amp;lt;/summary&amp;gt;
    [CodeOwner("Michael F. Collins, III", "michael@imaginaryrealities.com")]
    public abstract class WebsitePage : Page
    {
        /// &amp;lt;summary&amp;gt;
        /// Initializes a new instance of the WebsitePage class.
        /// &amp;lt;/summary&amp;gt;
        protected WebsitePage()
        {
            this.InitializePageWidth();
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the CSS class name for the web page.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the name of the CSS class that
        /// represents the specific web page.
        /// &amp;lt;/value&amp;gt;
        public abstract string PageCssClassName
        {
            get;
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the identifier that is used to specify the width of the
        /// web page.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the identifier that is used to
        /// specify the width of the content area of the web page.
        /// &amp;lt;/value&amp;gt;
        public string PageWidth
        {
            get;
            protected set;
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets or sets the name of the ASP.NET theme to use as the style
        /// sheet theme for the page.
        /// &amp;lt;/summary&amp;gt;
        public override string StyleSheetTheme
        {
            get
            {
                var themeName = this.Request.QueryString["stylesheettheme"];
                return themeName ?? base.StyleSheetTheme;
            }

            set
            {
                base.StyleSheetTheme = value;
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Sets the page and thread culture and UI culture values based on
        /// values provided in the request's query string.
        /// &amp;lt;/summary&amp;gt;
        protected override void InitializeCulture()
        {
            var culture = this.Request.QueryString["culture"];
            if (!string.IsNullOrEmpty(culture))
            {
                this.Culture = culture;
                Thread.CurrentThread.CurrentCulture =
                    CultureInfo.CreateSpecificCulture(culture);
            }

            var uiCulture = this.Request.QueryString["uiculture"] ?? culture;
            if (string.IsNullOrEmpty(uiCulture))
            {
                return;
            }

            this.UICulture = uiCulture;
            Thread.CurrentThread.CurrentCulture =
                CultureInfo.CreateSpecificCulture(uiCulture);
        }

        /// &amp;lt;summary&amp;gt;
        /// Sets the theme and style sheet theme for the page based on values
        /// provided in the request's query string.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="e"&amp;gt;The event arguments.&amp;lt;/param&amp;gt;
        protected override void OnPreInit(System.EventArgs e)
        {
            var theme = this.Request.QueryString["theme"];
            if (!string.IsNullOrEmpty(theme))
            {
                this.Theme = theme;
            }

            base.OnPreInit(e);
        }

        /// &amp;lt;summary&amp;gt;
        /// Initializes the &amp;lt;see cref="PageWidth"/&amp;gt; property by loading the
        /// default page width from the website configuration.
        /// &amp;lt;/summary&amp;gt;
        private void InitializePageWidth()
        {
            var configurationSection = (WebsiteConfigurationSection)
                WebConfigurationManager.GetSection("website");
            this.PageWidth =
                configurationSection != null
                    ? configurationSection.PageWidth
                    : "doc";
        }
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;The two additions to this class is the override of the &lt;strong&gt;Page.OnPreInit&lt;/strong&gt; method on line 108. &lt;strong&gt;OnPreInit&lt;/strong&gt; will set the value of the &lt;strong&gt;Page.Theme&lt;/strong&gt; property from the &lt;strong&gt;theme&lt;/strong&gt; query string attribute if it is provided. The second addition is the override of the &lt;strong&gt;Page.StyleSheetTheme&lt;/strong&gt; property on line 64. The reason why I had to override &lt;strong&gt;Page.StyleSheetTheme&lt;/strong&gt; instead of putting this code into the &lt;strong&gt;OnPreInit&lt;/strong&gt; method is that the &lt;strong&gt;Page.StyleSheetTheme&lt;/strong&gt; property is called before &lt;strong&gt;OnPreInit&lt;/strong&gt; is called. Basedo n this implementation, if the &lt;strong&gt;stylesheettheme&lt;/strong&gt; attribute is specified on the query string, it will override the default style sheet theme set on the page or in the Web.config file.&lt;/p&gt;

&lt;p&gt;Using this updated base class, I can test out different themes with URLs like the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default"&gt;http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=StPatricksDay"&gt;http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=StPatricksDay&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=July4th"&gt;http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=July4th&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=Halloween"&gt;http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=Halloween&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=Thanksgiving"&gt;http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=Thanksgiving&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=Christmas"&gt;http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=Christmas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to make sure that I'm keeping honest with you, you can also try this: &lt;a href="http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=Christmas&amp;amp;culture=es-MX"&gt;http://www.imaginaryrealities.com/beta/Default.aspx?stylesheettheme=Default&amp;amp;theme=Christmas&amp;amp;culture=es-MX&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Remember, since I'm using the YUI Reset CSS, I can't do something like this in my Default theme's CSS file:&lt;/p&gt;

&lt;p&gt;
  &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:90871ee9-51b8-4f06-a3a8-8bc76c681708" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="css"&gt;body
{
    background: Gray;
}&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;The problem is that if I do this, then the YUI Reset CSS will override my background color given the rules of CSS cascades. Instead, my CSS rule needs to be more specific than the YUI Reset CSS:&lt;/p&gt;

&lt;p&gt;
  &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7d3353e4-0605-47d7-841d-c4b760e67259" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="css"&gt;body#www-imaginaryrealities-com
{
    background-color: Gray;
}&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Then, if I were to apply a holiday theme, the holiday theme has to be just as specific as the Default theme in order to override the Gray background color using CSS cascades. This is the CSS for the Christmas theme:&lt;/p&gt;

&lt;p&gt;
  &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b968d020-8ce2-416d-a628-0ffbcb02ab6d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;body#www-imaginaryrealities-com
{
    background-color: Red;
    color: Green;
}&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;The Christmas theme's CSS rule is just as specific as the Default theme's CSS rule, however, because the Default theme is the style sheet theme and the Christmas theme is the application theme, the CSS for the Christmas theme is included after the CSS for the Default theme. Therefore, using the CSS cascade rules, the CSS for the Christmas theme overrides the CSS for the Default theme.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;In this post, I introduced you to ASP.NET themes and skins. We covered the differences between application themes and style sheet themes. I also reviewed for you the rules behind CSS cascades. I then explained how to create ASP.NET themes in your web site and showed you how to turn on themes using the Web.config file, declaratively in your .aspx page markup, or programmatically. I also enhanced the &lt;strong&gt;WebsitePage&lt;/strong&gt; base class for my web site to allow me to set the style sheet and application themes using the request query string for testing and previewing theme changes before applying themes.&lt;/p&gt;&lt;div class="socialBookmarksContainer"&gt;&lt;a rel="nofollow" href="http://digg.com/submit/?url=http://www.imaginaryrealities.com/post/2008/09/14/Customizing-the-look-of-a-web-site-using-ASPNET-themes.aspx" target="_blank" title="Digg It!"&gt;&lt;img src="///socialbookmarks/square/digg_24.png" style="border: 0;" alt="Digg It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http://www.imaginaryrealities.com/post/2008/09/14/Customizing-the-look-of-a-web-site-using-ASPNET-themes.aspx&amp;amp;title=Customizing the look of a web site using ASP.NET themes" target="_blank" title="DZone It!"&gt;&lt;img src="///socialbookmarks/square/dzone_24.png" style="border: 0;" alt="DZone It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/14/Customizing-the-look-of-a-web-site-using-ASPNET-themes.aspx" target="_blank" title="StumbleUpon"&gt;&lt;img src="///socialbookmarks/square/stumbleupon_24.png" style="border: 0;" alt="StumbleUpon" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://technorati.com/ping?url=http://www.imaginaryrealities.com/" target="_blank" title="Technorati"&gt;&lt;img src="///socialbookmarks/square/technorati_24.png" style="border: 0;" alt="Technorati" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://reddit.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/14/Customizing-the-look-of-a-web-site-using-ASPNET-themes.aspx&amp;amp;title=Customizing the look of a web site using ASP.NET themes" target="_blank" title="Reddit"&gt;&lt;img src="///socialbookmarks/square/reddit_24.png" style="border: 0;" alt="Reddit" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://del.icio.us/post?url=http://www.imaginaryrealities.com/post/2008/09/14/Customizing-the-look-of-a-web-site-using-ASPNET-themes.aspx&amp;amp;title=Customizing the look of a web site using ASP.NET themes" target="_blank" title="Del.icio.us"&gt;&lt;img src="///socialbookmarks/square/delicious_24.png" style="border: 0;" alt="Del.icio.us" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.newsvine.com/_wine/save?u=http://www.imaginaryrealities.com/post/2008/09/14/Customizing-the-look-of-a-web-site-using-ASPNET-themes.aspx" target="_blank"title="NewsVine"&gt;&lt;img src="///socialbookmarks/square/newsvine_24.png" style="border: 0;" alt="NewsVine" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://furl.net" target="_blank" title="Furl"&gt;&lt;img src="///socialbookmarks/square/furl_24.png" style="border: 0;" alt="Furl" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://blinklist.com/submit/" target="_blank" title="BlinkList"&gt;&lt;img src="///socialbookmarks/square/blinklist_24.png" style="border: 0;" alt="BlinkList" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div class="entry"&gt;
		&lt;div class="title"&gt;
			&lt;a href="http://www.imaginaryrealities.com/post/2008/09/13/Globalizing-ASPNET-web-sites.aspx"&gt;Globalizing ASP.NET web sites&lt;/a&gt;
		&lt;/div&gt;&lt;div class="moreinfo"&gt;
			&lt;span class="date"&gt;Saturday, September 13, 2008&lt;/span&gt; &amp;nbsp;| &amp;nbsp;&lt;span class="source"&gt;From &lt;a href="http://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082" target="_blank"&gt;ImaginaryRealities Software Company&lt;/a&gt;&lt;/span&gt;
		&lt;/div&gt;&lt;p&gt;&lt;p&gt;In my &lt;a title="Designing a web site using the Yahoo! User Interface Library" href="http://www.imaginaryrealities.com/post/2008/09/12/Designing-a-web-site-using-the-Yahoo!-User-Interface-Library.aspx"&gt;last post&lt;/a&gt;, I discussed using the Yahoo! User Interface Library to start designing an ASP.NET web site. In my next post, I'll continue that discussion. But first, there's a little housekeeping chore that I want to discuss related to maximizing the amount of people that can view your web site. ASP.NET, and in general the entire .NET platform and Windows, all have rich support for globalization and localization. I like to think of globalization and localization as the creation of multicultural applications and web sites. Using globalization and localization, applications, or in this case web sites, can be used across multiple languages and cultures while respecting the specific cultural requirements, and without changing any code. &lt;/p&gt;  &lt;h2&gt;Enabling Globalization in an ASP.NET web site&lt;/h2&gt;  &lt;p&gt;Globalization is enabled in an ASP.NET web site or application through the &lt;strong&gt;Web.config&lt;/strong&gt; file that contains the globalization settings for the web site. The &lt;strong&gt;Web.config&lt;/strong&gt; file uses the &lt;strong&gt;system.web/globalization&lt;/strong&gt; element to configure the globalization support for your application. The configuration for my web site looks like this:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:732dc626-a831-47f8-9053-b054383d66b3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;system.web&amp;gt;
        &amp;lt;globalization culture="auto"
                       enableBestFitResponseEncoding="false"
                       enableClientBasedCulture="false"
                       fileEncoding="utf-8"
                       requestEncoding="utf-8"
                       responseEncoding="utf-8"
                       responseHeaderEncoding="utf-8"
                       uiCulture="auto"/&amp;gt;
    &amp;lt;/system.web&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;As you can see in the configuration settings above, the &lt;strong&gt;system.web/globalization&lt;/strong&gt; element has several attributes that control the behavior of the web site:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;culture:&lt;/strong&gt; Specifies the default culture for processing incoming web requests. This value has to be a specific culture, in the form of &lt;strong&gt;&amp;lt;language&amp;gt;-&amp;lt;locale&amp;gt;&lt;/strong&gt;, such as &lt;strong&gt;en-US&lt;/strong&gt; for U.S. English or &lt;strong&gt;es-MX&lt;/strong&gt; for Spanish in Mexico. The &lt;strong&gt;culture&lt;/strong&gt; attribute affects how values such as numbers, dates, and times are formatted when displayed on the web page. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;enableBestFitResponseEncoding:&lt;/strong&gt; Indicates whether the best-fit character encoding for a response is enabled. The default value for this setting is &lt;strong&gt;false&lt;/strong&gt;, so I left it that way. I'm guessing that it isn't a best practice. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;enableClientBasedCulture:&lt;/strong&gt; If this attribute is set to &lt;strong&gt;true&lt;/strong&gt;, then the &lt;strong&gt;Culture&lt;/strong&gt; and &lt;strong&gt;UICulture&lt;/strong&gt; settings for a page will be based on the value provided by the web browser in the &lt;strong&gt;AcceptLanguage&lt;/strong&gt; header field of the web browser. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;fileEncoding:&lt;/strong&gt; Specifies the default encoding for .aspx, .asmx, and .asax files in the web application. This value is used by the ASP.NET compiler to determine how to read web site files. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;requestEncoding:&lt;/strong&gt; Specifies the encoding that will be used for the content that is received over HTTP. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;responseEncoding:&lt;/strong&gt; Specifies the encoding that will be used for the content that is sent in an HTTP response. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;responseHeaderEncoding:&lt;/strong&gt; Specifies the encoding that will be used for the HTTP headers sent back in the response. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;uiCulture:&lt;/strong&gt; Specifies the default culture or language to use for the web pages. This value can be a generic or specific culture. For example, &lt;strong&gt;en&lt;/strong&gt; would be a generic English web page, but &lt;strong&gt;en-US&lt;/strong&gt; or &lt;strong&gt;en-GB&lt;/strong&gt; would be specific to U.S. English or U.K. English, respectively. A specific culture may be used if there are vocabulary or other differences between how two different cultures use the same language. For example, going back to high school Spanish, I recall there being differences in how Spanish is used in Spain and how Spanish is used in Mexico. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;According to the article &lt;a title="How to: Set the Culture and UI Culture for ASP.NET Web Page Globalization" href="http://msdn.microsoft.com/en-us/library/bz9tc508.aspx" target="_blank"&gt;How to: Set the Culture and UI Culture for ASP.NET Web Page Globalization&lt;/a&gt; on MSDN, it's not considered a best practice to set the &lt;strong&gt;enableClientBasedCulture&lt;/strong&gt; attribute to &lt;strong&gt;true&lt;/strong&gt;. The reasoning is that users may be in a location such as a library or Internet cafe and may be using a browser with different settings than they're used to. In this case, the article is recommending that the web site store the user's culture preferences and set them automatically when the page loads. I'll do this onto my web site's backlog and revisit it in a future post after I've stored the user's profile information. For now, however, I'm setting the &lt;strong&gt;culture&lt;/strong&gt; and &lt;strong&gt;uiCulture&lt;/strong&gt; attributes to &lt;strong&gt;auto&lt;/strong&gt;, which is similar to setting &lt;strong&gt;enableClientBasedCulture&lt;/strong&gt;, in that ASP.NET will automatically choose the first language that is specified in the current browser settings.&lt;/p&gt;

&lt;h2&gt;Testing globalization support using Internet Explorer&lt;/h2&gt;

&lt;p&gt;Before we get into actually globalizing the web site, I'm sure that there's a question out there about how we can actually test the globalization in action. After all, I'm running Windows using U.S. English. I'm not going to load a Japanese version of Windows to do my testing. Actually, Internet Explorer, and I'm sure the other web browsers do as well, make it very easy to add and change cultures for testing web sites. The language settings can be found in Internet Explorer 7 from the &lt;strong&gt;Tools -&amp;gt; Internet Options&lt;/strong&gt; menu.&lt;/p&gt;

&lt;p&gt;&lt;a title="Internet Options dialog" href="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_2.png" rel="lightbox"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="Internet Options dialog" src="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_thumb.png" width="198" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;From the Internet Options dialog, choose the &lt;strong&gt;Languages&lt;/strong&gt; button at the bottom of the dialog. This button has been circled in the picture above.&lt;/p&gt;

&lt;p&gt;&lt;a title="Language Preferences dialog" href="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_4.png" rel="lightbox"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="image" src="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_thumb_1.png" width="226" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;In the Language Preferences dialog (above) you can see all of the configured languages and cultures that your browser will send to web sites that you visit. If you click the &lt;strong&gt;Add&lt;/strong&gt; button you can add addition cultures, such as &lt;strong&gt;es-MX&lt;/strong&gt; for testing Spanish (Mexico). When testing how your web pages look in different cultures, you can reopen this dialog and move a different culture into the top spot. After setting a new top culture, return to your web site and you should see your web site using the culture that you specified.&lt;/p&gt;

&lt;h2&gt;Using .NET resources&lt;/h2&gt;

&lt;p&gt;In the Microsoft .NET platform, globalizing an application to provide language-specific text is done through the use of XML resources, or .resx files. During development, developers will store text, images, and other items that may be culture-specific into the .resx files and will refer to them at runtime inside of their code. The .NET platform, including ASP.NET, will locate these resources and will insert the text or other globalized object into the output of the ASP.NET page or other application UI such as a window or form.&lt;/p&gt;

&lt;p&gt;In ASP.NET specifically, there are two kinds of resources: global and local resources. A global resource is specific and global to an entire web site or web application. For example, a company name or web site title, and possibly copyright text may be a global resource. A local resource is local to a specific page or user control in ASP.NET. For example, the title or description of a web page may be a local resource. The text of the page may be a local resource if the text is provided in different languages.&lt;/p&gt;

&lt;p&gt;In an ASP.NET web site or application, there are specific locations for global and local resources. Global resources are stored in the &lt;strong&gt;~/App_GlobalResources&lt;/strong&gt; folder at the root of the web site or application. This is the only place where ASP.NET will look for global resources. At compile time, the ASP.NET compiler will compile all of the resource files in this location and will add the resources to the compiled ASP.NET application for global use.&lt;/p&gt;

&lt;p&gt;Local resources are stored in the &lt;strong&gt;App_LocalResources&lt;/strong&gt; folder. Unlike the global resources, there can be many &lt;strong&gt;App_LocalResources&lt;/strong&gt; folders. Each sub-folder that you use in your web site may have its own &lt;strong&gt;App_LocalResources&lt;/strong&gt; folder with local resources specific to that sub-folder. You may be asking why this is? Look no further than the &lt;strong&gt;Default.aspx&lt;/strong&gt; page, which is used as the default document for ASP.NET applications. Let's use the following example for a sample web site:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;~/Default.aspx &lt;/li&gt;

  &lt;li&gt;~/Admin/Default.aspx &lt;/li&gt;

  &lt;li&gt;~/News/Default.aspx &lt;/li&gt;

  &lt;li&gt;~/Blogs/Default.aspx &lt;/li&gt;

  &lt;li&gt;~/Blogs/Michael/Default.aspx &lt;/li&gt;

  &lt;li&gt;~/Blogs/Bob/Default.aspx &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this example web site, we have multiple sub-folders. Each folder has its own &lt;strong&gt;Default.aspx&lt;/strong&gt; page. It should be expected that each page is going to have a different title. If we have only a single &lt;strong&gt;App_LocalResources&lt;/strong&gt; folder, it's going to be hard to tell which &lt;strong&gt;Default.aspx&lt;/strong&gt; page the local .resx file refers to. Therefore, each of these sub-folders can have their own &lt;strong&gt;App_LocalResources&lt;/strong&gt; folder with their own resource. Here's how the web site will look:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;~/Default.aspx &lt;/li&gt;

  &lt;li&gt;~/App_LocalResources/Default.aspx.resx &lt;/li&gt;

  &lt;li&gt;~/Admin/Default.aspx &lt;/li&gt;

  &lt;li&gt;~/Admin/App_LocalResources/Default.aspx.resx &lt;/li&gt;

  &lt;li&gt;~/News/Default.aspx &lt;/li&gt;

  &lt;li&gt;~/News/App_LocalResources/Default.aspx.resx &lt;/li&gt;

  &lt;li&gt;~/Blogs/Default.aspx &lt;/li&gt;

  &lt;li&gt;~/Blogs/App_LocalResources/Default.aspx.resx &lt;/li&gt;

  &lt;li&gt;~/Blogs/Michael/Default.aspx &lt;/li&gt;

  &lt;li&gt;~/Blogs/Michael/App_LocalResources/Default.aspx.resx &lt;/li&gt;

  &lt;li&gt;~/Blogs/Bob/Default.aspx &lt;/li&gt;

  &lt;li&gt;~/Blogs/Bob/App_LocalResources/Default.aspx.resx &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given this, the resource files in the &lt;strong&gt;App_LocalResources&lt;/strong&gt; folder are local to and apply only to the files in the immediate parent folder of the &lt;strong&gt;App_LocalResources&lt;/strong&gt; folder.&lt;/p&gt;

&lt;h2&gt;Preparing ASP.NET pages for globalization&lt;/h2&gt;

&lt;p&gt;ASP.NET pages have rich support for globalization. Most ASP.NET controls also have rich support for globalization that often require absolutely no code at all to implement. ASP.NET defines a special attribute that pages and most controls support named &lt;strong&gt;meta:resourcekey&lt;/strong&gt;. This attribute, when applied to a page or control, specifies the prefix for resources that apply to the page or control.&lt;/p&gt;

&lt;p&gt;Using the pages that I built in my last post, the home page could look like this:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e6c322a1-504e-420a-b1eb-b02add9ae7b9" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@ Page Language="C#" MasterPageFile="~/TemplateMasterPage.master" AutoEventWireup="true"
    CodeFile="Default.aspx.cs" Inherits="_Default" meta:resourcekey="Page" Title="ImaginaryRealities Software Company" %&amp;gt;

&amp;lt;asp:Content ID="MainContent" runat="server" ContentPlaceHolderID="MainContentPlaceHolder"&amp;gt;
    &amp;lt;asp:Localize runat="server" meta:resourcekey="MainBodyContent" Text="Main body content" /&amp;gt;
&amp;lt;/asp:Content&amp;gt;
&amp;lt;asp:Content ID="SecondaryContent" runat="server" ContentPlaceHolderID="SecondaryContentPlaceHolder"&amp;gt;
    &amp;lt;asp:Localize runat="server" meta:resourcekey="SecondaryBodyContent" Text="Secondary body content" /&amp;gt;
&amp;lt;/asp:Content&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;What's different in this version of the page versus the previous version is that in the &amp;lt;&lt;strong&gt;%@Page%&amp;gt;&lt;/strong&gt; element at the top of my page, I've added the &lt;strong&gt;meta:resourcekey&lt;/strong&gt; attribute with a value of &lt;strong&gt;Page&lt;/strong&gt; and the &lt;strong&gt;Title&lt;/strong&gt; attribute containing the title of my home page. I also replaced the text &lt;strong&gt;Main body content&lt;/strong&gt; and &lt;strong&gt;Secondary body content&lt;/strong&gt; with &lt;strong&gt;&amp;lt;asp:Localize&amp;gt;&lt;/strong&gt; controls that now contain that same text. You'll notice that I have also defined &lt;strong&gt;meta:resourcekey&lt;/strong&gt; attributes for each of these controls.&lt;/p&gt;

&lt;p&gt;What I have now is a web page that is ready to be globalized. The next step is to prepare this page to be translated. Fortunately, Visual Studio provides a menu option to help you by taking an ASP.NET page that has been set up like mine has and automatically generating the neutral language resource for you. It can be found by switching your ASP.NET page from &lt;strong&gt;Source view&lt;/strong&gt; to &lt;strong&gt;Design view&lt;/strong&gt;, then choosing the &lt;strong&gt;Tools -&amp;gt; Generate Local Resource&lt;/strong&gt; menu option from the menu bar at the top if the Visual Studio window. After choosing this command, I automatically get a file named &lt;strong&gt;~/App_LocalResources/Default.aspx.resx&lt;/strong&gt;. This is the neutral language resource for my application.&lt;/p&gt;

&lt;p&gt;What is a neutral resource? I haven't discussed that yet. Earlier, I briefly introduced you to a generic culture, such as &lt;strong&gt;en&lt;/strong&gt; for English. I've also mentioned a couple of times specific cultures, such as &lt;strong&gt;en-US&lt;/strong&gt; for U.S. English, &lt;strong&gt;en-GB&lt;/strong&gt; for U.K. English, or &lt;strong&gt;es-MX&lt;/strong&gt; for Spanish in Mexico. So let's say that I globalize my site for these languages and cultures (which we'll do in a moment), but then someone from Beijing, China, visits my web site. I don't have a Chinese translation for my web site. What happens then is that ASP.NET will default to what's known as the neutral culture, or whatever I determine my neutral culture should be. In my case, since I am a U.S. citizen and live in the United States, my neutral culture of choice is still going to be U.S. English. So Chinese visitors will see U.S. English, but visitors from Mexico will see Spanish, since that's a culture that I support. &lt;/p&gt;

&lt;p&gt;Back to globalizing my web page, we last generated the neutral language resource file for the page. The resource file for the above ASP.NET/HTML fragment will look like the following:&lt;/p&gt;

&lt;p&gt;&lt;a title="Neutral language resources for Default.aspx" href="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_6.png" rel="lightbox"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="98" alt="image" src="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_thumb_2.png" width="345" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;As you can see in the screen shot, my new resource file has localizable properties for the page and the controls that I defined that match the values that I provided in the &lt;strong&gt;meta:resourcekey&lt;/strong&gt; attributes that I attached to my controls. The new resource file has three string resources. &lt;strong&gt;Page.Title&lt;/strong&gt; contains the text for the &lt;strong&gt;&amp;lt;title&amp;gt;&lt;/strong&gt; tag on the web page. &lt;strong&gt;MainBodyContent.Text&lt;/strong&gt; contains the text that displays in the main body content area for the page, and &lt;strong&gt;SecondaryBodyContext.Text&lt;/strong&gt; contains the text that displays in the secondary content area.&lt;/p&gt;

&lt;p&gt;For instructional purposes, I'm going to create two additional resource files: &lt;strong&gt;Default.aspx.en.resx&lt;/strong&gt; for English language users, and &lt;strong&gt;Default.aspx.es.resx&lt;/strong&gt; for Spanish users. I'm also going to cheat and use the &lt;a href="http://translate.google.com" target="_blank"&gt;Google Translation&lt;/a&gt; service to do the translating for me. My resources should look like the following:&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="2" width="572" border="0"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="204"&gt;&lt;strong&gt;Property/Language&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="176"&gt;&lt;strong&gt;English&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="190"&gt;&lt;strong&gt;Spanish&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="206"&gt;&lt;strong&gt;MainBodyContent.Text&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="175"&gt;Main body content (en)&lt;/td&gt;

      &lt;td valign="top" width="190"&gt;
        &lt;p&gt;&amp;#211;rgano principal del contenido&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="208"&gt;&lt;strong&gt;SecondaryBodyContent.Text&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="175"&gt;Secondary body content (en)&lt;/td&gt;

      &lt;td valign="top" width="190"&gt;Secundaria &amp;#243;rgano contenido&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;I'm also going to modify the English resources to have a suffix of &lt;strong&gt;(en)&lt;/strong&gt; so that you know that the resources are being served from the English language resource and not from the neutral language resource.&lt;/p&gt;

&lt;h2&gt;Testing globalization&lt;/h2&gt;

&lt;p&gt;Earlier in this post, I described to you how you can configure the languages and cultures in Internet Explorer to test different cultures and languages. However, to simplify testing and demonstration of the globalization capabilities of ASP.NET, I modified by base &lt;strong&gt;WebsitePage&lt;/strong&gt; class and implemented the &lt;strong&gt;Page.InitializeCulture&lt;/strong&gt; method. The &lt;strong&gt;InitializeCulture&lt;/strong&gt; method is called very early in the page lifecycle before the page itself has been initialized. I'm going to use this method to look at the query string for the web page and look for attributes named &lt;strong&gt;culture &lt;/strong&gt;or&lt;strong&gt; uiculture&lt;/strong&gt;. If one or both of these attributes are specified in the query string, then I'll use the culture that is provided to set the &lt;strong&gt;Page.Culture&lt;/strong&gt;, &lt;strong&gt;Page.UICulture&lt;/strong&gt;, &lt;strong&gt;Thread.CurrentCulture&lt;/strong&gt;, and &lt;strong&gt;Thread.CurrentUICulture&lt;/strong&gt; properties with the provided culture information, which will then cause my web page to be translated. Here's the updated code for the &lt;strong&gt;WebsitePage&lt;/strong&gt; class:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a3fcb9a1-84c5-49c4-8250-cebb0e887569" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;//------------------------------------------------------------------------
// &amp;lt;copyright file="WebsitePage.cs"
//            company="ImaginaryRealities Software Company"&amp;gt;
// Copyright (c) 2008 ImaginaryRealities Software Company
// &amp;lt;/copyright&amp;gt;
// &amp;lt;summary&amp;gt;
// Implements the WebsitePage abstract base class that is used as the base
// class for all web pages on the web site.
// &amp;lt;/summary&amp;gt;
//------------------------------------------------------------------------

namespace ImaginaryRealities.Website.UI.Framework
{
    using System.Globalization;
    using System.Threading;
    using System.Web.Configuration;
    using System.Web.UI;
    using Wintellect.Diagnostics;

    /// &amp;lt;summary&amp;gt;
    /// Abstract base class for web pages in the website.
    /// &amp;lt;/summary&amp;gt;
    [CodeOwner("Michael F. Collins, III", "michael@imaginaryrealities.com")]
    public abstract class WebsitePage : Page
    {
        /// &amp;lt;summary&amp;gt;
        /// Initializes a new instance of the WebsitePage class.
        /// &amp;lt;/summary&amp;gt;
        protected WebsitePage()
        {
            this.InitializePageWidth();
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the CSS class name for the web page.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the name of the CSS class that
        /// represents the specific web page.
        /// &amp;lt;/value&amp;gt;
        public abstract string PageCssClassName
        {
            get;
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the identifier that is used to specify the width of the
        /// web page.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the identifier that is used to
        /// specify the width of the content area of the web page.
        /// &amp;lt;/value&amp;gt;
        public string PageWidth
        {
            get;
            protected set;
        }

        /// &amp;lt;summary&amp;gt;
        /// Sets the page and thread culture and UI culture values based on
        /// values provided in the request's query string.
        /// &amp;lt;/summary&amp;gt;
        protected override void InitializeCulture()
        {
            var culture = this.Request.QueryString["culture"];
            if (!string.IsNullOrEmpty(culture))
            {
                this.Culture = culture;
                Thread.CurrentThread.CurrentCulture =
                    CultureInfo.CreateSpecificCulture(culture);
            }

            var uiCulture = this.Request.QueryString["uiculture"] ?? culture;
            if (string.IsNullOrEmpty(uiCulture))
            {
                return;
            }

            this.UICulture = uiCulture;
            Thread.CurrentThread.CurrentCulture =
                CultureInfo.CreateSpecificCulture(uiCulture);
        }

        /// &amp;lt;summary&amp;gt;
        /// Initializes the &amp;lt;see cref="PageWidth"/&amp;gt; property by loading the
        /// default page width from the website configuration.
        /// &amp;lt;/summary&amp;gt;
        private void InitializePageWidth()
        {
            var configurationSection = (WebsiteConfigurationSection)
                WebConfigurationManager.GetSection("website");
            this.PageWidth =
                configurationSection != null
                    ? configurationSection.PageWidth
                    : "doc";
        }
    }
}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now, if I were to type in the following URL, I should see the the screen shown below: &lt;a href="http://www.imaginaryrealities.com/beta/Default.aspx?culture=en-US"&gt;http://www.imaginaryrealities.com/beta/Default.aspx?culture=en-US&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a title="U.S. English translation of the website" href="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_8.png" rel="lightbox[screenshots]"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" alt="image" src="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_thumb_3.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;If I used this next URL, I should see the Spanish translation for the web site: &lt;a href="http://www.imaginaryrealities.com/beta/Default.aspx?culture=es-MX"&gt;http://www.imaginaryrealities.com/beta/Default.aspx?culture=es-MX&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a title="Spanish translation of the website" href="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_10.png" rel="lightbox[screenshots]"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" alt="image" src="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_thumb_4.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The following URL would give me the Italian translation for the web site: &lt;a href="http://www.imaginaryrealities.com/beta/Default.aspx?culture=it-IT"&gt;http://www.imaginaryrealities.com/beta/Default.aspx?culture=it-IT&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a title="Neutral language translation of the web site" href="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_12.png" rel="lightbox[screenshots]"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" alt="image" src="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/GlobalizingASP.NETwebsites_9765/image_thumb_5.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Wait? That doesn't look like Italian? It's not, actually. Remember, I only defined an English and Spanish translation for the web site. Since Italian is not a supported language, ASP.NET reverted back to the neutral language translation for the web site, which is going to be U.S. English. You can tell that the neutral language resource is being used from the title text in the Window's title. I added &lt;strong&gt;(en)&lt;/strong&gt; and &lt;strong&gt;(sp)&lt;/strong&gt; to the translated titles to show you that the page title is coming from a resource translation. The title without the suffix is being served from the neutral language resource.&lt;/p&gt;

&lt;p&gt;If you'll also remember from the &lt;a href="http://www.imaginaryrealities.com/post/2008/09/12/Designing-a-web-site-using-the-Yahoo!-User-Interface-Library.aspx" target="_blank"&gt;last post&lt;/a&gt;, I am adding CSS classes to the main BODY tag of the HTML which refer to the language and culture of the user using the web site. If you open the home page in a web browser and specify the culture in the query string, then choose &lt;strong&gt;View Source&lt;/strong&gt; from your browser's menu, you'll be able to see in the BODY tag that the culture that you specify is also specified as CSS classes. For example, viewing the web site with the &lt;strong&gt;culture=en-US&lt;/strong&gt; query string attribute set will specify &lt;strong&gt;la-en&lt;/strong&gt; and &lt;strong&gt;lo-US&lt;/strong&gt; in the BODY's CSS classes. Specifying the query string &lt;strong&gt;culture=es-MX&lt;/strong&gt; will add &lt;strong&gt;la-es&lt;/strong&gt; and &lt;strong&gt;lo-MX&lt;/strong&gt; to the BODY tag's CSS classes. You'll also notice that if you specify a culture, such as Italian (&lt;strong&gt;culture=it-IT&lt;/strong&gt;) to the query string, you'll get the neutral language translation of the web site, but the BODY tag's CSS classes will have &lt;strong&gt;la-it&lt;/strong&gt; and &lt;strong&gt;lo-IT&lt;/strong&gt; because that is the culture that was specified and that the page is running in, even if the page is serving the neutral language translations.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;In this post, I introduced you to globalizing ASP.NET applications. I explained how to set up your pages and controls for globalization using the &lt;strong&gt;meta:resourcekey&lt;/strong&gt; attribute. I also explained the difference between the &lt;strong&gt;App_GlobalResources&lt;/strong&gt; and &lt;strong&gt;App_LocalResources&lt;/strong&gt; directories. I then demonstrated a web site with English and Spanish translations. I also modified my base &lt;strong&gt;WebsitePage&lt;/strong&gt; class to allow the page's culture to be set using the request query string. There are additional aspects to globalization such as ASP.NET markup syntax that I didn't discuss in this post, but we'll visit in a future post.&lt;/p&gt;&lt;div class="socialBookmarksContainer"&gt;&lt;a rel="nofollow" href="http://digg.com/submit/?url=http://www.imaginaryrealities.com/post/2008/09/13/Globalizing-ASPNET-web-sites.aspx" target="_blank" title="Digg It!"&gt;&lt;img src="///socialbookmarks/square/digg_24.png" style="border: 0;" alt="Digg It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http://www.imaginaryrealities.com/post/2008/09/13/Globalizing-ASPNET-web-sites.aspx&amp;amp;title=Globalizing ASP.NET web sites" target="_blank" title="DZone It!"&gt;&lt;img src="///socialbookmarks/square/dzone_24.png" style="border: 0;" alt="DZone It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/13/Globalizing-ASPNET-web-sites.aspx" target="_blank" title="StumbleUpon"&gt;&lt;img src="///socialbookmarks/square/stumbleupon_24.png" style="border: 0;" alt="StumbleUpon" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://technorati.com/ping?url=http://www.imaginaryrealities.com/" target="_blank" title="Technorati"&gt;&lt;img src="///socialbookmarks/square/technorati_24.png" style="border: 0;" alt="Technorati" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://reddit.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/13/Globalizing-ASPNET-web-sites.aspx&amp;amp;title=Globalizing ASP.NET web sites" target="_blank" title="Reddit"&gt;&lt;img src="///socialbookmarks/square/reddit_24.png" style="border: 0;" alt="Reddit" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://del.icio.us/post?url=http://www.imaginaryrealities.com/post/2008/09/13/Globalizing-ASPNET-web-sites.aspx&amp;amp;title=Globalizing ASP.NET web sites" target="_blank" title="Del.icio.us"&gt;&lt;img src="///socialbookmarks/square/delicious_24.png" style="border: 0;" alt="Del.icio.us" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.newsvine.com/_wine/save?u=http://www.imaginaryrealities.com/post/2008/09/13/Globalizing-ASPNET-web-sites.aspx" target="_blank"title="NewsVine"&gt;&lt;img src="///socialbookmarks/square/newsvine_24.png" style="border: 0;" alt="NewsVine" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://furl.net" target="_blank" title="Furl"&gt;&lt;img src="///socialbookmarks/square/furl_24.png" style="border: 0;" alt="Furl" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://blinklist.com/submit/" target="_blank" title="BlinkList"&gt;&lt;img src="///socialbookmarks/square/blinklist_24.png" style="border: 0;" alt="BlinkList" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div class="entry"&gt;
		&lt;div class="title"&gt;
			&lt;a href="http://www.imaginaryrealities.com/post/2008/09/12/Designing-a-web-site-using-the-Yahoo!-User-Interface-Library.aspx"&gt;Designing a web site using the Yahoo! User Interface Library&lt;/a&gt;
		&lt;/div&gt;&lt;div class="moreinfo"&gt;
			&lt;span class="date"&gt;Saturday, September 13, 2008&lt;/span&gt; &amp;nbsp;| &amp;nbsp;&lt;span class="source"&gt;From &lt;a href="http://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082" target="_blank"&gt;ImaginaryRealities Software Company&lt;/a&gt;&lt;/span&gt;
		&lt;/div&gt;&lt;p&gt;&lt;p&gt;The hardest part of starting a new web site design is coming up with the killer layout for the site. There are many issues to consider when designing site and implementing the design. Do you use table-based layouts or CSS layouts? If you use CSS layouts do you float specific columns to the left or right side? How big should the page or columns be? What order do I need to put the content in the web page in order to maximize the search engine optimization? How do I do a negative margin to move my secondary content before my primary content? Fortunately, the wonderful developers at Yahoo! thought up some of these issues for you already and provide a great open source toolkit to help take some of these decisions away and make the implementation quicker and much, much easier. &lt;/p&gt;  &lt;p&gt;The &lt;a href="http://developer.yahoo.com/yui/" target="_blank"&gt;Yahoo! User Interface Library&lt;/a&gt;, available on the &lt;a href="http://developer.yahoo.com" target="_blank"&gt;Yahoo! Developer's Network&lt;/a&gt; web site is a library of reusable components that can be used to design and implement a web site using standard web technologies such as CSS and JavaScript. The current release of the Yahoo! User Interface Library (YUI) is version 2.5.2, but preview releases of version 3 have started to appear on the YUI web site. This post will focus on the 2.5.2 release.&lt;/p&gt;  &lt;h2&gt;Grading browsers&lt;/h2&gt;  &lt;p&gt;Yahoo!, being one of the largest and most used web sites on the Internet, has a lot of pressures as a web content provider. First, being Yahoo!, they have to support pretty much any user using almost any browser. Additionally, being Yahoo!, they have to make their web site look and function almost identical in any browser that can surf the web. Therefore, it's important for Yahoo! to have a standard mechanism for designing their web pages once without regard to the browser that's using it.&lt;/p&gt;  &lt;p&gt;To accomplish this goal, Yahoo! has defined various classifications of web browsers and identified what &lt;a href="http://developer.yahoo.com/yui/articles/gbs/" target="_blank"&gt;level of support each web browser has for the web standards&lt;/a&gt;. Yahoo! has defined three grades: A, C, and X for browsers. C-grade is the basic browser providing core services. C-grade browsers are highly accessible and use little or no decoration. Features such as CSS and JavaScript are not available in C-grade browsers. An example of a C-grade browser may be a text-only browser that might be used by someone that is visually impaired.&lt;/p&gt;  &lt;p&gt;An A-grade browser is going to be a major browser such as Microsoft Internet Explorer, Firefox, Opera, or Safari on the Mac.&amp;#160; A-grade browsers have high levels of support for rich web content including CSS and JavaScript.&lt;/p&gt;  &lt;p&gt;X-grade browsers are those rare or exotic browsers. Maybe someone named Dan creates his own browser named Dan's Browser. Support for the web standards may or may not be there, and may or may not have been tested very well. You may get Dan to browse your web site using his browser, but there's no way that you can test how compliant his browser is going to be with the web standards.&lt;/p&gt;  &lt;p&gt;In general, when designing a web site, you'll focus only on the A-grade browsers as those are the major browsers with the most market exposure that you want to support, unless of course your name is Dan and you have written your own browser, in which case you are going to focus on your X-grade browser.&lt;/p&gt;  &lt;h2&gt;Standardizing browser support&lt;/h2&gt;  &lt;p&gt;One of the biggest challenges in web design is getting a single page to look the same in each browser. Browsers, by their nature, are all different and implement and render HTML differently. Microsoft Internet Explorer may come pre-configured to use fonts, font sizes, and colors that are deemed to be &amp;quot;more standard&amp;quot; for the Windows platform. Safari may have settings that are more like the standard Mac look and feel. Firefox will have a different set of defaults for fonts, colors, and font sizes. Likewise, margins, padding, borders, and all other rendering features will have defaults that may or may not differ from the other browsers.&lt;/p&gt;  &lt;p&gt;The Yahoo! User Interface Library helps to normalize each of the browsers so that a page starts out with a single look-and-feel that is independent of browser differences. YUI does this by providing four CSS style sheets that neutralize the pre-defined browser style settings and defining a common set of base styles that will make a page look the same (within reason) regardless of the browser being used to view the web page.&lt;/p&gt;  &lt;p&gt;The YUI library provides four CSS style sheets that can be reused by other web sites:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;a title="Yahoo! User Interface Library Reset CSS" href="http://developer.yahoo.com/yui/reset/" target="_blank"&gt;Reset&lt;/a&gt;:&lt;/strong&gt; removes and neutralizes the inconsistent default styling of HTML elements, creating a level playing field across A-grade browsers and providing a source foundation upon which you can explicitly declare your intentions. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;a title="Yahoo! User Interface Library Fonts CSS" href="http://developer.yahoo.com/yui/fonts/" target="_blank"&gt;Fonts&lt;/a&gt;:&lt;/strong&gt; offers cross-browser typographical normalization and control. &lt;/li&gt;    &lt;li&gt;&lt;a title="Yahoo! User Interface Library Grids CSS" href="http://developer.yahoo.com/yui/grids/" target="_blank"&gt;&lt;strong&gt;Grids&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt; offers four preset page widths, six preset templates, and the ability to stack and next subdivided regions of two, three, or four columns. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;a title="Yahoo! User Interface Library Base CSS" href="http://developer.yahoo.com/yui/base/" target="_blank"&gt;Base&lt;/a&gt;:&lt;/strong&gt; applies a consistent style foundation for common HTML elements across A-grade browsers. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Using the YUI CSS style sheets, you can design and easily implement your basic web page layout without having to create your own style sheets or figure out the browser differences on your own. Later in this post, I'll walk you through using the YUI CSS style sheets in an ASP.NET application and using YUI to design and layout your web pages.&lt;/p&gt;  &lt;h2&gt;Integrating YUI with an ASP.NET web site&lt;/h2&gt;  &lt;p&gt;The first task when adding YUI to an ASP.NET web site is putting the YUI CSS style sheets in a place where they can be downloaded by the client web browser. There are three options available to you for adding the CSS style sheets to your web page:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Download the CSS style sheets directly from the Yahoo! web server &lt;/li&gt;    &lt;li&gt;Copy the style sheets into your ASP.NET application and reference the style sheets from your web pages &lt;/li&gt;    &lt;li&gt;Embed the style sheets into a .NET assembly and access them as a web resources &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Because of the way that I structure and use version control for my projects, the third option is actually the easiest for me. When I put projects under version control, I usually create a location in my version control repository where I will put third-party artifacts such as source code or binary files that I'll use in my programs. After placing the third-party artifacts into my version control repository, I will usually &amp;quot;branch them&amp;quot; into my project workspace. My version control repository might look something like the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;/Vendor/YahooUILibrary &lt;/li&gt;    &lt;li&gt;/ImaginaryRealities.com/Trunk/Libraries/YahooUILibrary &lt;/li&gt;    &lt;li&gt;/ImaginaryRealities.com/Trunk/SourceCode/www &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So, in the /Vendor/YahooUILibrary folder in my repository, I'll place the original YUI source code. My web site files are located in the /ImaginaryRealities.com/Trunk/SourceCode/www folder. I will then branch the YUI code from /Vendor/YahooUILibrary into the /ImaginaryRealities.com/Trunk/Libraries/YahooUILibrary folder. The trick now is that if I copy the CSS files from the /ImaginaryRealities.com/Trunk/Libraries/YahooUILibrary folder into the /ImaginaryRealities.com/Trunk/SourceCode/www folder, I'll lose the branch history with the copy and in the future I'd have to remember to do the manual copy. Not a good scenario, in my opinion.&lt;/p&gt;  &lt;p&gt;Instead, what I did was to create a new assembly that will store the current and future YUI artifacts as embedded resources and will access them in my web site and related components. Below is the code that I wrote for embedding the CSS files as resources:&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9fadd9c4-fce0-468a-b3a6-8dc6235634b6" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c"&gt;//------------------------------------------------------------------------
// &amp;lt;copyright file="YahooUIResources.cs"
//            company="ImaginaryRealities Software Company"&amp;gt;
// Copyright (c) 2008 ImaginaryRealities Software Company
// &amp;lt;/copyright&amp;gt;
// &amp;lt;summary&amp;gt;
// Implements the YahooUIResources class that defines constants for the
// names of the embedded Yahoo! User Interface Library resources.
// &amp;lt;/summary&amp;gt;
//------------------------------------------------------------------------

[assembly: System.Web.UI.WebResourceAttribute(
    ImaginaryRealities.Website.UI.Yahoo.UI.YahooUIResources.BaseName,
    "text/css")]
[assembly: System.Web.UI.WebResourceAttribute(
    ImaginaryRealities.Website.UI.Yahoo.UI.YahooUIResources.ResetFontsGridName,
    "text/css")]

namespace ImaginaryRealities.Website.UI.Yahoo.UI
{
    /// &amp;lt;summary&amp;gt;
    /// Defines constants for the names of the embedded Yahoo! User Interface
    /// Library resources.
    /// &amp;lt;/summary&amp;gt;
    public static class YahooUIResources
    {
        /// &amp;lt;summary&amp;gt;
        /// The name of the embedded resource containing the CSS definitions
        /// for the base.css style sheet.
        /// &amp;lt;/summary&amp;gt;
        public const string BaseName =
            BaseNamespaceName + "base-min.css";

        /// &amp;lt;summary&amp;gt;
        /// The name of the base namespace for the embedded resources.
        /// &amp;lt;/summary&amp;gt;
        private const string BaseNamespaceName =
            "ImaginaryRealities.Website.UI.Yahoo.UI.";

        /// &amp;lt;summary&amp;gt;
        /// The name of the embedded resource containing the CSS definitions
        /// for the reset-fonts-grids.css style sheet.
        /// &amp;lt;/summary&amp;gt;
        public const string ResetFontsGridName =
            BaseNamespaceName + "reset-fonts-grids.css";
    }
}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I added the YUI &lt;strong&gt;base-min.css&lt;/strong&gt; and &lt;strong&gt;reset-fonts-grids.css&lt;/strong&gt; files to my Visual Studio Class Library project as linked files and set the &lt;strong&gt;Build Action&lt;/strong&gt; property in Visual Studio to &lt;strong&gt;Embedded Resource&lt;/strong&gt; to make sure that the files were embedded into the generated assembly. I then used the &lt;strong&gt;WebResourceAttribute&lt;/strong&gt; attribute to define the files as embedded resources that could be served by ASP.NET. To make it easier to reference the embedded resources by name, as well as make any name changes if necessary in the future, I defined constants for the resource names. The only issue with using constants is that if the names change, then all dependent assemblies that use the constants will also have to be recompiled and redeployed, but to me that was a minor issue.&lt;/p&gt;

&lt;h2&gt;Designing a layout using YUI&lt;/h2&gt;

&lt;p&gt;We'll actually use the YUI CSS style sheets in a moment, but I first wanted to go over how a standard layout is built in HTML using the YUI CSS style sheets. A typical web page using YUI would have the following structure:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1033a8af-68c9-487c-a03e-177907106b01" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;link rel="stylesheet" type="text/css" href="reset-fonts-grids.css"/&amp;gt;
    &amp;lt;link rel="stylesheet" type="text/css" href="base-min.css"/&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div id="doc"&amp;gt;
        &amp;lt;div id="hd"&amp;gt;&amp;lt;!-- header --&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div id="bd"&amp;gt;&amp;lt;!-- body --&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div id="ft"&amp;gt;&amp;lt;!-- footer --&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This HTML sample shows that the web page, or document, has three areas: a header or masthead, the body content, and a footer. The header is the typical top part of a page where the branding, menus, and other special content will go on the page. The body is where the main content for the web page will appear. A footer is present and is typically used for a copyright statement and other navigation features or links that the web site may provide. In ASP.NET, you may typically use master pages (as we will soon) to provide the content for the header and footer.&lt;/p&gt;

&lt;p&gt;The main DIV tag with the identifier of &amp;quot;doc&amp;quot; is used to control the relative width of the web page. When I write width, I specially mean the width of the content on the page. Depending on the size of the browser window, the content may be wider or smaller than the width of the window. If the browser window is maximized and is bigger than the content area, then the content area will be centered within the browser window.&lt;/p&gt;

&lt;p&gt;The YUI Grids CSS style sheet defines four standard widths for web pages:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:08cb839b-3981-47e2-ae7a-019eff7bc3dd" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;!-- The page will be 750 pixels wide and centered --&amp;gt;
&amp;lt;div id="doc"&amp;gt;...&amp;lt;/div&amp;gt;

&amp;lt;!-- The page will be 950 pixels wide and centered --&amp;gt;
&amp;lt;div id="doc2"&amp;gt;...&amp;lt;/div&amp;gt;

&amp;lt;!-- The page will be 100% of the width of the window --&amp;gt;
&amp;lt;div id="doc3"&amp;gt;...&amp;lt;/div&amp;gt;

&amp;lt;!-- The page will be 974 pixels wide and centered --&amp;gt;
&amp;lt;div id="doc4"&amp;gt;...&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can also define your own custom widths for your web pages. See &lt;a title="Customizing the page width" href="http://developer.yahoo.com/yui/grids/#custom_page_width" target="_blank"&gt;these instructions&lt;/a&gt; for how to set up your custom page width in a CSS style sheet.&lt;/p&gt;

&lt;p&gt;Once the page width is set, we can look at how to structure the internal body content of the web page. The Yahoo! designers have recognized that a common pattern on the web is to define two main areas of a page. The first area is used for the main page content. The second area is for additional, secondary content, such as a navigation bar or widget bar that may also appear on the page. To make life easier, the YUI Grids CSS style sheet provides built-in support for this common template.&amp;#160; Our markup from above can be enhanced to look like the following:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:fa2f41dd-4027-4a84-9f3d-3c6623e30cb7" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;link rel="stylesheet" type="text/css" href="reset-fonts-grids.css"/&amp;gt;
    &amp;lt;link rel="stylesheet" type="text/css" href="base-min.css"/&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div id="doc4" class="yui-t1"&amp;gt;
        &amp;lt;div id="hd"&amp;gt;&amp;lt;!-- header --&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div id="bd"&amp;gt;
            &amp;lt;div id="yui-main"&amp;gt;
                &amp;lt;div class="yui-b"&amp;gt;&amp;lt;!-- main content --&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="yui-b"&amp;gt;&amp;lt;!-- secondary content --&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div id="ft"&amp;gt;&amp;lt;!-- footer --&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You'll notice from the above example that we've added more to the &lt;strong&gt;bd&lt;/strong&gt; DIV element in the HTML. Specifically, we've added two blocks (the DIVs with the &lt;strong&gt;yui-b&lt;/strong&gt; CSS class name). One of the DIVs is contained inside of a DIV with the identifier of &lt;strong&gt;yui-main&lt;/strong&gt;. This identifier is used to mark which of the two blocks in the template contains the main content for the web page. The other block DIV will be selected to be used for secondary content.&lt;/p&gt;

&lt;p&gt;The placement and size of the blocks on the page are controlled through the new CSS class defined on the main document DIV. The YUI Grid CSS style sheet defines six CSS classes that control both the width of the main and secondary content columns, and their placement with regard to the other:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;yui-t1:&lt;/strong&gt; the secondary content is 160 pixels wide and is placed on the left side of the page.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;yui-t2:&lt;/strong&gt; the secondary content is 180 pixels wide and is placed on the left side of the page.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;yui-t3:&lt;/strong&gt; the secondary content is 300 pixels wide and is placed on the left side of the page.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;yui-t4:&lt;/strong&gt; the secondary content is 180 pixels wide and is placed on the right side of the page.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;yui-t5:&lt;/strong&gt; the secondary content is 240 pixels wide and is placed on the right side of the page.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;yui-t6:&lt;/strong&gt; the secondary content is 300 pixels wide and is placed on the right side of the page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You may be asking yourself why Yahoo! chose to use these arbitrary placements and sizes. Why not offer a 160 pixel column on the right side of the screen? Or how about a 240 pixel column on the left side of the screen? Like everything else in the world, this decision was driven by money. Specifically, advertisement money. These columns match the &lt;a title="Standard IAB ad unit dimensions" href="http://www.iab.net/iab_products_and_industry_services/1421/1443/1452" target="_blank"&gt;standard dimensions for online advertisements&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Other considerations for implementing web page designs&lt;/h2&gt;

&lt;p&gt;Before we get into the ASP.NET code that I wrote to support the YUI Grids, I thought that I'd go through a couple of other items that I typically do with my web pages. When I build web sites, I typically add an identifier and some CSS classes to the main BODY tag of the HTML page for the purpose of customizing CSS rendering for the web site or page.&lt;/p&gt;

&lt;p&gt;First, I set the &lt;strong&gt;id&lt;/strong&gt; attribute of the BODY tag to the domain name of the web site, with the dots in the domain name replaced with dashes. So, for example, the pages on &lt;a href="http://www.imaginaryrealities.com"&gt;www.imaginaryrealities.com&lt;/a&gt; (when the new web site is published) will have the identifier &lt;strong&gt;www-imaginaryrealities-com&lt;/strong&gt;. The purpose of setting this value as the identifier is that it will make it easier for consumers of my web site to customize my pages to meet their needs. For example, if someone browses my web site, but thinks that the text is too small, this person could create a custom style sheet using Internet Explorer and set my fonts to a larger size to make my pages easier for him to read. Because all of the pages on my web site will have the same identifier, the custom style sheet rules would apply to my entire site.&lt;/p&gt;

&lt;p&gt;Next, I add CSS attributes to the BODY tag of the HTML page to communicate the following information:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The page type. For example, is the page the home page, a contact page, a news page, etc.?&lt;/li&gt;

  &lt;li&gt;The language of the client browser. For example, English, Spanish, Italian.&lt;/li&gt;

  &lt;li&gt;The locale of the client browser. For example, United States, Russia, Italy, United Kingdom, Germany, Brazil.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The page type class is going to be in the form of &lt;strong&gt;page-home&lt;/strong&gt; or &lt;strong&gt;page-contact&lt;/strong&gt;. It's going to be used in my CSS or in a custom CSS style sheet to implement page-specific customizations. I may want the colors for the home page and a special announcement page to be different, or the layouts to be different. Using these page styles, I can customize the look-and-feel of specific pages on my web site.&lt;/p&gt;

&lt;p&gt;The language and locale classes are going to be in the form of &lt;strong&gt;la-en&lt;/strong&gt; for English, or &lt;strong&gt;la-it&lt;/strong&gt; for Italian, or &lt;strong&gt;lo-US&lt;/strong&gt; for the United States, or &lt;strong&gt;lo-MX&lt;/strong&gt; for Mexico, for example. These CSS classes will let me create culture-specific customizations for my web site to make the web site more attractive for those browsing my web site. For example, maybe I would want United States readers to see a picture of the U.S. flag, and Mexico readers to see the Mexican flag. I could swap the images using CSS.&lt;/p&gt;

&lt;p&gt;Given this, the HTML BODY tag would look like this in the page:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:92138bfa-6a41-407d-a8c6-d7f1e17eeac4" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;body id="www-imaginaryrealities-com" class="page-home la-en lo-US"&amp;gt;
    .
    .
    .
&amp;lt;/body&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With that now hopefully understood, I'll show you how I built an ASP.NET framework to support the YUI Grids layouts.&lt;/p&gt;

&lt;h2&gt;Configuring the web site&lt;/h2&gt;

&lt;p&gt;In the previous sections, I have you several choices that you would have to decide on when designing your web page. First, there's the identifier that you're going to use to identify your pages from Joe Bob's pages. Second, there's the document identifier that controls the width of the page content. Third, there's the width and position of the secondary content related to the page. Now, these could be hard coded into your web pages, but I see an opportunity to support changing or customizing these values site-wide. It would be nice to have those settings in a single place with the option of applying page-specific overrides. If in the future you decided that you wanted to change your width, or if Yahoo! puts out a new release with a new width greater than 974 pixels that you want to use for your pages, you can change it in a single place.&lt;/p&gt;

&lt;p&gt;The single point of configuration for these values is actually going to be the &lt;strong&gt;Web.config&lt;/strong&gt; configuration file for your web site:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f0ec837d-5397-4b55-bc69-57012c723949" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
&amp;lt;configuration&amp;gt;
    &amp;lt;configSections&amp;gt;
        &amp;lt;section name="website"
                 type="ImaginaryRealities.Website.UI.Framework.WebsiteConfigurationSection, ImaginaryRealities.Website.UI.Framework, Version=0.1.0.0, Culture=neutral, PublicKeyToken=2f305c1a71c9f418"/&amp;gt;
    &amp;lt;/configSections&amp;gt;
    &amp;lt;website pageId="www-imaginaryrealities-com" pageWidth="doc" template="yui-t1"/&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I defined a custom configuration section class that will store the default site-wide values for these three options:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e0ad1e04-a63a-4f15-81cd-cda351aa8b84" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;//------------------------------------------------------------------------
// &amp;lt;copyright file="WebsiteConfigurationSection.cs"
//            company="ImaginaryRealities Software Company"&amp;gt;
// Copyright (c) 2008 ImaginaryRealities Software Company
// &amp;lt;/copyright&amp;gt;
// &amp;lt;summary&amp;gt;
// Implements the WebsiteConfigurationSection class that is used to
// configure information about the website.
// &amp;lt;/summary&amp;gt;
//------------------------------------------------------------------------

namespace ImaginaryRealities.Website.UI.Framework
{
    using System.Configuration;
    using Wintellect.Diagnostics;

    /// &amp;lt;summary&amp;gt;
    /// Configuration section that is used to configure the website.
    /// &amp;lt;/summary&amp;gt;
    [CodeOwner("Michael F. Collins, III", "michael@imaginaryrealities.com")]
    public class WebsiteConfigurationSection : ConfigurationSection
    {
        /// &amp;lt;summary&amp;gt;
        /// The name of the configuration property for the
        /// &amp;lt;see cref="PageId"/&amp;gt; property.
        /// &amp;lt;/summary&amp;gt;
        private const string PageIdPropertyName = "pageId";

        /// &amp;lt;summary&amp;gt;
        /// The name of the configuration property for the
        /// &amp;lt;see cref="PageWidth"/&amp;gt; property.
        /// &amp;lt;/summary&amp;gt;
        private const string PageWidthPropertyName = "pageWidth";

        /// &amp;lt;summary&amp;gt;
        /// The name of the configuration property for the
        /// &amp;lt;see cref="Template"/&amp;gt; property.
        /// &amp;lt;/summary&amp;gt;
        private const string TemplatePropertyName = "template";

        /// &amp;lt;summary&amp;gt;
        /// Gets or sets the identifier to use for the website pages.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is used as the identifier for the
        /// &amp;lt;c&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/c&amp;gt; element of the web page.
        /// &amp;lt;/value&amp;gt;
        [ConfigurationProperty(PageIdPropertyName, IsRequired = true)]
        public string PageId
        {
            get
            {
                return (string)this[PageIdPropertyName];
            }

            set
            {
                this[PageIdPropertyName] = value;
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets or sets the default page width for the website pages.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is a valid id used by the Yahoo! User
        /// Interface Library to specify or control the width of the rendered
        /// web page.
        /// &amp;lt;/value&amp;gt;
        [ConfigurationProperty(
            PageWidthPropertyName,
            DefaultValue = "doc",
            IsRequired = false)]
        public string PageWidth
        {
            get
            {
                return (string)this[PageWidthPropertyName];
            }

            set
            {
                this[PageWidthPropertyName] = value;
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets or sets the default template for the website pages.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is a valid CSS identifier of a Yahoo!
        /// User Interface Library Grids template.
        /// &amp;lt;/value&amp;gt;
        [ConfigurationProperty(
            TemplatePropertyName,
            DefaultValue = "yui-t1",
            IsRequired = false)]
        public string Template
        {
            get
            {
                return (string)this[TemplatePropertyName];
            }

            set
            {
                this[TemplatePropertyName] = value;
            }
        }
    }
}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The only required property for the configuration is the identifier to use for the pages. I default the &lt;strong&gt;pageWidth&lt;/strong&gt; and &lt;strong&gt;template&lt;/strong&gt; configuration properties to &lt;strong&gt;doc&lt;/strong&gt; and &lt;strong&gt;yui-t1&lt;/strong&gt; respectively.&lt;/p&gt;

&lt;p&gt;We'll use these configuration settings in the page definitions below:&lt;/p&gt;

&lt;h2&gt;Creating a base page type&lt;/h2&gt;

&lt;p&gt;For every page that we develop, we're going to need the name of the CSS class representing the page or page type, and the value to use to control the width of the page. By default, the width of the page will come from the configuration section that I defined in the previous section, but I want to leave the option open for a page designer to choose a different width or a custom width for a specific page. But since I know that I need the page CSS class and the page width value, and I know that I'll need these values for every page, I'm going to create a new subclass of the &lt;strong&gt;System.Web.UI.Page&lt;/strong&gt; class that I'll use as the base class for every page in my web site. Here's the code for my custom web page base class:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0ef15540-2a8b-48e9-a2c4-f0ff1e1a7f7d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;//------------------------------------------------------------------------
// &amp;lt;copyright file="WebsitePage.cs"
//            company="ImaginaryRealities Software Company"&amp;gt;
// Copyright (c) 2008 ImaginaryRealities Software Company
// &amp;lt;/copyright&amp;gt;
// &amp;lt;summary&amp;gt;
// Implements the WebsitePage abstract base class that is used as the base
// class for all web pages on the web site.
// &amp;lt;/summary&amp;gt;
//------------------------------------------------------------------------

namespace ImaginaryRealities.Website.UI.Framework
{
    using System.Web.Configuration;
    using System.Web.UI;
    using Wintellect.Diagnostics;

    /// &amp;lt;summary&amp;gt;
    /// Abstract base class for web pages in the website.
    /// &amp;lt;/summary&amp;gt;
    [CodeOwner("Michael F. Collins, III", "michael@imaginaryrealities.com")]
    public abstract class WebsitePage : Page
    {
        /// &amp;lt;summary&amp;gt;
        /// Initializes a new instance of the WebsitePage class.
        /// &amp;lt;/summary&amp;gt;
        protected WebsitePage()
        {
            this.InitializePageWidth();
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the CSS class name for the web page.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the name of the CSS class that
        /// represents the specific web page.
        /// &amp;lt;/value&amp;gt;
        public abstract string PageCssClassName
        {
            get;
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the identifier that is used to specify the width of the
        /// web page.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the identifier that is used to
        /// specify the width of the content area of the web page.
        /// &amp;lt;/value&amp;gt;
        public string PageWidth
        {
            get;
            protected set;
        }

        /// &amp;lt;summary&amp;gt;
        /// Initializes the &amp;lt;see cref="PageWidth"/&amp;gt; property by loading the
        /// default page width from the website configuration.
        /// &amp;lt;/summary&amp;gt;
        private void InitializePageWidth()
        {
            var configurationSection = (WebsiteConfigurationSection)
                WebConfigurationManager.GetSection("website");
            this.PageWidth =
                configurationSection != null
                    ? configurationSection.PageWidth
                    : "doc";
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;My &lt;strong&gt;WebsitePage&lt;/strong&gt; base class defines two properties: &lt;strong&gt;PageCssClassName&lt;/strong&gt; and &lt;strong&gt;PageWidth&lt;/strong&gt; that contain the values that I'll need for rendering my page. By default, the &lt;strong&gt;PageWidth&lt;/strong&gt; value is initialized with the value from the web site's &lt;strong&gt;Web.config&lt;/strong&gt; configuration file. But there is a protected setter that will allow a page to set a custom value before the page is rendered.&lt;/p&gt;

&lt;p&gt;Now that I have this class defined, I can require that the &lt;strong&gt;WebsitePage&lt;/strong&gt; class be used as the base class for all pages in my web site by updating the &lt;strong&gt;Web.config&lt;/strong&gt; file:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:eafae6cb-49e0-4810-bc95-33caf5b0d1aa" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;configuration&amp;gt;
    &amp;lt;system.web&amp;gt;
        &amp;lt;pages pageBaseType="ImaginaryRealities.Website.UI.Framework.WebsitePage, ImaginaryRealities.Website.UI.Framework, Version=0.1.0.0, Culture=neutral, PublicKeyToken=2f305c1a71c9f418"&amp;gt;
            .
            .
            .
        &amp;lt;/pages&amp;gt;
    &amp;lt;/system.web&amp;gt;
&amp;lt;/configuration&amp;gt; &lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;By setting the &lt;strong&gt;pages/pageBaseType&lt;/strong&gt; attribute, the ASP.NET compiler will throw an error if a web page is not a subclass of the &lt;strong&gt;WebsitePage&lt;/strong&gt; class.&lt;/p&gt;

&lt;h2&gt;Creating master pages for the web site&lt;/h2&gt;

&lt;p&gt;A cool feature that has been part of ASP.NET since the 2.0 release is master pages. Master pages allow a developer to create a common template for web pages that can be reused over and over again for multiple pages. Master pages work perfectly with what we're trying to do in terms of using the YUI Grids for our layout. We want to define one or more layouts and reuse them with different content.&lt;/p&gt;

&lt;p&gt;Before we define our master pages, however, we need to take a look again at the common information that appears on every page just like we did in the last section. In the last section, we looked at page-specific attributes. But when we're creating master pages, we need to consider the global site attributes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The URL of the YUI Reset, Font, and Grid CSS style sheet.&lt;/li&gt;

  &lt;li&gt;The URL of the YUI Base CSS style sheet.&lt;/li&gt;

  &lt;li&gt;The side-wide page identifier (&lt;strong&gt;www-imaginaryrealities-com&lt;/strong&gt;)&lt;/li&gt;

  &lt;li&gt;The name of the CSS class identifying the browser's language (&lt;strong&gt;la-en&lt;/strong&gt;)&lt;/li&gt;

  &lt;li&gt;The name of the CSS class identifying the browser's locale (&lt;strong&gt;lo-US&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since these are going to be used on every web page, I also defined a base class that I'll use for any master pages that I define for the web site:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6107f612-6d64-465f-9911-353b9d45b77f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;//------------------------------------------------------------------------
// &amp;lt;copyright file="WebsiteMasterPage.cs"
//            company="ImaginaryRealities Software Company"&amp;gt;
// Copyright (c) 2008 ImaginaryRealities Software Company
// &amp;lt;/copyright&amp;gt;
// &amp;lt;summary&amp;gt;
// Implements the WebsiteMasterPage abstract base class that is used as
// the base class for top-level master pages in the website.
// &amp;lt;/summary&amp;gt;
//------------------------------------------------------------------------

namespace ImaginaryRealities.Website.UI.Framework
{
    using System;
    using System.Configuration;
    using System.Diagnostics.CodeAnalysis;
    using System.Globalization;
    using System.Web.Configuration;
    using System.Web.UI;
    using Wintellect.Diagnostics;
    using Yahoo.UI;

    /// &amp;lt;summary&amp;gt;
    /// Abstract base class for top-level master pages used in the website.
    /// &amp;lt;/summary&amp;gt;
    [CodeOwner("Michael F. Collins, III", "michael@imaginaryrealities.com")]
    public abstract class WebsiteMasterPage : MasterPage
    {
        /// &amp;lt;summary&amp;gt;
        /// Initializes a new instance of the WebsiteMasterPage class.
        /// &amp;lt;/summary&amp;gt;
        protected WebsiteMasterPage()
        {
            this.InitializeGlobalizationProperties();
            this.InitializePageId();
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets a reference to the &amp;lt;see cref="WebsitePage"/&amp;gt; object that is
        /// using the master page.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the page that is using the master
        /// page, cast to a &amp;lt;see cref="WebsitePage"/&amp;gt; object.
        /// &amp;lt;/value&amp;gt;
        public new WebsitePage Page
        {
            get
            {
                return (WebsitePage)base.Page;
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the URL of the web resource containing the CSS for the base
        /// style sheet defined by the Yahoo! User Interface Library.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the URL where the YUI Base CSS
        /// style sheet can be downloaded.
        /// &amp;lt;/value&amp;gt;
        [SuppressMessage(
            "Microsoft.Design",
            "CA1056:UriPropertiesShouldNotBeStrings",
            Justification = "This property is data bound and works better as a string.")]
        protected string BaseCssUrl
        {
            get
            {
                return this.Page.ClientScript.GetWebResourceUrl(
                    typeof(YahooUIResources),
                    YahooUIResources.BaseName);
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the name of the CSS class representing the language of the
        /// client browser.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the name of the CSS class that
        /// represents the language of the client browser.
        /// &amp;lt;/value&amp;gt;
        protected string LanguageCssClassName
        {
            get;
            private set;
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the name of the CSS class representing the locale of the
        /// client browser.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the name of the CSS class that
        /// represents the locale of the client browser.
        /// &amp;lt;/value&amp;gt;
        protected string LocaleCssClassName
        {
            get;
            private set;
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the URL of the web resource containing the CSS for the combined
        /// Reset, Font, and Grid style sheets from the Yahoo! User Interface
        /// Library.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the URL where the YUI Reset, Font,
        /// and Grid CSS style sheet can be downloaded from.
        /// &amp;lt;/value&amp;gt;
        [SuppressMessage(
            "Microsoft.Design",
            "CA1056:UriPropertiesShouldNotBeStrings",
            Justification = "This property is data bound and works better as a string.")]
        protected string ResetFontGridsCssUrl
        {
            get
            {
                return this.Page.ClientScript.GetWebResourceUrl(
                    typeof(YahooUIResources),
                    YahooUIResources.ResetFontsGridName);
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the identifier of the web page.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the identifier that will be used for
        /// the &amp;lt;c&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/c&amp;gt; element of the page.
        /// &amp;lt;/value&amp;gt;
        protected string PageId
        {
            get;
            private set;
        }

        /// &amp;lt;summary&amp;gt;
        /// Data binds the properties on the master page with the master page.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="e"&amp;gt;
        /// The event arguments.
        /// &amp;lt;/param&amp;gt;
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            this.DataBind();
        }

        /// &amp;lt;summary&amp;gt;
        /// Initializes the &amp;lt;see cref="LanguageCssClassName"/&amp;gt; and
        /// &amp;lt;see cref="LocaleCssClassName"/&amp;gt; properties with their values
        /// based on the client browser's culture settings.
        /// &amp;lt;/summary&amp;gt;
        private void InitializeGlobalizationProperties()
        {
            var cultureInfo = CultureInfo.CurrentUICulture;
            var parts = cultureInfo.Name.Split('-');
            if (parts.Length &amp;gt; 0)
            {
                this.LanguageCssClassName = "la-" + parts[0];
                this.LocaleCssClassName =
                    parts.Length &amp;gt; 1 ? "lo-" + parts[1] : String.Empty;
            }
            else
            {
                this.LanguageCssClassName = String.Empty;
                this.LocaleCssClassName = String.Empty;
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Initializes the &amp;lt;see cref="PageId"/&amp;gt; property
        /// from the configuration settings for the website.
        /// &amp;lt;/summary&amp;gt;
        private void InitializePageId()
        {
            var configurationSection = (WebsiteConfigurationSection)
                WebConfigurationManager.GetSection("website");
            if (configurationSection == null)
            {
                throw new ConfigurationErrorsException(
                    Properties.Resources.MissingWebsiteConfigurationSection);
            }

            this.PageId = configurationSection.PageId;
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I also defined an override of the &lt;strong&gt;Page&lt;/strong&gt; property on the master page class. I wanted to return the &lt;strong&gt;Page&lt;/strong&gt; object cast as a &lt;strong&gt;WebsitePage&lt;/strong&gt; object, since all pages will have to derive from &lt;strong&gt;WebsitePage&lt;/strong&gt;. I'll show you how this is used in the next section.&lt;/p&gt;

&lt;h2&gt;Implement the master page&lt;/h2&gt;

&lt;p&gt;With our base classes defined, we can now implement our first master page. In this post, I'll be showing two master pages. The first master page that I'm going to present now just uses the basic Grid layout without either a main or secondary content area defined. The second master page that I'll show later in this post will use the template settings to implement the main and secondary content areas.&lt;/p&gt;

&lt;p&gt;My first master page, with just the basic YUI Grids layout, looks like this:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:490cd090-7271-4063-8850-a14547dac1a2" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %&amp;gt;

&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;
&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;
&amp;lt;head runat="server"&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;link rel="Stylesheet" type="text/css" href="&amp;lt;%# ResetFontGridsCssUrl %&amp;gt;" /&amp;gt;
    &amp;lt;link rel="Stylesheet" type="text/css" href="&amp;lt;%# BaseCssUrl %&amp;gt;" /&amp;gt;
    &amp;lt;asp:ContentPlaceHolder ID="HeadPlaceHolder" runat="server"&amp;gt;
    &amp;lt;/asp:ContentPlaceHolder&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body id="&amp;lt;%# PageId %&amp;gt;" class="&amp;lt;%# Page.PageCssClassName %&amp;gt; &amp;lt;%# LanguageCssClassName %&amp;gt; &amp;lt;%# LocaleCssClassName %&amp;gt;"&amp;gt;
    &amp;lt;div id="&amp;lt;%# Page.PageWidth %&amp;gt;"&amp;gt;
        &amp;lt;form id="PageForm" runat="server"&amp;gt;
        &amp;lt;div id="hd"&amp;gt;
            &amp;lt;asp:ContentPlaceHolder ID="HeaderPlaceHolder" runat="server"&amp;gt;
                Header
            &amp;lt;/asp:ContentPlaceHolder&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div id="bd"&amp;gt;
            &amp;lt;asp:ContentPlaceHolder ID="BodyPlaceHolder" runat="server"&amp;gt;
            &amp;lt;/asp:ContentPlaceHolder&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div id="ft"&amp;gt;
            &amp;lt;asp:ContentPlaceHolder ID="FooterPlaceHolder" runat="server"&amp;gt;
                Footer
            &amp;lt;/asp:ContentPlaceHolder&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Notice in this page that I am using the ASP.NET data binding syntax (&lt;strong&gt;&amp;lt;%#...%&amp;gt;&lt;/strong&gt;) to bind the property values from the &lt;strong&gt;WebsitePage&lt;/strong&gt; and &lt;strong&gt;WebsiteMasterPage&lt;/strong&gt; classes into the rendered HTML. If you look back at the code for the &lt;strong&gt;WebsiteMasterPage&lt;/strong&gt; class, you'll notice that I implemented the &lt;strong&gt;OnLoad&lt;/strong&gt; method to call the &lt;strong&gt;DataBind&lt;/strong&gt; method. By using the ASP.NET data binding syntax and then calling the &lt;strong&gt;DataBind&lt;/strong&gt; method when the page is loaded, I can automatically insert the values for these properties and the URLs for the YUI CSS style sheets into the rendered HTML. It's a very cool trick for adding property values to web pages.&lt;/p&gt;

&lt;p&gt;The code-beside class for the master page is very basic:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:bcf8fd36-227b-427d-9ce3-27bc7a98fae8" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;//------------------------------------------------------------------------
// &amp;lt;copyright file="MasterPage.master.cs"
//            company="ImaginaryRealities Software Company"&amp;gt;
// Copyright (c) 2008 ImaginaryRealities Software Company
// &amp;lt;/copyright&amp;gt;
// &amp;lt;summary&amp;gt;
// Implements the MasterPage class that controls the presentation of the
// master page template.
// &amp;lt;/summary&amp;gt;
//------------------------------------------------------------------------

using System;
using ImaginaryRealities.Website.UI.Framework;
using Wintellect.Diagnostics;

/// &amp;lt;summary&amp;gt;
/// Controls the presentation logic for the website's master page.
/// &amp;lt;/summary&amp;gt;
[CodeOwner("Michael F. Collins, III", "michael@imaginaryrealities.com")]
public partial class MasterPage : WebsiteMasterPage
{
    /// &amp;lt;summary&amp;gt;
    /// Initializes the master page.
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name="sender"&amp;gt;The master page object.&amp;lt;/param&amp;gt;
    /// &amp;lt;param name="e"&amp;gt;The event arguments.&amp;lt;/param&amp;gt;
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Implementing a master page for templates&lt;/h2&gt;

&lt;p&gt;The other master page that we'll implement will provide the definitions of the main and secondary content areas. First, I defined a new subclass of &lt;strong&gt;WebsitePage&lt;/strong&gt; called &lt;strong&gt;TemplateWebsitePage&lt;/strong&gt; which defines a new property named &lt;strong&gt;Template&lt;/strong&gt; which provides the value that controls the size and placement of the secondary content area (i.e. &lt;strong&gt;yui-t1&lt;/strong&gt;). Any web page that uses the template will be derived from &lt;strong&gt;TemplateWebsitePage&lt;/strong&gt;. The code for the &lt;strong&gt;TemplateWebsitePage&lt;/strong&gt; class is below:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ae692ff5-7d9a-42e2-a7ca-7b377cce47c8" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;//------------------------------------------------------------------------
// &amp;lt;copyright file="TemplateWebsitePage.cs"
//            company="ImaginaryRealities Software Company"&amp;gt;
// Copyright (c) 2008 ImaginaryRealities Software Company
// &amp;lt;/copyright&amp;gt;
// &amp;lt;summary&amp;gt;
// Implements the TemplateWebsitePage abstract base class that is used as
// the base class for web pages that are based on the Yahoo! Grid template
// structure.
// &amp;lt;/summary&amp;gt;
//------------------------------------------------------------------------

namespace ImaginaryRealities.Website.UI.Framework
{
    using System.Web.Configuration;
    using Wintellect.Diagnostics;

    /// &amp;lt;summary&amp;gt;
    /// Abstract base class for website pages that are based on the Yahoo!
    /// Grids template structure.
    /// &amp;lt;/summary&amp;gt;
    [CodeOwner("Michael F. Collins, III", "michael@imaginaryrealities.com")]
    public abstract class TemplateWebsitePage : WebsitePage
    {
        /// &amp;lt;summary&amp;gt;
        /// Initializes a new instance of the TemplateWebsitePage class.
        /// &amp;lt;/summary&amp;gt;
        protected TemplateWebsitePage()
        {
            this.InitializeTemplate();
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the CSS identifier for the Yahoo! Grids template to apply
        /// to the web page.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        /// The value of this property is the name of a CSS identifier that
        /// will be embedded in the web page to apply a Grids template style
        /// to the web page.
        /// &amp;lt;/value&amp;gt;
        public string Template
        {
            get;
            protected set;
        }

        /// &amp;lt;summary&amp;gt;
        /// Loads the default template setting from the website configuration.
        /// &amp;lt;/summary&amp;gt;
        private void InitializeTemplate()
        {
            var configurationSection = (WebsiteConfigurationSection)
                WebConfigurationManager.GetSection("website");
            this.Template =
                (configurationSection != null)
                    ? configurationSection.Template
                    : "yui-t1";
        }
    }
}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The new master page that will provide the YUI Grid template looks like this:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1165e628-5ff3-4eea-afd5-d4dad6742dad" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@ Master Language="C#" AutoEventWireup="true" CodeFile="TemplateMasterPage.master.cs"
    Inherits="TemplateMasterPage" %&amp;gt;

&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;
&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;
&amp;lt;head id="Head1" runat="server"&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;link rel="Stylesheet" type="text/css" href="&amp;lt;%# ResetFontGridsCssUrl %&amp;gt;" /&amp;gt;
    &amp;lt;link rel="Stylesheet" type="text/css" href="&amp;lt;%# BaseCssUrl %&amp;gt;" /&amp;gt;
    &amp;lt;asp:ContentPlaceHolder ID="HeadPlaceHolder" runat="server"&amp;gt;
    &amp;lt;/asp:ContentPlaceHolder&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body id="&amp;lt;%# PageId %&amp;gt;" class="&amp;lt;%# Page.PageCssClassName %&amp;gt; &amp;lt;%# LanguageCssClassName %&amp;gt; &amp;lt;%# LocaleCssClassName %&amp;gt;"&amp;gt;
    &amp;lt;div id="&amp;lt;%# Page.PageWidth %&amp;gt;" class="&amp;lt;%# Page.Template %&amp;gt;"&amp;gt;
        &amp;lt;form id="PageForm" runat="server"&amp;gt;
        &amp;lt;div id="hd"&amp;gt;
            &amp;lt;asp:ContentPlaceHolder ID="HeaderPlaceHolder" runat="server"&amp;gt;
                Header
            &amp;lt;/asp:ContentPlaceHolder&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div id="bd"&amp;gt;
            &amp;lt;div id="yui-main"&amp;gt;
                &amp;lt;div class="yui-b"&amp;gt;
                    &amp;lt;asp:ContentPlaceHolder ID="MainContentPlaceHolder" runat="server"&amp;gt;
                        Main content
                    &amp;lt;/asp:ContentPlaceHolder&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="yui-b"&amp;gt;
                &amp;lt;asp:ContentPlaceHolder ID="SecondaryContentPlaceHolder" runat="server"&amp;gt;
                    Secondary content
                &amp;lt;/asp:ContentPlaceHolder&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div id="ft"&amp;gt;
            &amp;lt;asp:ContentPlaceHolder ID="FooterPlaceHolder" runat="server"&amp;gt;
                Footer
            &amp;lt;/asp:ContentPlaceHolder&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Again, I'm using ASP.NET data binding to get the property values into the rendered HTML.&lt;/p&gt;

&lt;p&gt;The code-beside class file for the template master page has a little more to it than the previous master page:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7104023a-419c-4b68-a1a1-850ecfba1c47" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;//------------------------------------------------------------------------
// &amp;lt;copyright file="TemplateMasterPage.master.cs"
//            company="ImaginaryRealities Software Company"&amp;gt;
// Copyright (c) 2008 ImaginaryRealities Software Company
// &amp;lt;/copyright&amp;gt;
// &amp;lt;summary&amp;gt;
// Implements the TemplateMasterPage class that controls the presentation
// of the template-based master page.
// &amp;lt;/summary&amp;gt;
//------------------------------------------------------------------------

using System;
using ImaginaryRealities.Website.UI.Framework;
using Wintellect.Diagnostics;

/// &amp;lt;summary&amp;gt;
/// Implements the presentation logic for the template-based master page.
/// &amp;lt;/summary&amp;gt;
[CodeOwner("Michael F. Collins, III", "michael@imaginaryrealities.com")]
public partial class TemplateMasterPage : WebsiteMasterPage
{
    /// &amp;lt;summary&amp;gt;
    /// Gets a reference to the &amp;lt;see cref="TemplateWebsitePage"/&amp;gt; object that
    /// is using the master page.
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;value&amp;gt;
    /// The value of this property is a reference to the page object that is
    /// using the master page, cast to a &amp;lt;see cref="TemplateWebsitePage"/&amp;gt;
    /// object.
    /// &amp;lt;/value&amp;gt;
    public new TemplateWebsitePage Page
    {
        get
        {
            return (TemplateWebsitePage)base.Page;
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// Initializes the master page.
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name="sender"&amp;gt;The master page object.&amp;lt;/param&amp;gt;
    /// &amp;lt;param name="e"&amp;gt;The event arguments.&amp;lt;/param&amp;gt;
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Just as I did earlier with the &lt;strong&gt;WebsiteMasterPage&lt;/strong&gt; base class, I created a new override of the &lt;strong&gt;Page&lt;/strong&gt; property to provide a &lt;strong&gt;TemplateWebsitePage&lt;/strong&gt; object for access and data binding purposes.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;In this post, I introduced you to the Yahoo! User Interface Library and its CSS style sheets that will help you to design and organize your web pages using a pre-built open source framework. While we didn't cover all of the features available in the Grids CSS, we were able to build two master pages that will support a basic page framework. In future posts, we'll explore more of the options that the Grids CSS style sheet gives us for designing web pages and organizing web page content.&lt;/p&gt;&lt;div class="socialBookmarksContainer"&gt;&lt;a rel="nofollow" href="http://digg.com/submit/?url=http://www.imaginaryrealities.com/post/2008/09/12/Designing-a-web-site-using-the-Yahoo!-User-Interface-Library.aspx" target="_blank" title="Digg It!"&gt;&lt;img src="///socialbookmarks/square/digg_24.png" style="border: 0;" alt="Digg It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http://www.imaginaryrealities.com/post/2008/09/12/Designing-a-web-site-using-the-Yahoo!-User-Interface-Library.aspx&amp;amp;title=Designing a web site using the Yahoo! User Interface Library" target="_blank" title="DZone It!"&gt;&lt;img src="///socialbookmarks/square/dzone_24.png" style="border: 0;" alt="DZone It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/12/Designing-a-web-site-using-the-Yahoo!-User-Interface-Library.aspx" target="_blank" title="StumbleUpon"&gt;&lt;img src="///socialbookmarks/square/stumbleupon_24.png" style="border: 0;" alt="StumbleUpon" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://technorati.com/ping?url=http://www.imaginaryrealities.com/" target="_blank" title="Technorati"&gt;&lt;img src="///socialbookmarks/square/technorati_24.png" style="border: 0;" alt="Technorati" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://reddit.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/12/Designing-a-web-site-using-the-Yahoo!-User-Interface-Library.aspx&amp;amp;title=Designing a web site using the Yahoo! User Interface Library" target="_blank" title="Reddit"&gt;&lt;img src="///socialbookmarks/square/reddit_24.png" style="border: 0;" alt="Reddit" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://del.icio.us/post?url=http://www.imaginaryrealities.com/post/2008/09/12/Designing-a-web-site-using-the-Yahoo!-User-Interface-Library.aspx&amp;amp;title=Designing a web site using the Yahoo! User Interface Library" target="_blank" title="Del.icio.us"&gt;&lt;img src="///socialbookmarks/square/delicious_24.png" style="border: 0;" alt="Del.icio.us" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.newsvine.com/_wine/save?u=http://www.imaginaryrealities.com/post/2008/09/12/Designing-a-web-site-using-the-Yahoo!-User-Interface-Library.aspx" target="_blank"title="NewsVine"&gt;&lt;img src="///socialbookmarks/square/newsvine_24.png" style="border: 0;" alt="NewsVine" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://furl.net" target="_blank" title="Furl"&gt;&lt;img src="///socialbookmarks/square/furl_24.png" style="border: 0;" alt="Furl" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://blinklist.com/submit/" target="_blank" title="BlinkList"&gt;&lt;img src="///socialbookmarks/square/blinklist_24.png" style="border: 0;" alt="BlinkList" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div class="entry"&gt;
		&lt;div class="title"&gt;
			&lt;a href="http://www.imaginaryrealities.com/post/2008/09/06/Designing-the-ImaginaryRealitiescom-architecture.aspx"&gt;Designing the ImaginaryRealities.com architecture&lt;/a&gt;
		&lt;/div&gt;&lt;div class="moreinfo"&gt;
			&lt;span class="date"&gt;Saturday, September 06, 2008&lt;/span&gt; &amp;nbsp;| &amp;nbsp;&lt;span class="source"&gt;From &lt;a href="http://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082" target="_blank"&gt;ImaginaryRealities Software Company&lt;/a&gt;&lt;/span&gt;
		&lt;/div&gt;&lt;p&gt;&lt;p&gt;
Below is the illustration of the new architecture that I would like to build for the new ImaginaryRealities.com web site:
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="lightbox" href="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/DesigningtheImaginaryRea.comarchitecture_B688/image_4.png" title="ImaginaryRealities.com software architecture"&gt;&lt;img style="border-width: 0px" src="http://www.imaginaryrealities.com/image.axd?picture=WindowsLiveWriter/DesigningtheImaginaryRea.comarchitecture_B688/image_thumb_1.png" border="0" alt="image" width="244" height="109" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
What I&amp;#39;ve decided in building the web site is that I will want to be able to support users using the following browsers:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.microsoft.com/windows/products/winfamily/ie/default.mspx" target="_blank"&gt;Microsoft Internet Explorer 7 or 8&lt;/a&gt;. I won&amp;#39;t support Internet Explorer 6 or lower. If it works, it works. &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.mozilla.com" target="_blank"&gt;Mozilla Firefox&lt;/a&gt; &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.apple.com/safari/" target="_blank"&gt;Apple Safari&lt;/a&gt; on Windows and Macintosh &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.opera.com/" target="_blank"&gt;Opera&lt;/a&gt; &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://tools.google.com/chrome/" target="_blank"&gt;Google&amp;#39;s new Chrome browser&lt;/a&gt;. I haven&amp;#39;t installed this myself yet, but I guess that I&amp;#39;ll have to at some point with Google supporting it. &lt;/li&gt;
	&lt;li&gt;The Internet Explorer web browser on Windows Mobile phones (because I use one for work) &lt;/li&gt;
	&lt;li&gt;The Safari web browser on the iPhone and iPod Touch (because I also have one) &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
That&amp;#39;s a lot of browsers and calls for a lot of work, but at least this is my goal to start. I can&amp;#39;t guarantee that I can offer all of the features that I want to on every browser, but at least the web site should look nice and gracefully degrade its feature set.
&lt;/p&gt;
&lt;p&gt;
To provide the content for the web browsers to render, the content will be split between the &lt;a href="http://www.imaginaryrealities.com"&gt;www.imaginaryrealities.com&lt;/a&gt; web server and one or more Amazon S3 &amp;quot;buckets&amp;quot; that will hold static content, images, media, and downloadable files for the web site. Using the relatively lower cost Amazon S3 storage, I can dedicate the &lt;a href="http://www.imaginaryrealities.com"&gt;www.imaginaryrealities.com&lt;/a&gt; web site for dynamic content and processing application data.
&lt;/p&gt;
&lt;p&gt;
Now, since I have only a single shared web hosting server for my web site, I could implement the ASP.NET web pages directly over the database and other web services that I may use. However, if I am forward thinking, at some point in the future I may want to expose my web site&amp;#39;s information to other applications, or build out a web farm of ASP.NET web servers while moving more of the application processing and data to a more secure and reliable application tier running in-house or in another dedicated environment. I&amp;#39;ve therefore chosen to implement a third tier in my solution and will be creating a web service-based application and data layer at services.imaginaryrealities.com. The web services hosted at services.imaginaryrealities.com will hide the data access and implementation strategies from the main web site and will expose the data as a set of entities and services that the web site can use.
&lt;/p&gt;
&lt;p&gt;
Another idea behind the services.imaginaryrealities.com layer is that at some point I might build some reusable services that might turn into revenue-generating opportunities for me, so this solution also keeps that option open.
&lt;/p&gt;
&lt;p&gt;
I have several options identified for my data layer. Looking at my production environment, my primary option for data storage is the Microsoft SQL Server 2005 database servers that my hosting provider, WebHost4Life, makes available to me through my hosting account. Another option that I am currently exploring is Microsoft&amp;#39;s new SQL Server Data Services (SSDS). SSDS provides a web service layer over SQL Server instances that Microsoft will host (and eventually charge for). While SSDS does not provide all of the features of SQL Server at the moment, it is quite an interesting idea that I&amp;#39;m exploring.
&lt;/p&gt;
&lt;p&gt;
There are also a couple of options using Amazon&amp;#39;s web services, which I am already using. Along with S3 for static data storage, there&amp;#39;s also Amazon&amp;#39;s SimpleDB which is similar to SSDS. There could also be other third-party web services that I might want to use or integrate with to provide data for the web site.
&lt;/p&gt;
&lt;p&gt;
This is my high-level architecture. With that in place, let&amp;#39;s figure out how to start building something.
&lt;/p&gt;
&lt;div class="socialBookmarksContainer"&gt;&lt;a rel="nofollow" href="http://digg.com/submit/?url=http://www.imaginaryrealities.com/post/2008/09/06/Designing-the-ImaginaryRealitiescom-architecture.aspx" target="_blank" title="Digg It!"&gt;&lt;img src="///socialbookmarks/square/digg_24.png" style="border: 0;" alt="Digg It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http://www.imaginaryrealities.com/post/2008/09/06/Designing-the-ImaginaryRealitiescom-architecture.aspx&amp;amp;title=Designing the ImaginaryRealities.com architecture" target="_blank" title="DZone It!"&gt;&lt;img src="///socialbookmarks/square/dzone_24.png" style="border: 0;" alt="DZone It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/06/Designing-the-ImaginaryRealitiescom-architecture.aspx" target="_blank" title="StumbleUpon"&gt;&lt;img src="///socialbookmarks/square/stumbleupon_24.png" style="border: 0;" alt="StumbleUpon" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://technorati.com/ping?url=http://www.imaginaryrealities.com/" target="_blank" title="Technorati"&gt;&lt;img src="///socialbookmarks/square/technorati_24.png" style="border: 0;" alt="Technorati" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://reddit.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/06/Designing-the-ImaginaryRealitiescom-architecture.aspx&amp;amp;title=Designing the ImaginaryRealities.com architecture" target="_blank" title="Reddit"&gt;&lt;img src="///socialbookmarks/square/reddit_24.png" style="border: 0;" alt="Reddit" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://del.icio.us/post?url=http://www.imaginaryrealities.com/post/2008/09/06/Designing-the-ImaginaryRealitiescom-architecture.aspx&amp;amp;title=Designing the ImaginaryRealities.com architecture" target="_blank" title="Del.icio.us"&gt;&lt;img src="///socialbookmarks/square/delicious_24.png" style="border: 0;" alt="Del.icio.us" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.newsvine.com/_wine/save?u=http://www.imaginaryrealities.com/post/2008/09/06/Designing-the-ImaginaryRealitiescom-architecture.aspx" target="_blank"title="NewsVine"&gt;&lt;img src="///socialbookmarks/square/newsvine_24.png" style="border: 0;" alt="NewsVine" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://furl.net" target="_blank" title="Furl"&gt;&lt;img src="///socialbookmarks/square/furl_24.png" style="border: 0;" alt="Furl" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://blinklist.com/submit/" target="_blank" title="BlinkList"&gt;&lt;img src="///socialbookmarks/square/blinklist_24.png" style="border: 0;" alt="BlinkList" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div class="entry"&gt;
		&lt;div class="title"&gt;
			&lt;a href="http://www.imaginaryrealities.com/post/2008/09/06/About-my-development-environment.aspx"&gt;About my development environment&lt;/a&gt;
		&lt;/div&gt;&lt;div class="moreinfo"&gt;
			&lt;span class="date"&gt;Saturday, September 06, 2008&lt;/span&gt; &amp;nbsp;| &amp;nbsp;&lt;span class="source"&gt;From &lt;a href="http://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082" target="_blank"&gt;ImaginaryRealities Software Company&lt;/a&gt;&lt;/span&gt;
		&lt;/div&gt;&lt;p&gt;&lt;p&gt;In my &lt;a title="About my production environment" href="http://www.imaginaryrealities.com/post/2008/09/06/About-my-production-environment.aspx" target="_blank"&gt;last post&lt;/a&gt;, I discussed what my production environment looks like for ImaginaryRealities.com. In this post, I'll discuss my development environment that I'm using to build the ImaginaryRealities.com web site. I won't focus so much on the hardware than on the software and tools that I'm using to build the web site. &lt;/p&gt;  &lt;p&gt;First, my main development machine in my den is running Microsoft Windows Vista with Service Pack 1. The reason why I'm using Vista is that I guess that I'm one of the few that do like it over Windows XP. Also, Vista has IIS7 and Vista SP1 added all of the additional IIS features that are available with Windows Server 2008, which means that I can develop for Windows Server 2008 on my Vista desktop.&lt;/p&gt;  &lt;p&gt;For database development, I'm using Microsoft SQL Server 2005 Developer Edition on my computer. This edition allows me to use the full set of SQL Server development tools and servers to build and test my application, so I can maximize what I do in the production environment.&lt;/p&gt;  &lt;p&gt;For version control, I'm using &lt;a href="http://subversion.tigris.org" target="_blank"&gt;Subversion&lt;/a&gt;. Subversion, in my opinion, is the best version control system on the market, even better than Microsoft TFS. Plus, it's a free and open source product, so the cost per user is pretty minimal. Since I'm on a tight budget which competes with my bills and play money, the cost is very important. And for a single user (me), it works very well.&lt;/p&gt;  &lt;p&gt;For development, I'm using Microsoft Visual Studio 2008 Team System Developer Edition with Service Pack 1 installed. Since my production environment is running .NET 3.5 SP1, this version of Visual Studio with the service pack will allow me to develop for the full feature set available to me in the production environment.&lt;/p&gt;  &lt;p&gt;For building my software, I'm using customized MSBuild scripts that I've built by hand. MSBuild comes with the Microsoft .NET framework and is very easy to learn. It does a good job. Before MSBuild, I used to use NAnt, but after making the switch (which I was initially reluctant to do), I don't see much of a reason to go back to NAnt although I'm sure it's still very popular.&lt;/p&gt;  &lt;p&gt;For debugging purposes, I use the &lt;a href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx" target="_blank"&gt;Microsoft Debugging Tools for Windows&lt;/a&gt; tools to create both public and private symbol stores and source code servers for the source code that I write and the projects that I build for personal and public use. I combine Debugging Tools for Windows with the &lt;a title="Source code for the book Debugging Microsoft .NET 2.0 Applications" href="http://www.wintellect.com/dtt.aspx" target="_blank"&gt;source code&lt;/a&gt; for the book &lt;a href="http://www.shelfari.com/books/81597/Debugging-Microsoft-NET-2-0-Applications" target="_blank"&gt;Debugging Microsoft .NET 2.0 Applications by John Robbins&lt;/a&gt; to further enhance my development and debugging environment.&lt;/p&gt;  &lt;p&gt;Not all of the code that I write is intended to be personal or closed-source. I have done some open source development. There are also tools that I build from the original open source distribution that I modify for my own purposes, such as to add a strong name key because I like to strong name all of my .NET assemblies. Or in some cases, I may bring together multiple related open-source projects that use each other, but are not necessarily based on the same version of their cousins that I am using. In that case, I may import their source code into my Subversion repository and make my own &amp;quot;official&amp;quot; release of the tools that I may choose to put on my web site to share with others. In that case, I will also share the source code and symbol files on my public symbol and source code server.&lt;/p&gt;  &lt;p&gt;In case you're not familiar with the concept of a symbol server or source code server, check out the Debugging Tools for Windows. To quickly summarize, one of the outputs of a software build is a set of files with the extension &amp;quot;pdb.&amp;quot; These PDB files are known as symbol files and contain information that the debugger will use to locate each line of code and match locations in memory to variables or object fields. Without the PDB files, a developer is flying blind when debugging an executable image. The PDB files also contain information about the source code that the executable code was generated from so that the debugger can show the correct line of code to the developer.&lt;/p&gt;  &lt;p&gt;Once software goes into production and is released, or if a developer is working with multiple versions of software, keeping track of the symbols and correct source code for any particular version of a software product is hard to do. This is where the Debugging Tools for Windows comes in handy. Using tools that come inside of the Debugging Tools for Windows, I can publish my PDB files to a location such as a web server (internal or external), disk directory, or network share and create a symbol server. During debugging, the debugger will automatically look at the symbol server, match the executable code to the exact version of the PDB file in the symbol server, and download the PDB file into the debugger. All that I need then to debug my code is the actual executable files so that I can attach to the executable in the debugger and get the debugging and symbol information.&lt;/p&gt;  &lt;p&gt;To take this a step further, the PDB files contain the full path to the original source code that the executable code was generated from. This can be a problem when you have two or more developers or two or more machines, because developers are very individualistic when it comes to their development environments and I have yet to see two developers put their source code in the same place. Some companies that I've worked at, such as JDA Software, tried to make company standards where developers put their source code, but that never worked out because &amp;quot;I know the developer that came up with the standards, and I'm much smarter and better than that developer.&amp;quot; (This is meant as a generalized figure of speech and not as a derogatory remark towards any one person...it's basically the arrogance that all of us software developers share.)&lt;/p&gt;  &lt;p&gt;To fix this source code relation problem, Debugging Tools for Windows includes a set of tools collectively called Source Server. There are a couple of ways of using Source Server. First, I can take all of the PDB files that I've created through my build process and, before putting them into my symbol server, I can replace the physical file paths for the source code with executable commands. These executable commands instruct the Visual Studio or WinDbg debugger on how to execute my Subversion client to extract the exact revision of the source code that the executable code was generated from. By doing this, during debugging, I don't have to have all of the source code in a specific location on my hard drive. As the debugger encounters code that it doesn't have the source code for, the debugger will extract the version control command from the PDB file and will then execute Subversion to extract the relevant revision of the source code so that the module or program can be debugged.&lt;/p&gt;  &lt;p&gt;To take this a step farther, what about open source software or other tools that I make available to other developers? I don't necessarily want anyone going through my Subversion repository, and I don't want to make my Subversion server accessible outside of the firewall, but I want other developers to be able to debug my programs or assemblies or at least be able to walk through the code when trying to figure out problems in their programs. To do this, I go one step farther and make available a public source code server and symbol server.&lt;/p&gt;  &lt;p&gt;The symbol server is the easy part, because all that I have to do is copy my symbol server database (which is based on a directory structure) out to a public web site with normal HTTP access. For the source code, once I have indexed the PDB files, I can run another tool in the Source Server suite that will extract the source code from my Subversion repository and create a web server-friendly directory structure that the debugger can understand. Once the source code is extracted, I can then run one last tool that will replace my source code references in the PDB file with the URLs of the source code on my public web server.&lt;/p&gt;  &lt;p&gt;One last concept to discuss here related to my public symbol and source code server is where to host this stuff. First, these files could occupy a lot of space over time, especially the binary files in my symbol server if I store not only the PDBs but also the EXE and DLL files. I would do this if I'm going to be doing debugging or analysis of crash dumps that are reported to me (this is another series of posts that I hope to tackle in the future). My production environment on my shared hosting account only gives me 3 gigabytes of storage space, and I'd prefer to use that and my server bandwidth for application processing by my web site and not necessarily serving static data. What I need is another solution that's reliable (relatively), publicly accessible, and very cheap (because remember budget is a concern giving my limited income until I get customers buying products from me).&lt;/p&gt;  &lt;p&gt;The answer that I came up with is to use &lt;a href="http://www.amazon.com/S3-AWS-home-page-Money/b/ref=sc_fe_l_2?ie=UTF8&amp;amp;node=16427261&amp;amp;no=3435361&amp;amp;me=A36L942TSJ2AJA" target="_blank"&gt;Amazon's Simple Storage Service&lt;/a&gt;, also known as S3. S3 is a web-service based storage service provided by Amazon.com. Any kind of information can be stored on S3, and I can control who gets to access my information. Also, S3 provides both SOAP and REST APIs for the data stored on the S3 servers, so I can technically serve content over HTTP from an S3 server. The cost for storage on S3 is also pretty reasonable:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;$0.15 per gigabyte per month of storage used&lt;/li&gt;    &lt;li&gt;$0.10 per gigabyte per month for uploading data to the Amazon S3 server&lt;/li&gt;    &lt;li&gt;$0.17 per gigabyte per month for the first 10 TB of data downloaded from the Amazon S3 server.&lt;/li&gt;    &lt;li&gt;$0.01 per month per 1,000 PUT, POST, or LIST requests (mostly used when uploading to the Amazon S3 server)&lt;/li&gt;    &lt;li&gt;#0.01 per month per 10,000 GET and other requests (used when downloading content from the Amazon S3 server)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;That means that to share my symbols and source code, it only costs me $0.01 for each set of 10,000 source files or symbol files are downloaded from my server. While I haven't shared any code yet that uses these servers (I will be soon), my highest bill from Amazon so far was for $0.18 which came last month and mostly involved uploading to the servers.&lt;/p&gt;  &lt;p&gt;The other thing to consider when looking at the Amazon S3 service is that this would be a great addition to my production environment. I could use it to host static content such as images, video for Silverlight, ClickOnce deployments, and other downloadable files that I host on the web site.&lt;/p&gt;  &lt;p&gt;Now Amazon S3 isn't perfect. There was a highly publicized outage of S3 about a month ago, but for the most part it seems reliable to me and is much cheaper than the competition or using my hosting account's disk space for this stuff, so it works for me for now.&lt;/p&gt;  &lt;p&gt;In my next post, we'll start looking at the design concepts for the new web site and will hopefully start writing some production code.&lt;/p&gt;&lt;div class="socialBookmarksContainer"&gt;&lt;a rel="nofollow" href="http://digg.com/submit/?url=http://www.imaginaryrealities.com/post/2008/09/06/About-my-development-environment.aspx" target="_blank" title="Digg It!"&gt;&lt;img src="///socialbookmarks/square/digg_24.png" style="border: 0;" alt="Digg It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http://www.imaginaryrealities.com/post/2008/09/06/About-my-development-environment.aspx&amp;amp;title=About my development environment" target="_blank" title="DZone It!"&gt;&lt;img src="///socialbookmarks/square/dzone_24.png" style="border: 0;" alt="DZone It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/06/About-my-development-environment.aspx" target="_blank" title="StumbleUpon"&gt;&lt;img src="///socialbookmarks/square/stumbleupon_24.png" style="border: 0;" alt="StumbleUpon" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://technorati.com/ping?url=http://www.imaginaryrealities.com/" target="_blank" title="Technorati"&gt;&lt;img src="///socialbookmarks/square/technorati_24.png" style="border: 0;" alt="Technorati" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://reddit.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/06/About-my-development-environment.aspx&amp;amp;title=About my development environment" target="_blank" title="Reddit"&gt;&lt;img src="///socialbookmarks/square/reddit_24.png" style="border: 0;" alt="Reddit" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://del.icio.us/post?url=http://www.imaginaryrealities.com/post/2008/09/06/About-my-development-environment.aspx&amp;amp;title=About my development environment" target="_blank" title="Del.icio.us"&gt;&lt;img src="///socialbookmarks/square/delicious_24.png" style="border: 0;" alt="Del.icio.us" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.newsvine.com/_wine/save?u=http://www.imaginaryrealities.com/post/2008/09/06/About-my-development-environment.aspx" target="_blank"title="NewsVine"&gt;&lt;img src="///socialbookmarks/square/newsvine_24.png" style="border: 0;" alt="NewsVine" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://furl.net" target="_blank" title="Furl"&gt;&lt;img src="///socialbookmarks/square/furl_24.png" style="border: 0;" alt="Furl" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://blinklist.com/submit/" target="_blank" title="BlinkList"&gt;&lt;img src="///socialbookmarks/square/blinklist_24.png" style="border: 0;" alt="BlinkList" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div class="entry"&gt;
		&lt;div class="title"&gt;
			&lt;a href="http://www.imaginaryrealities.com/post/2008/09/06/About-my-production-environment.aspx"&gt;About my production environment&lt;/a&gt;
		&lt;/div&gt;&lt;div class="moreinfo"&gt;
			&lt;span class="date"&gt;Saturday, September 06, 2008&lt;/span&gt; &amp;nbsp;| &amp;nbsp;&lt;span class="source"&gt;From &lt;a href="http://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082" target="_blank"&gt;ImaginaryRealities Software Company&lt;/a&gt;&lt;/span&gt;
		&lt;/div&gt;&lt;p&gt;&lt;p&gt;
Whenever one starts a new software project, it&amp;#39;s important to understand exactly what kind of environment the eventual software will be installed into. Understanding the production environment is very important when it comes to making design and implementation decisions that may affect how the software is installed, operates, and is used.  
&lt;/p&gt;
&lt;p&gt;
For the ImaginaryRealities.com web site, my production environment for the time being is a shared hosting account that is parked on a server managed by &lt;a href="http://www.webhost4life.com" target="_blank"&gt;WebHost4Life&lt;/a&gt;. I&amp;#39;ve been a WebHost4Life customer for several years now and feel that they are one of the best options for the price. 
&lt;/p&gt;
&lt;p&gt;
My hosting environment provides me with the following features: 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Windows Server 2008&lt;/li&gt;
	&lt;li&gt;Microsoft Internet Information Server 7&lt;/li&gt;
	&lt;li&gt;Unlimited bandwidth&lt;/li&gt;
	&lt;li&gt;Unlimited domains and subdomains (i.e. my wife&amp;#39;s classroom web site, services.imaginaryrealities.com, etc.)&lt;/li&gt;
	&lt;li&gt;3 GB of disk space for hosting my web site and associated files.&lt;/li&gt;
	&lt;li&gt;Microsoft SQL Server 2005 
	&lt;ul&gt;
		&lt;li&gt;3 GB of disk space&lt;/li&gt;
		&lt;li&gt;3 databases&lt;/li&gt;
		&lt;li&gt;I can pay for more disk space or databases&lt;/li&gt;
		&lt;li&gt;Full-text search support&lt;/li&gt;
		&lt;li&gt;Reporting Services for a minimal extra fee&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;Email services for the imaginaryrealities.com domain&lt;/li&gt;
	&lt;li&gt;Cheaper SSL certificates for my web site if I want them&lt;/li&gt;
	&lt;li&gt;ASP.NET 3.5 with Service Pack 1&lt;/li&gt;
	&lt;li&gt;Password protected directories&lt;/li&gt;
	&lt;li&gt;FTP access with 300 manageable accounts&lt;/li&gt;
	&lt;li&gt;Perl if I want it&lt;/li&gt;
	&lt;li&gt;PHP 5 if I want it&lt;/li&gt;
	&lt;li&gt;MySQL if I want/need it. Doubtful that I&amp;#39;ll ever use this, but you never know.&lt;/li&gt;
	&lt;li&gt;10 mailing lists, with the addition to buy more. There are web services to allow me to add or remove users from the mailing lists&lt;/li&gt;
	&lt;li&gt;A very good support team&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The important parts of this environment for me to focus on is that it&amp;#39;s a Windows Server 2008/IIS7 server running the latest version of .NET and ASP.NET (3.5 SP1), so that gives me a lot of freedom to do things such as WCF or implement workflows in my web site using Workflow Foundation. There are more features that I&amp;#39;ve identified here, but this is enough to focus on for the time being and we&amp;#39;ll discuss more of those features later. 
&lt;/p&gt;
&lt;div class="socialBookmarksContainer"&gt;&lt;a rel="nofollow" href="http://digg.com/submit/?url=http://www.imaginaryrealities.com/post/2008/09/06/About-my-production-environment.aspx" target="_blank" title="Digg It!"&gt;&lt;img src="///socialbookmarks/square/digg_24.png" style="border: 0;" alt="Digg It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.dzone.com/links/add.html?url=http://www.imaginaryrealities.com/post/2008/09/06/About-my-production-environment.aspx&amp;amp;title=About my production environment" target="_blank" title="DZone It!"&gt;&lt;img src="///socialbookmarks/square/dzone_24.png" style="border: 0;" alt="DZone It!" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.stumbleupon.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/06/About-my-production-environment.aspx" target="_blank" title="StumbleUpon"&gt;&lt;img src="///socialbookmarks/square/stumbleupon_24.png" style="border: 0;" alt="StumbleUpon" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://technorati.com/ping?url=http://www.imaginaryrealities.com/" target="_blank" title="Technorati"&gt;&lt;img src="///socialbookmarks/square/technorati_24.png" style="border: 0;" alt="Technorati" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://reddit.com/submit?url=http://www.imaginaryrealities.com/post/2008/09/06/About-my-production-environment.aspx&amp;amp;title=About my production environment" target="_blank" title="Reddit"&gt;&lt;img src="///socialbookmarks/square/reddit_24.png" style="border: 0;" alt="Reddit" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://del.icio.us/post?url=http://www.imaginaryrealities.com/post/2008/09/06/About-my-production-environment.aspx&amp;amp;title=About my production environment" target="_blank" title="Del.icio.us"&gt;&lt;img src="///socialbookmarks/square/delicious_24.png" style="border: 0;" alt="Del.icio.us" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://www.newsvine.com/_wine/save?u=http://www.imaginaryrealities.com/post/2008/09/06/About-my-production-environment.aspx" target="_blank"title="NewsVine"&gt;&lt;img src="///socialbookmarks/square/newsvine_24.png" style="border: 0;" alt="NewsVine" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://furl.net" target="_blank" title="Furl"&gt;&lt;img src="///socialbookmarks/square/furl_24.png" style="border: 0;" alt="Furl" /&gt;&lt;/a&gt;&lt;a rel="nofollow" href="http://blinklist.com/submit/" target="_blank" title="BlinkList"&gt;&lt;img src="///socialbookmarks/square/blinklist_24.png" style="border: 0;" alt="BlinkList" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
	&lt;/div&gt;&lt;div class="accentbar"&gt;
		&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;ImaginaryRealities Software Company News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;
	&lt;/div&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 06 Dec 2008 18:23:13 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20081206062313P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Home&amp;version=9</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt;The purpose of this project is to develop a standard WPF application shell using the Composite Application Guidance for WPF. This project will develop standards, patterns, and best practices for building composite applications using WPF.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Overview
&lt;/h1&gt;The Composite WPF Shell project builds on the Microsoft Patterns &amp;amp; Practices Composite Application Guidance for WPF. While the goal of the Composite Application Guidance project is to build a reusable framework for creating composite WPF-based applications, the goal of this project is to build a standard, reusable shell application based on the Composite Application Guidance, as well as a basic set of modules that provide reusable services for applications based on the shell.&lt;br /&gt; &lt;br /&gt;The application shell that is developed for this project is reusable for both commercial and noncommercial uses. The shell was developed using best practices and standard patterns in mind in order to give application developers a starting point for building their applications, without needing to spend additional time building a shell.&lt;br /&gt; &lt;br /&gt;This project was developed and contributed to the .NET developer community by consultants from &lt;a href="http://www.neudesic.com" class="externalLink"&gt;Neudesic&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Topics
&lt;/h1&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Users%20Guide&amp;amp;referringTitle=Home"&gt;Users Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Developer%20Information&amp;amp;referringTitle=Home"&gt;Developer Information&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Blog posts
&lt;/h1&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=rss%3aurlhttp%3a%2f%2fwww.imaginaryrealities.com%2fsyndication.axd%3fcategory91c2b02e-f654-47bd-b9b6-e0b9c8a83082&amp;amp;referringTitle=Home"&gt;rss:urlhttp://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 06 Dec 2008 18:22:37 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20081206062237P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Home&amp;version=8</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt;The purpose of this project is to develop a standard WPF application shell using the Composite Application Guidance for WPF. This project will develop standards, patterns, and best practices for building composite applications using WPF.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Overview
&lt;/h1&gt;The Composite WPF Shell project builds on the Microsoft Patterns &amp;amp; Practices Composite Application Guidance for WPF. While the goal of the Composite Application Guidance project is to build a reusable framework for creating composite WPF-based applications, the goal of this project is to build a standard, reusable shell application based on the Composite Application Guidance, as well as a basic set of modules that provide reusable services for applications based on the shell.&lt;br /&gt; &lt;br /&gt;The application shell that is developed for this project is reusable for both commercial and noncommercial uses. The shell was developed using best practices and standard patterns in mind in order to give application developers a starting point for building their applications, without needing to spend additional time building a shell.&lt;br /&gt; &lt;br /&gt;This project was developed and contributed to the .NET developer community by consultants from &lt;a href="http://www.neudesic.com" class="externalLink"&gt;Neudesic&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Topics
&lt;/h1&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Users%20Guide&amp;amp;referringTitle=Home"&gt;Users Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Developer%20Information&amp;amp;referringTitle=Home"&gt;Developer Information&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Blog posts
&lt;/h1&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=rss%3aurlhttp%3a%2f%2fwww.imaginaryrealities.com%2fsyndication.axd%3fcategory91c2b02e-f654-47bd-b9b6-e0b9c8a83082&amp;amp;referringTitle=Home"&gt;rss:urlhttp://www.imaginaryrealities.com/syndication.axd?category91c2b02e-f654-47bd-b9b6-e0b9c8a83082&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 06 Dec 2008 18:22:11 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20081206062211P</guid></item><item><title>Updated Wiki: Notes on using DocProject to build project documentation</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Notes on using DocProject to build project documentation&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
The Composite WPF Shell uses &lt;a href="http://www.codeplex.com/DocProject" class="externalLink"&gt;DocProject&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; to build the project's reference documentation. DocProject is a set of extensions for Visual Studio that support building online help files using HTML Help and the integrated help formats for Visual Studio 2005 and 2008. DocProject is integrated into the automated build process, so no other support is needed other than to install the DocProject prerequisites into your development environment.&lt;br /&gt; &lt;br /&gt;On occasion, when building the documentation using Visual Studio 2008, you may receive a &lt;b&gt;OutOfMemoryException&lt;/b&gt; during the DocProject build. This will most likely not occur during the automated build process and will be isolated only to Visual Studio. The reason is that the help build process generates warnings based on the content or what it perceives to be missing content. By default, Visual Studio will abort a build after 250 warnings. It may be necessary to increase that number.&lt;br /&gt; &lt;br /&gt;To increase the limit, follow these instructions:&lt;br /&gt; &lt;br /&gt;&lt;ol&gt;
&lt;li&gt;Run &lt;b&gt;regedit.exe&lt;/b&gt; to open the Registry Editor.&lt;/li&gt;&lt;li&gt;Go to &lt;b&gt;HKEY&lt;i&gt;LOCAL&lt;/i&gt;MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Setup\EDev&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Add or modify the &lt;b&gt;CodeAnalysisErrorListViolationLimit&lt;/b&gt; value (&lt;b&gt;REG_DWORD&lt;/b&gt;) to a higher number, such as 2000.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;After doing this, restart Visual Studio and the build should complete successfully. Again, this is a limit only for the build within Visual Studio 2008. The automated build process is not affected.&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 29 Nov 2008 16:32:27 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Notes on using DocProject to build project documentation 20081129043227P</guid></item><item><title>Updated Wiki: Notes on using DocProject to build project documentation</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Notes on using DocProject to build project documentation&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
The Composite WPF Shell uses &lt;a href="http://www.codeplex.com/DocProject" class="externalLink"&gt;DocProject&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; to build the project's reference documentation. DocProject is a set of extensions for Visual Studio that support building online help files using HTML Help and the integrated help formats for Visual Studio 2005 and 2008. DocProject is integrated into the automated build process, so no other support is needed other than to install the DocProject prerequisites into your development environment.&lt;br /&gt; &lt;br /&gt;On occasion, when building the documentation using Visual Studio 2008, you may receive a &lt;b&gt;OutOfMemoryException&lt;/b&gt; during the DocProject build. This will most likely not occur during the automated build process and will be isolated only to Visual Studio. The reason is that the help build process generates warnings based on the content or what it perceives to be missing content. By default, Visual Studio will abort a build after 250 warnings. It may be necessary to increase that number.&lt;br /&gt; &lt;br /&gt;To increase the limit, follow these instructions:&lt;br /&gt; &lt;br /&gt;&lt;ol&gt;
&lt;li&gt;Run &lt;b&gt;regedit.exe&lt;/b&gt; to open the Registry Editor.&lt;/li&gt;&lt;li&gt;Go to &lt;b&gt;HKEY&lt;i&gt;LOCAL&lt;/i&gt;MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Setup\EDev&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Add or modify the &lt;b&gt;CodeAnalysisErrorListViolationLimit&lt;/b&gt; key (&lt;b&gt;REG_DWORD&lt;/b&gt;) to a higher number, such as 2000.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;After doing this, restart Visual Studio and the build should complete successfully. Again, this is a limit only for the build within Visual Studio 2008. The automated build process is not affected.&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 29 Nov 2008 16:31:36 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Notes on using DocProject to build project documentation 20081129043136P</guid></item><item><title>Updated Wiki: Developer Information</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Developer Information&amp;version=14</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Introduction
&lt;/h1&gt;As the Composite WPF Shell project is intended to be an open source project, it's important for the success of this project that the source code be easy to work with. Over time, as this project develops and grows, there should hopefully be a lot of cool stuff to look at and play with. In order to make the experience of working with the source code successful, this area of the wiki has been set up to help project developers and project consumers understand what they need to do to be successful with the source code.&lt;br /&gt; &lt;br /&gt;When possible, all external dependencies are included in the source code repository and branched into the subprojects that depend on them (see &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Source%20Code%20Project%20Structure&amp;amp;referringTitle=Developer%20Information"&gt;Source Code Project Structure&lt;/a&gt;. In specific cases, however, either the external dependency could not be included in the source code repository, or the project team determined that the software was better left outside. In these cases, the external software requirements are being documented in the &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Software%20Prerequisites&amp;amp;referringTitle=Developer%20Information"&gt;Software Prerequisites&lt;/a&gt; wiki topic. The project team will do its best to keep this topic updated as we adopt new software requirements, or as we upgrade to newer software versions. We will also make an effort to ensure that newer versions of the software are identified in the release notes for projects.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Topics
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
Participating in the project
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Software%20Prerequisites&amp;amp;referringTitle=Developer%20Information"&gt;Software Prerequisites&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Source%20Code%20Project%20Structure&amp;amp;referringTitle=Developer%20Information"&gt;Source Code Project Structure&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Build%20Instructions&amp;amp;referringTitle=Developer%20Information"&gt;Build Instructions&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Strong%20Naming&amp;amp;referringTitle=Developer%20Information"&gt;Strong Naming&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=How%20to%20run%20FitNesse%20to%20perform%20acceptance%20tests&amp;amp;referringTitle=Developer%20Information"&gt;How to run FitNesse to perform acceptance tests&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Using%20SUPERASSERT.NET&amp;amp;referringTitle=Developer%20Information"&gt;Using SUPERASSERT.NET&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Notes%20on%20using%20DocProject%20to%20build%20project%20documentation&amp;amp;referringTitle=Developer%20Information"&gt;Notes on using DocProject to build project documentation&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Coding standards
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Coding%20Standards%20and%20Guidelines&amp;amp;referringTitle=Developer%20Information"&gt;Coding Standards and Guidelines&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Rules%20and%20Principles&amp;amp;referringTitle=Developer%20Information"&gt;Rules and Principles&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Project design and management
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Blue%20Sky%20Area&amp;amp;referringTitle=Developer%20Information"&gt;Blue Sky Area&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Product%20Backlog&amp;amp;referringTitle=Developer%20Information"&gt;Product Backlog&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
About the project
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Project%20Team&amp;amp;referringTitle=Developer%20Information"&gt;Project Team&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 29 Nov 2008 16:22:25 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Developer Information 20081129042225P</guid></item><item><title>Updated Wiki: Software Prerequisites</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Software Prerequisites&amp;version=6</link><description>&lt;div class="wikidoc"&gt;
In order to contribute to this project or work with the source code, you must install the following software:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/CodePlex/Wiki/View.aspx?title=Using%20TortoiseSVN%20with%20CodePlex&amp;amp;referringTitle=Source%20control%20clientshttp://www.codeplex.com/CodePlex/Wiki/View.aspx?title=Using%20TortoiseSVN%20with%20CodePlex&amp;amp;referringTitle=Source%20control%20clients" class="externalLink"&gt;TortoiseSVN&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: We recommend the use of TortoiseSVN to access the source code in the source code repository.&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/downloads/?intcmp=1281" class="externalLink"&gt;Java SE Runtime Environment 1.5 or newer&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: Java is required to run the FitNesse web server for acceptance testing purposes.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msbuildtasks.tigris.org/" class="externalLink"&gt;MSBuild Community Tasks&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: These MSBuild tasks are used by the master build script to build the software projects.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx" class="externalLink"&gt;DebuggingToolsForWindows&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: The build scripts use the Debugging Tools for Windows programs to build the private and public symbol stores and extract the source code from the source code repository for storage on the public source code server.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.activestate.com/Products/activeperl/index.mhtml" class="externalLink"&gt;ActivePerl&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: The Debugging Tools for Windows scripts for the source code server use Perl. Any Perl interpreter will do. I typically use ActiveState's standard Perl distribution.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/sourceanalysis/Release/ProjectReleases.aspx?ReleaseId=1425" class="externalLink"&gt;Microsoft StyleCop 4.3&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: We use Microsoft StyleCop to perform source code analysis during builds to ensure that all source code follows established coding standards for the project.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/DocProject/Release/ProjectReleases.aspx?ReleaseId=10744" class="externalLink"&gt;DocProject 1.11.0 Release Candidate&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: We use DocProject to build the online documentation for the project's assemblies and the help documentation for using the Composite WPF Shell in custom software projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 29 Nov 2008 16:04:44 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Software Prerequisites 20081129040444P</guid></item><item><title>Updated Wiki: Software Prerequisites</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Software Prerequisites&amp;version=5</link><description>&lt;div class="wikidoc"&gt;
In order to contribute to this project or work with the source code, you must install the following software:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/CodePlex/Wiki/View.aspx?title=Using%20TortoiseSVN%20with%20CodePlex&amp;amp;referringTitle=Source%20control%20clientshttp://www.codeplex.com/CodePlex/Wiki/View.aspx?title=Using%20TortoiseSVN%20with%20CodePlex&amp;amp;referringTitle=Source%20control%20clients" class="externalLink"&gt;TortoiseSVN&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: We recommend the use of TortoiseSVN to access the source code in the source code repository.&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/downloads/?intcmp=1281" class="externalLink"&gt;Java SE Runtime Environment 1.5 or newer&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: Java is required to run the FitNesse web server for acceptance testing purposes.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msbuildtasks.tigris.org/" class="externalLink"&gt;MSBuild Community Tasks&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: These MSBuild tasks are used by the master build script to build the software projects.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx" class="externalLink"&gt;DebuggingToolsForWindows&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: The build scripts use the Debugging Tools for Windows programs to build the private and public symbol stores and extract the source code from the source code repository for storage on the public source code server.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.activestate.com/Products/activeperl/index.mhtml" class="externalLink"&gt;ActivePerl&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: The Debugging Tools for Windows scripts for the source code server use Perl. Any Perl interpreter will do. I typically use ActiveState's standard Perl distribution.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/sourceanalysis/Release/ProjectReleases.aspx?ReleaseId=1425" class="externalLink"&gt;Microsoft StyleCop 4.3&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: We use Microsoft StyleCop to perform source code analysis during builds to ensure that all source code follows established coding standards for the project.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/DocProject/Release/ProjectReleases.aspx?ReleaseId=10744" class="externalLink"&gt;DocProject 1.11.0 Release Candidate&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 29 Nov 2008 16:03:50 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Software Prerequisites 20081129040350P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Home&amp;version=7</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt;The purpose of this project is to develop a standard WPF application shell using the Composite Application Guidance for WPF. This project will develop standards, patterns, and best practices for building composite applications using WPF.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Overview
&lt;/h1&gt;The Composite WPF Shell project builds on the Microsoft Patterns &amp;amp; Practices Composite Application Guidance for WPF. While the goal of the Composite Application Guidance project is to build a reusable framework for creating composite WPF-based applications, the goal of this project is to build a standard, reusable shell application based on the Composite Application Guidance, as well as a basic set of modules that provide reusable services for applications based on the shell.&lt;br /&gt; &lt;br /&gt;The application shell that is developed for this project is reusable for both commercial and noncommercial uses. The shell was developed using best practices and standard patterns in mind in order to give application developers a starting point for building their applications, without needing to spend additional time building a shell.&lt;br /&gt; &lt;br /&gt;This project was developed and contributed to the .NET developer community by consultants from &lt;a href="http://www.neudesic.com" class="externalLink"&gt;Neudesic&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Topics
&lt;/h1&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Users%20Guide&amp;amp;referringTitle=Home"&gt;Users Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Developer%20Information&amp;amp;referringTitle=Home"&gt;Developer Information&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 29 Nov 2008 15:59:57 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20081129035957P</guid></item><item><title>Updated Wiki: Build Instructions</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Build Instructions&amp;version=4</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
About the build process
&lt;/h1&gt;The Composite WPF Shell project offers a completely automated build environment that is maintained continuously as the project develops and evolves. It is expected that each contributor is also verifying the the automated build process continues to work and is continually updated as each new change is committed to the source code repository. The automated build process for the Composite WPF Shell is driven using the MSBuild build engine that is provided as part of the Microsoft .NET framework.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Prerequisites to building
&lt;/h1&gt;In order to successfully build the source code in the project, you must have installed the &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Software%20Prerequisites&amp;amp;referringTitle=Build%20Instructions"&gt;Software Prerequisites&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Once all of the prerequisites are installed, you need to run to start the FitNesse web server where the acceptance test scripts are stored. For more information on starting the FitNesse web server, see &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=How%20to%20run%20FitNesse%20to%20perform%20acceptance%20tests&amp;amp;referringTitle=Build%20Instructions"&gt;How to run FitNesse to perform acceptance tests&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;!Building the software project&lt;br /&gt;To make building the entire project easier for developers and end-users that prefer to work directly with the source code in their own environments, two batch scripts have been provided in the root directory of each subproject. These batch scripts will run the build process in different modes. The first batch script, named &lt;b&gt;Build.cmd&lt;/b&gt;, is used to perform a complete build of the specific subproject. The result of running the &lt;b&gt;Build.cmd&lt;/b&gt; batch script will be a set of .zip archive files containing the redistributable components for the specific subproject.&lt;br /&gt; &lt;br /&gt;The second batch script is named &lt;b&gt;Clean.cmd&lt;/b&gt;. &lt;b&gt;Clean.cmd&lt;/b&gt; is used to delete all build-generated files and directories from your project workspace. The &lt;b&gt;Clean.cmd&lt;/b&gt; script is useful if you wish to return your project workspace to its original condition, reset your local builds, or automatically delete a number of builds that you've created that are being stored on your hard drive.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Build outputs
&lt;/h1&gt;After you create a project workspace by checking out the source code from the source code repository, or after downloading a source code release, your root directory of your project workspace will look like the following:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;i&gt;(root directory)&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/Documentation&lt;/li&gt;&lt;li&gt;/Libraries&lt;/li&gt;&lt;li&gt;/SourceCode&lt;/li&gt;&lt;li&gt;/Tools&lt;/li&gt;&lt;li&gt;Build.cmd&lt;/li&gt;&lt;li&gt;Clean.cmd&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt; &lt;br /&gt;If you were to run the &lt;b&gt;Build.cmd&lt;/b&gt; batch script, a new directory will be created named &lt;b&gt;Build&lt;/b&gt;:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;i&gt;(root directory)&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/Build&lt;/li&gt;&lt;li&gt;/Documentation&lt;/li&gt;&lt;li&gt;/Libraries&lt;/li&gt;&lt;li&gt;/SourceCode&lt;/li&gt;&lt;li&gt;/Tools&lt;/li&gt;&lt;li&gt;Build.cmd&lt;/li&gt;&lt;li&gt;Clean.cmd&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt; &lt;br /&gt;The &lt;b&gt;Build&lt;/b&gt; directory is used for staging, post-build processing, and storage of the redistributable .zip archives or Windows Installer packages that are produced by the project. Inside the &lt;b&gt;Build&lt;/b&gt; directory, you'll see this typical structure:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;i&gt;(root directory)&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/Build&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/1.0.0.1&lt;/li&gt;&lt;li&gt;/1.0.0.2&lt;/li&gt;&lt;li&gt;/1.0.1.0&lt;/li&gt;&lt;li&gt;/1.1.2.0&lt;/li&gt;&lt;li&gt;/... &lt;i&gt;(other version directories)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Version.txt&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt; &lt;br /&gt;One feature of the automated build process is that the build process automatically manages the version numbers for the project. Each new build is given a new version number to differentiate it from the previous version number. Each time you run the &lt;b&gt;Build.cmd&lt;/b&gt; batch script to build the project, the build process will generate a new build version number and will create a subdirectory in the &lt;b&gt;Build&lt;/b&gt; directory to store the outputs for that specific build. Any .zip archives that are produced by the build will also be labelled with their build version number.&lt;br /&gt; &lt;br /&gt;Inside of the version-specific build directory, you'll see a number of files and directories. Some directories are used to store files for staging or post-processing. Other directories have files that are meant to be redistributed or used for another specific purpose such as debugging symbols or extracted source code that can be published to a source code server (see &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Version%20Numbers&amp;amp;referringTitle=Build%20Instructions"&gt;Version Numbers&lt;/a&gt;).&lt;br /&gt; &lt;br /&gt;In the root of the version-specific build directory, there will also typically be one or more .zip archives containing redistributable components in an easy to deploy form. Using the Composite WPF Shell project as an example, you'll typically see the following set of .zip archives:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;CompositeWPFShell-1.0.1.0-SourceCode.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PrivateSymbols-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSymbols-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PrivateSymbols-Release.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSymbols-Release.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSourceCode-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSourceCode-Release.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-Release.zip&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;The &lt;b&gt;CompositeWPFShell-1.0.1.0-SourceCode.zip&lt;/b&gt; archive file contains all of the source code that was used in the specific build. This can be used to publish the source code with a specific release to make it easier for end-users that prefer or wish to work with the source code. &lt;br /&gt; &lt;br /&gt;The &lt;b&gt;CompositeWPFShell-1.0.1.0-PrivateSymbols-XXXX.zip&lt;/b&gt; archive files contain the private .pdb debugging symbol files for either the Debug or Release configuration builds of the project. The .pdb files for the Debug build have more debugging information in them and are valuable for developers working with the source code. For most purposes, the private symbols are only useful for the immediate contributors to the software project and should be added to a private symbol store maintained on an intranet. These symbol files are not of interest to most developers that are simply working with or using the Composite WPF Shell in their own projects. &lt;br /&gt; &lt;br /&gt;The &lt;b&gt;CompositeWPFShell-1.0.1.0-PublicSymbols-XXXX.zip&lt;/b&gt; archive files contain the public symbols for the software. These symbols are more useful to those that are reusing the software in their own projects. However, it is not necessary for any developers to specifically use these symbol files in their development. This is because these same symbols are published to a public web site and are directly accessible by debuggers such as Visual Studio or WinDbg. The &lt;b&gt;CompositeWPFShell-1.0.1.0-PublicSourceCode-XXXX.zip&lt;/b&gt; archive file contains the public source code for the project. This source code differs from the &lt;b&gt;CompositeWPFShell-1.0.1.0-SourceCode.zip&lt;/b&gt; archive significantly. While the previous file was a complete snapshot of the source code from the project workspace where the build occurred, the latter file is an extraction of the source code that was used in the build directly from the source code repository. Again, this file is not directly of interest to other developers because these files are published by the project team to another public web site and are directly accessible by debuggers such as Visual Studio or WinDbg. For more information on configuring your development environment to debug using these public symbols, see the &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Debugger%20Setup&amp;amp;referringTitle=Build%20Instructions"&gt;Debugger Setup&lt;/a&gt; topic.&lt;br /&gt; &lt;br /&gt;Finally, the &lt;b&gt;CompositeWPFShell-1.0.1.0-XXXX.zip&lt;/b&gt; archive file contains the redistributable components for each build configuration type that is produced by the build process. Typically, the software is produced in two configurations: Debug and Release. The Debug mode builds have extra debugging information stored in their .pdb files, while the Release mode builds are meant for public consumption and reuse.&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Wed, 26 Nov 2008 19:31:01 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Build Instructions 20081126073101P</guid></item><item><title>Updated Wiki: Build Instructions</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Build Instructions&amp;version=3</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
About the build process
&lt;/h1&gt;The Composite WPF Shell project offers a completely automated build environment that is maintained continuously as the project develops and evolves. It is expected that each contributor is also verifying the the automated build process continues to work and is continually updated as each new change is committed to the source code repository. The automated build process for the Composite WPF Shell is driven using the MSBuild build engine that is provided as part of the Microsoft .NET framework.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Prerequisites to building
&lt;/h1&gt;In order to successfully build the source code in the project, you must have installed the &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Software%20Prerequisites&amp;amp;referringTitle=Build%20Instructions"&gt;Software Prerequisites&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Once all of the prerequisites are installed, you need to run to start the FitNesse web server where the acceptance test scripts are stored. For more information on starting the FitNesse web server, see &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=How%20to%20run%20FitNesse%20to%20perform%20acceptance%20tests&amp;amp;referringTitle=Build%20Instructions"&gt;How to run FitNesse to perform acceptance tests&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;To make building the entire project easier for developers and end-users that prefer to work directly with the source code in their own environments, two batch scripts have been provided in the root directory of each subproject. These batch scripts will run the build process in different modes. The first batch script, named &lt;b&gt;Build.cmd&lt;/b&gt;, is used to perform a complete build of the specific subproject. The result of running the &lt;b&gt;Build.cmd&lt;/b&gt; batch script will be a set of .zip archive files containing the redistributable components for the specific subproject.&lt;br /&gt; &lt;br /&gt;The second batch script is named &lt;b&gt;Clean.cmd&lt;/b&gt;. &lt;b&gt;Clean.cmd&lt;/b&gt; is used to delete all build-generated files and directories from your project workspace. The &lt;b&gt;Clean.cmd&lt;/b&gt; script is useful if you wish to return your project workspace to its original condition, reset your local builds, or automatically delete a number of builds that you've created that are being stored on your hard drive.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Build outputs
&lt;/h1&gt;After you create a project workspace by checking out the source code from the source code repository, or after downloading a source code release, your root directory of your project workspace will look like the following:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;i&gt;(root directory)&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/Documentation&lt;/li&gt;&lt;li&gt;/Libraries&lt;/li&gt;&lt;li&gt;/SourceCode&lt;/li&gt;&lt;li&gt;/Tools&lt;/li&gt;&lt;li&gt;Build.cmd&lt;/li&gt;&lt;li&gt;Clean.cmd&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt; &lt;br /&gt;If you were to run the &lt;b&gt;Build.cmd&lt;/b&gt; batch script, a new directory will be created named &lt;b&gt;Build&lt;/b&gt;:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;i&gt;(root directory)&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/Build&lt;/li&gt;&lt;li&gt;/Documentation&lt;/li&gt;&lt;li&gt;/Libraries&lt;/li&gt;&lt;li&gt;/SourceCode&lt;/li&gt;&lt;li&gt;/Tools&lt;/li&gt;&lt;li&gt;Build.cmd&lt;/li&gt;&lt;li&gt;Clean.cmd&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt; &lt;br /&gt;The &lt;b&gt;Build&lt;/b&gt; directory is used for staging, post-build processing, and storage of the redistributable .zip archives or Windows Installer packages that are produced by the project. Inside the &lt;b&gt;Build&lt;/b&gt; directory, you'll see this typical structure:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;i&gt;(root directory)&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/Build&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/1.0.0.1&lt;/li&gt;&lt;li&gt;/1.0.0.2&lt;/li&gt;&lt;li&gt;/1.0.1.0&lt;/li&gt;&lt;li&gt;/1.1.2.0&lt;/li&gt;&lt;li&gt;/... &lt;i&gt;(other version directories)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Version.txt&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt; &lt;br /&gt;One feature of the automated build process is that the build process automatically manages the version numbers for the project. Each new build is given a new version number to differentiate it from the previous version number. Each time you run the &lt;b&gt;Build.cmd&lt;/b&gt; batch script to build the project, the build process will generate a new build version number and will create a subdirectory in the &lt;b&gt;Build&lt;/b&gt; directory to store the outputs for that specific build. Any .zip archives that are produced by the build will also be labelled with their build version number.&lt;br /&gt; &lt;br /&gt;Inside of the version-specific build directory, you'll see a number of files and directories. Some directories are used to store files for staging or post-processing. Other directories have files that are meant to be redistributed or used for another specific purpose such as debugging symbols or extracted source code that can be published to a source code server (see &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Version%20Numbers&amp;amp;referringTitle=Build%20Instructions"&gt;Version Numbers&lt;/a&gt;).&lt;br /&gt; &lt;br /&gt;In the root of the version-specific build directory, there will also typically be one or more .zip archives containing redistributable components in an easy to deploy form. Using the Composite WPF Shell project as an example, you'll typically see the following set of .zip archives:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;CompositeWPFShell-1.0.1.0-SourceCode.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PrivateSymbols-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSymbols-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PrivateSymbols-Release.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSymbols-Release.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSourceCode-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSourceCode-Release.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-Release.zip&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;The &lt;b&gt;CompositeWPFShell-1.0.1.0-SourceCode.zip&lt;/b&gt; archive file contains all of the source code that was used in the specific build. This can be used to publish the source code with a specific release to make it easier for end-users that prefer or wish to work with the source code. &lt;br /&gt; &lt;br /&gt;The &lt;b&gt;CompositeWPFShell-1.0.1.0-PrivateSymbols-XXXX.zip&lt;/b&gt; archive files contain the private .pdb debugging symbol files for either the Debug or Release configuration builds of the project. The .pdb files for the Debug build have more debugging information in them and are valuable for developers working with the source code. For most purposes, the private symbols are only useful for the immediate contributors to the software project and should be added to a private symbol store maintained on an intranet. These symbol files are not of interest to most developers that are simply working with or using the Composite WPF Shell in their own projects. &lt;br /&gt; &lt;br /&gt;The &lt;b&gt;CompositeWPFShell-1.0.1.0-PublicSymbols-XXXX.zip&lt;/b&gt; archive files contain the public symbols for the software. These symbols are more useful to those that are reusing the software in their own projects. However, it is not necessary for any developers to specifically use these symbol files in their development. This is because these same symbols are published to a public web site and are directly accessible by debuggers such as Visual Studio or WinDbg. The &lt;b&gt;CompositeWPFShell-1.0.1.0-PublicSourceCode-XXXX.zip&lt;/b&gt; archive file contains the public source code for the project. This source code differs from the &lt;b&gt;CompositeWPFShell-1.0.1.0-SourceCode.zip&lt;/b&gt; archive significantly. While the previous file was a complete snapshot of the source code from the project workspace where the build occurred, the latter file is an extraction of the source code that was used in the build directly from the source code repository. Again, this file is not directly of interest to other developers because these files are published by the project team to another public web site and are directly accessible by debuggers such as Visual Studio or WinDbg. For more information on configuring your development environment to debug using these public symbols, see the &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Debugger%20Setup&amp;amp;referringTitle=Build%20Instructions"&gt;Debugger Setup&lt;/a&gt; topic.&lt;br /&gt; &lt;br /&gt;Finally, the &lt;b&gt;CompositeWPFShell-1.0.1.0-XXXX.zip&lt;/b&gt; archive file contains the redistributable components for each build configuration type that is produced by the build process. Typically, the software is produced in two configurations: Debug and Release. The Debug mode builds have extra debugging information stored in their .pdb files, while the Release mode builds are meant for public consumption and reuse.&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Wed, 26 Nov 2008 19:30:35 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Build Instructions 20081126073035P</guid></item><item><title>Updated Wiki: How to extend the shell</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=How to extend the shell&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
TODO: Add documentation here. The topic right now just has the relevant code:&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Shell&lt;/span&gt;:&lt;span style="color:#A31515;"&gt;ShellApplication&lt;/span&gt; 
    &lt;span style="color:#FF0000;"&gt;x:Class&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;MyShell.ExtendedShellApplication&amp;quot;&lt;/span&gt;
    &lt;span style="color:#FF0000;"&gt;xmlns&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;
    &lt;span style="color:#FF0000;"&gt;xmlns:x&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;
    &lt;span style="color:#FF0000;"&gt;xmlns:Shell&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;clr-namespace:Neudesic.CompositeWpf.Shell;assembly=Shell&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Application.Resources&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Application.Resources&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Shell&lt;/span&gt;:&lt;span style="color:#A31515;"&gt;ShellApplication&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt; MyShell
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; ExtendedShellApplication
    {
        &lt;span style="color:#008000;"&gt;// TODO: add custom method overrides here.&lt;/span&gt;
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sun, 16 Nov 2008 16:28:21 GMT</pubDate><guid isPermaLink="false">Updated Wiki: How to extend the shell 20081116042821P</guid></item><item><title>Updated Wiki: Users Guide</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Users Guide&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Topics
&lt;/h1&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=How%20to%20extend%20the%20shell&amp;amp;referringTitle=Users%20Guide"&gt;How to extend the shell&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sun, 16 Nov 2008 16:24:28 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Users Guide 20081116042428P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Home&amp;version=6</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt;The purpose of this project is to develop a standard WPF application shell using the Composite Application Guidance for WPF. This project will develop standards, patterns, and best practices for building composite applications using WPF.
&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Overview
&lt;/h1&gt;The Composite WPF Shell project builds on the Microsoft Patterns &amp;amp; Practices Composite Application Guidance for WPF. While the goal of the Composite Application Guidance project is to build a reusable framework for creating composite WPF-based applications, the goal of this project is to build a standard, reusable shell application based on the Composite Application Guidance, as well as a basic set of modules that provide reusable services for applications based on the shell.&lt;br /&gt; &lt;br /&gt;The application shell that is developed for this project is reusable for both commercial and noncommercial uses. The shell was developed using best practices and standard patterns in mind in order to give application developers a starting point for building their applications, without needing to spend additional time building a shell.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Topics
&lt;/h1&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Users%20Guide&amp;amp;referringTitle=Home"&gt;Users Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Developer%20Information&amp;amp;referringTitle=Home"&gt;Developer Information&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sun, 16 Nov 2008 16:23:37 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20081116042337P</guid></item><item><title>Updated Wiki: Developer Information</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Developer Information&amp;version=13</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Introduction
&lt;/h1&gt;As the Composite WPF Shell project is intended to be an open source project, it's important for the success of this project that the source code be easy to work with. Over time, as this project develops and grows, there should hopefully be a lot of cool stuff to look at and play with. In order to make the experience of working with the source code successful, this area of the wiki has been set up to help project developers and project consumers understand what they need to do to be successful with the source code.&lt;br /&gt; &lt;br /&gt;When possible, all external dependencies are included in the source code repository and branched into the subprojects that depend on them (see &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Source%20Code%20Project%20Structure&amp;amp;referringTitle=Developer%20Information"&gt;Source Code Project Structure&lt;/a&gt;. In specific cases, however, either the external dependency could not be included in the source code repository, or the project team determined that the software was better left outside. In these cases, the external software requirements are being documented in the &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Software%20Prerequisites&amp;amp;referringTitle=Developer%20Information"&gt;Software Prerequisites&lt;/a&gt; wiki topic. The project team will do its best to keep this topic updated as we adopt new software requirements, or as we upgrade to newer software versions. We will also make an effort to ensure that newer versions of the software are identified in the release notes for projects.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Topics
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
Participating in the project
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Software%20Prerequisites&amp;amp;referringTitle=Developer%20Information"&gt;Software Prerequisites&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Source%20Code%20Project%20Structure&amp;amp;referringTitle=Developer%20Information"&gt;Source Code Project Structure&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Build%20Instructions&amp;amp;referringTitle=Developer%20Information"&gt;Build Instructions&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Strong%20Naming&amp;amp;referringTitle=Developer%20Information"&gt;Strong Naming&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=How%20to%20run%20FitNesse%20to%20perform%20acceptance%20tests&amp;amp;referringTitle=Developer%20Information"&gt;How to run FitNesse to perform acceptance tests&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Using%20SUPERASSERT.NET&amp;amp;referringTitle=Developer%20Information"&gt;Using SUPERASSERT.NET&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Coding standards
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Coding%20Standards%20and%20Guidelines&amp;amp;referringTitle=Developer%20Information"&gt;Coding Standards and Guidelines&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Rules%20and%20Principles&amp;amp;referringTitle=Developer%20Information"&gt;Rules and Principles&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Project design and management
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Blue%20Sky%20Area&amp;amp;referringTitle=Developer%20Information"&gt;Blue Sky Area&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Product%20Backlog&amp;amp;referringTitle=Developer%20Information"&gt;Product Backlog&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
About the project
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Project%20Team&amp;amp;referringTitle=Developer%20Information"&gt;Project Team&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 15 Nov 2008 20:55:06 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Developer Information 20081115085506P</guid></item><item><title>Updated Wiki: Strong Naming</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Strong Naming&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
All assemblies used by and produced by the Composite WPF Shell are strong named. However, while the assemblies are strong named, the official key used to strong name the release assemblies is protected. Instead, the source code repository includes only the public key portion of the strong name key.&lt;br /&gt; &lt;br /&gt;In order to work with the assemblies that are produced by Visual Studio or the automated build process when you are working directly with the code, you must register assemblies using the strong name key to skip assembly verification. In order to do this, follow these steps:&lt;br /&gt; &lt;br /&gt;&lt;ol&gt;
&lt;li&gt;Open a command prompt window. If you are running in Windows Vista or without administrator rights (which you should be doing anyways), you will need to open the command prompt window as an administrator.&lt;/li&gt;&lt;li&gt;Run the following command: &lt;b&gt;sn -Vr *,89c163e95610ced3&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;After doing this, you should be able to debug or run the applications without receiving strong name verification errors.&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 15 Nov 2008 19:52:17 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Strong Naming 20081115075217P</guid></item><item><title>Updated Wiki: Developer Information</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Developer Information&amp;version=12</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Introduction
&lt;/h1&gt;As the Composite WPF Shell project is intended to be an open source project, it's important for the success of this project that the source code be easy to work with. Over time, as this project develops and grows, there should hopefully be a lot of cool stuff to look at and play with. In order to make the experience of working with the source code successful, this area of the wiki has been set up to help project developers and project consumers understand what they need to do to be successful with the source code.&lt;br /&gt; &lt;br /&gt;When possible, all external dependencies are included in the source code repository and branched into the subprojects that depend on them (see &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Source%20Code%20Project%20Structure&amp;amp;referringTitle=Developer%20Information"&gt;Source Code Project Structure&lt;/a&gt;. In specific cases, however, either the external dependency could not be included in the source code repository, or the project team determined that the software was better left outside. In these cases, the external software requirements are being documented in the &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Software%20Prerequisites&amp;amp;referringTitle=Developer%20Information"&gt;Software Prerequisites&lt;/a&gt; wiki topic. The project team will do its best to keep this topic updated as we adopt new software requirements, or as we upgrade to newer software versions. We will also make an effort to ensure that newer versions of the software are identified in the release notes for projects.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Topics
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
Participating in the project
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Software%20Prerequisites&amp;amp;referringTitle=Developer%20Information"&gt;Software Prerequisites&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Source%20Code%20Project%20Structure&amp;amp;referringTitle=Developer%20Information"&gt;Source Code Project Structure&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Build%20Instructions&amp;amp;referringTitle=Developer%20Information"&gt;Build Instructions&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Strong%20Naming&amp;amp;referringTitle=Developer%20Information"&gt;Strong Naming&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=How%20to%20run%20FitNesse%20to%20perform%20acceptance%20tests&amp;amp;referringTitle=Developer%20Information"&gt;How to run FitNesse to perform acceptance tests&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Coding standards
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Coding%20Standards%20and%20Guidelines&amp;amp;referringTitle=Developer%20Information"&gt;Coding Standards and Guidelines&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Rules%20and%20Principles&amp;amp;referringTitle=Developer%20Information"&gt;Rules and Principles&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Project design and management
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Blue%20Sky%20Area&amp;amp;referringTitle=Developer%20Information"&gt;Blue Sky Area&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Product%20Backlog&amp;amp;referringTitle=Developer%20Information"&gt;Product Backlog&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
About the project
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Project%20Team&amp;amp;referringTitle=Developer%20Information"&gt;Project Team&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 15 Nov 2008 19:47:19 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Developer Information 20081115074719P</guid></item><item><title>Updated Wiki: Software Prerequisites</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Software Prerequisites&amp;version=4</link><description>&lt;div class="wikidoc"&gt;
In order to contribute to this project or work with the source code, you must install the following software:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/CodePlex/Wiki/View.aspx?title=Using%20TortoiseSVN%20with%20CodePlex&amp;amp;referringTitle=Source%20control%20clientshttp://www.codeplex.com/CodePlex/Wiki/View.aspx?title=Using%20TortoiseSVN%20with%20CodePlex&amp;amp;referringTitle=Source%20control%20clients" class="externalLink"&gt;TortoiseSVN&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: We recommend the use of TortoiseSVN to access the source code in the source code repository.&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/downloads/?intcmp=1281" class="externalLink"&gt;Java SE Runtime Environment 1.5 or newer&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: Java is required to run the FitNesse web server for acceptance testing purposes.&lt;/li&gt;&lt;li&gt;&lt;a href="http://msbuildtasks.tigris.org/" class="externalLink"&gt;MSBuild Community Tasks&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: These MSBuild tasks are used by the master build script to build the software projects.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx" class="externalLink"&gt;DebuggingToolsForWindows&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: The build scripts use the Debugging Tools for Windows programs to build the private and public symbol stores and extract the source code from the source code repository for storage on the public source code server.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.activestate.com/Products/activeperl/index.mhtml" class="externalLink"&gt;ActivePerl&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: The Debugging Tools for Windows scripts for the source code server use Perl. Any Perl interpreter will do. I typically use ActiveState's standard Perl distribution.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/sourceanalysis/Release/ProjectReleases.aspx?ReleaseId=1425" class="externalLink"&gt;Microsoft StyleCop 4.3&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;: We use Microsoft StyleCop to perform source code analysis during builds to ensure that all source code follows established coding standards for the project.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Sat, 15 Nov 2008 14:26:53 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Software Prerequisites 20081115022653P</guid></item><item><title>Updated Wiki: Build Instructions</title><link>http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Build Instructions&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
About the build process
&lt;/h1&gt;The Composite WPF Shell project offers a completely automated build environment that is maintained continuously as the project develops and evolves. It is expected that each contributor is also verifying the the automated build process continues to work and is continually updated as each new change is committed to the source code repository. The automated build process for the Composite WPF Shell is driven using the MSBuild build engine that is provided as part of the Microsoft .NET framework.&lt;br /&gt; &lt;br /&gt;To make building the entire project easier for developers and end-users that prefer to work directly with the source code in their own environments, two batch scripts have been provided in the root directory of each subproject. These batch scripts will run the build process in different modes. The first batch script, named &lt;b&gt;Build.cmd&lt;/b&gt;, is used to perform a complete build of the specific subproject. The result of running the &lt;b&gt;Build.cmd&lt;/b&gt; batch script will be a set of .zip archive files containing the redistributable components for the specific subproject.&lt;br /&gt; &lt;br /&gt;The second batch script is named &lt;b&gt;Clean.cmd&lt;/b&gt;. &lt;b&gt;Clean.cmd&lt;/b&gt; is used to delete all build-generated files and directories from your project workspace. The &lt;b&gt;Clean.cmd&lt;/b&gt; script is useful if you wish to return your project workspace to its original condition, reset your local builds, or automatically delete a number of builds that you've created that are being stored on your hard drive.&lt;br /&gt; &lt;br /&gt;&lt;h1&gt;
Build outputs
&lt;/h1&gt;After you create a project workspace by checking out the source code from the source code repository, or after downloading a source code release, your root directory of your project workspace will look like the following:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;i&gt;(root directory)&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/Documentation&lt;/li&gt;&lt;li&gt;/Libraries&lt;/li&gt;&lt;li&gt;/SourceCode&lt;/li&gt;&lt;li&gt;/Tools&lt;/li&gt;&lt;li&gt;Build.cmd&lt;/li&gt;&lt;li&gt;Clean.cmd&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt; &lt;br /&gt;If you were to run the &lt;b&gt;Build.cmd&lt;/b&gt; batch script, a new directory will be created named &lt;b&gt;Build&lt;/b&gt;:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;i&gt;(root directory)&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/Build&lt;/li&gt;&lt;li&gt;/Documentation&lt;/li&gt;&lt;li&gt;/Libraries&lt;/li&gt;&lt;li&gt;/SourceCode&lt;/li&gt;&lt;li&gt;/Tools&lt;/li&gt;&lt;li&gt;Build.cmd&lt;/li&gt;&lt;li&gt;Clean.cmd&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt; &lt;br /&gt;The &lt;b&gt;Build&lt;/b&gt; directory is used for staging, post-build processing, and storage of the redistributable .zip archives or Windows Installer packages that are produced by the project. Inside the &lt;b&gt;Build&lt;/b&gt; directory, you'll see this typical structure:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;i&gt;(root directory)&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/Build&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;/1.0.0.1&lt;/li&gt;&lt;li&gt;/1.0.0.2&lt;/li&gt;&lt;li&gt;/1.0.1.0&lt;/li&gt;&lt;li&gt;/1.1.2.0&lt;/li&gt;&lt;li&gt;/... &lt;i&gt;(other version directories)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Version.txt&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt; &lt;br /&gt;One feature of the automated build process is that the build process automatically manages the version numbers for the project. Each new build is given a new version number to differentiate it from the previous version number. Each time you run the &lt;b&gt;Build.cmd&lt;/b&gt; batch script to build the project, the build process will generate a new build version number and will create a subdirectory in the &lt;b&gt;Build&lt;/b&gt; directory to store the outputs for that specific build. Any .zip archives that are produced by the build will also be labelled with their build version number.&lt;br /&gt; &lt;br /&gt;Inside of the version-specific build directory, you'll see a number of files and directories. Some directories are used to store files for staging or post-processing. Other directories have files that are meant to be redistributed or used for another specific purpose such as debugging symbols or extracted source code that can be published to a source code server (see &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Version%20Numbers&amp;amp;referringTitle=Build%20Instructions"&gt;Version Numbers&lt;/a&gt;).&lt;br /&gt; &lt;br /&gt;In the root of the version-specific build directory, there will also typically be one or more .zip archives containing redistributable components in an easy to deploy form. Using the Composite WPF Shell project as an example, you'll typically see the following set of .zip archives:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;CompositeWPFShell-1.0.1.0-SourceCode.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PrivateSymbols-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSymbols-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PrivateSymbols-Release.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSymbols-Release.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSourceCode-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-PublicSourceCode-Release.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-Debug.zip&lt;/li&gt;&lt;li&gt;CompositeWPFShell-1.0.1.0-Release.zip&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;The &lt;b&gt;CompositeWPFShell-1.0.1.0-SourceCode.zip&lt;/b&gt; archive file contains all of the source code that was used in the specific build. This can be used to publish the source code with a specific release to make it easier for end-users that prefer or wish to work with the source code. &lt;br /&gt; &lt;br /&gt;The &lt;b&gt;CompositeWPFShell-1.0.1.0-PrivateSymbols-XXXX.zip&lt;/b&gt; archive files contain the private .pdb debugging symbol files for either the Debug or Release configuration builds of the project. The .pdb files for the Debug build have more debugging information in them and are valuable for developers working with the source code. For most purposes, the private symbols are only useful for the immediate contributors to the software project and should be added to a private symbol store maintained on an intranet. These symbol files are not of interest to most developers that are simply working with or using the Composite WPF Shell in their own projects. &lt;br /&gt; &lt;br /&gt;The &lt;b&gt;CompositeWPFShell-1.0.1.0-PublicSymbols-XXXX.zip&lt;/b&gt; archive files contain the public symbols for the software. These symbols are more useful to those that are reusing the software in their own projects. However, it is not necessary for any developers to specifically use these symbol files in their development. This is because these same symbols are published to a public web site and are directly accessible by debuggers such as Visual Studio or WinDbg. The &lt;b&gt;CompositeWPFShell-1.0.1.0-PublicSourceCode-XXXX.zip&lt;/b&gt; archive file contains the public source code for the project. This source code differs from the &lt;b&gt;CompositeWPFShell-1.0.1.0-SourceCode.zip&lt;/b&gt; archive significantly. While the previous file was a complete snapshot of the source code from the project workspace where the build occurred, the latter file is an extraction of the source code that was used in the build directly from the source code repository. Again, this file is not directly of interest to other developers because these files are published by the project team to another public web site and are directly accessible by debuggers such as Visual Studio or WinDbg. For more information on configuring your development environment to debug using these public symbols, see the &lt;a href="http://www.codeplex.com/compositewpfshell/Wiki/View.aspx?title=Debugger%20Setup&amp;amp;referringTitle=Build%20Instructions"&gt;Debugger Setup&lt;/a&gt; topic.&lt;br /&gt; &lt;br /&gt;Finally, the &lt;b&gt;CompositeWPFShell-1.0.1.0-XXXX.zip&lt;/b&gt; archive file contains the redistributable components for each build configuration type that is produced by the build process. Typically, the software is produced in two configurations: Debug and Release. The Debug mode builds have extra debugging information stored in their .pdb files, while the Release mode builds are meant for public consumption and reuse.&lt;br /&gt;
&lt;/div&gt;</description><author>mfcollins3</author><pubDate>Thu, 13 Nov 2008 13:08:33 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Build Instructions 20081113010833P</guid></item></channel></rss>