<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Elegant Code &#187; Brian Lagunas</title>
	<atom:link href="http://elegantcode.com/author/blagunas/feed/" rel="self" type="application/rss+xml" />
	<link>http://elegantcode.com</link>
	<description></description>
	<lastBuildDate>Sat, 11 Feb 2012 04:39:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Free Pluralsight Prism Training</title>
		<link>http://elegantcode.com/2011/11/04/free-prism-training/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=free-prism-training</link>
		<comments>http://elegantcode.com/2011/11/04/free-prism-training/#comments</comments>
		<pubDate>Sat, 05 Nov 2011 04:23:40 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[.Net 4.0]]></category>
		<category><![CDATA[Prism]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[p&p]]></category>
		<category><![CDATA[prism]]></category>
		<category><![CDATA[training]]></category>
		<category><![CDATA[windows phone 7]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2011/11/04/free-prism-training/</guid>
		<description><![CDATA[I am excited to announce that Pluralsight and Microsoft’s Patterns &#38; Practices team have joined forces to provide you with free access to over 4 hours of online Prism training.&#160; That’s right, you heard me correctly. FREE online Prism training sponsored by the one and only Patterns &#38; Practices team.&#160; I know you have some [...]]]></description>
			<content:encoded><![CDATA[<p>I am excited to announce that <a href="http://www.pluralsight-training.net/microsoft/" target="_blank">Pluralsight</a> and <a href="http://msdn.microsoft.com/en-us/practices/bb190332" target="_blank">Microsoft’s Patterns &amp; Practices</a> team have joined forces to provide you with free access to over 4 hours of online Prism training.&#160; That’s right, you heard me correctly. FREE online Prism training sponsored by the one and only Patterns &amp; Practices team.&#160; I know you have some question so let me answer the most common:</p>
<h4>Q &amp; A</h4>
<p><strong>Q1. When is this free training available?</strong>     <br />A1. The entire weekend of Nov 12th 2011 through Nov 14th 2011.</p>
<p><strong>Q2. Do I have to be a Pluralsight subscriber to get this awesome training?</strong>     <br />A2. This training will be freely available to everyone. You do not have to be a subscriber.</p>
<p><strong>Q3. What does the course cover?</strong>     <br />A3. Well let’s take a look:</p>
<ul>
<li>Getting started with Prism </li>
<li>Bootstrapper and Shell </li>
<li>Regions </li>
<li>Modules </li>
<li>Views </li>
<li>Communication </li>
<li>State-Based Navigation </li>
<li>View-Based Navigation </li>
</ul>
<p><a href="http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=prism-introduction" target="_blank"><em>More course information.</em></a></p>
<p><strong>Q4. Who is the author of this kick ass Prism course?</strong>     <br />Q4. That would be me.</p>
<p><strong>Q5. Is it really free?</strong>     <br />Q5. You’re kidding right? Didn’t I already cover this part? Yes, it is free.</p>
<h4>New and Improved</h4>
<p>If you are a subscriber and have already watched the course, I would like to bring to your attention that there have been two new modules added.&#160; These modules will cover everything you need to know in order to start using the navigation services provided by Prism.&#160; This includes state-based navigation and view-based navigation.</p>
<p>Mark your calendar for Nov 12th and be sure to cram as much Prism knowledge into your brain as you can before the weekend ends.&#160; Don’t worry, if you run out of time you can always ask me questions directly.&#160; You can contact me either through Twitter (@<a href="http://twitter.com/brianlagunas" target="_blank">brianlagunas</a>) or through the <a href="http://wpftoolkit.codeplex.com/" target="_blank">Extended WPF Toolkit</a> project site.&#160; I hope you enjoy the training.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2011/11/04/free-prism-training/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Extended WPF Toolkit&#8211;the updated PropertyGrid</title>
		<link>http://elegantcode.com/2011/10/21/extended-wpf-toolkitthe-updated-propertygrid/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=extended-wpf-toolkitthe-updated-propertygrid</link>
		<comments>http://elegantcode.com/2011/10/21/extended-wpf-toolkitthe-updated-propertygrid/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 18:26:07 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[.Net 4.0]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[extended wpf toolkit]]></category>
		<category><![CDATA[propertygrid]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2011/10/21/extended-wpf-toolkitthe-updated-propertygrid/</guid>
		<description><![CDATA[The PropertyGrid control in the Extended WPF Toolkit was released in version 1.4.0 as beta. Since then I have had another release of version 1.5.0 in which the PropertyGrid was still in beta. Well it is beta no more! I have given the PropertyGrid a lot of love an affection over the past few weeks [...]]]></description>
			<content:encoded><![CDATA[<div>The PropertyGrid control in the <a href="http://wpftoolkit.codeplex.com/" target="_blank">Extended WPF Toolkit</a> was released in version 1.4.0 as beta.  Since then I have had another release of version 1.5.0 in which the PropertyGrid was still in beta.  Well it is beta no more! I have given the PropertyGrid a lot of love an affection over the past few weeks and it is finally ready for prime time.  Unfortunately, you will have to wait until the release of version 1.6.0 to get an official version.  Luckily for you, the source code is available for you to download and compile to get the latest and greatest PropertyGrid features.  So what can you do with the PropertyGrid?  Let’s look at some of the notable new and improved features.</div>
<div><a href="http://elegantcode.com/wp-content/uploads/2011/10/propertygrid.jpg"><img title="propertygrid" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" src="http://elegantcode.com/wp-content/uploads/2011/10/propertygrid_thumb.jpg" border="0" alt="propertygrid" width="406" height="743" /></a></div>
<div>Of course the PropertyGrid has the expected behavior of binding to an object instance and showing all the properties for your editing desires.  It allows you sort display properties by category or alphabetically.  It also provides a nice little search textbox so you can find exactly what you are looking for.</div>
<h4>Specifying Properties</h4>
<div>By default the PropertyGrid will autogenerate all the properties for a given object. Never fear, you can override this behavior by setting the AutoGenerateProperties property to False, and then provide a collection of PropertyDefinitions of the properties you would like to show.</div>
<div><a href="http://elegantcode.com/wp-content/uploads/2011/10/specifyingproperties.jpg"><img title="specifyingproperties" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" src="http://elegantcode.com/wp-content/uploads/2011/10/specifyingproperties_thumb.jpg" border="0" alt="specifyingproperties" width="473" height="235" /></a></div>
<div style="margin: 0px; display: inline; float: none; padding: 0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cff8cdfc-2e9a-49b5-941a-ae3cf5e51557" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt;">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap;"><span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyGrid</span><span style="color: #ff0000;"> x</span><span style="color: #0000ff;">:</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">=&#8221;_propertyGrid&#8221;</span><span style="color: #ff0000;"> Width</span><span style="color: #0000ff;">=&#8221;450&#8243;</span><span style="color: #ff0000;"> Margin</span><span style="color: #0000ff;">=&#8221;10&#8243;</span><br />
<span style="color: #ff0000;"> AutoGenerateProperties</span><span style="color: #0000ff;">=&#8221;False&#8221;&gt;</span><br />
<span style="color: #008000;">&lt;!&#8211; Only the following properties will be displayed in the PropertyGrid &#8211;&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyGrid.PropertyDefinitions</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyDefinition</span><span style="color: #ff0000;"> Name</span><span style="color: #0000ff;">=&#8221;FirstName&#8221; /&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyDefinition</span><span style="color: #ff0000;"> Name</span><span style="color: #0000ff;">=&#8221;FavoriteColor&#8221; /&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyDefinition</span><span style="color: #ff0000;"> Name</span><span style="color: #0000ff;">=&#8221;PetNames&#8221; /&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyGrid.PropertyDefinitions</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyGrid</span><span style="color: #0000ff;">&gt;</span></div>
</div>
</div>
<div></div>
<h4>Custom Editors</h4>
<div>By default the PropertyGrid comes with 14 built-in editors:</div>
<ul>
<li>CheckBoxEditor</li>
<li>CollectionEditor</li>
<li>ColorEditor</li>
<li>DateTimeUpDownEditor</li>
<li>DecimalUpDownEditor</li>
<li>DoubleUpDownEditor</li>
<li>EnumComboBoxEditor</li>
<li>FontComboBoxEditor</li>
<li>IntegerUpDownEditor</li>
<li>ItemsSourceEditor</li>
<li>PrimitiveTypeCollectionEditor</li>
<li>TextBlockEditor</li>
<li>TextBoxEditor</li>
<li>TimeSpanEditor</li>
</ul>
<div>These editors don’t meet your needs? No problem!  You can override the default editors with your own custom editors with a DataTemplate. Simply define an EditorDefinition that either targets a Type, property name, or both and set the EditorDefinition.EditorTemplate to an instance of a DataTemplate. Be sure to bind your custom editor to the bound property item&#8217;s Value property.</div>
<div style="margin: 0px; display: inline; float: none; padding: 0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:340c1fd1-6067-4bf0-8add-ca2af36e45b1" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt;">
<div style="background-color: #ffffff; max-height: 500px; overflow: auto; padding: 2px 5px; white-space: nowrap;"><span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyGrid</span><span style="color: #ff0000;"> x</span><span style="color: #0000ff;">:</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">=&#8221;_propertyGrid1&#8243;</span><span style="color: #ff0000;"> Width</span><span style="color: #0000ff;">=&#8221;450&#8243;</span> <span style="color: #ff0000;"> Margin</span><span style="color: #0000ff;">=&#8221;10&#8243;&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyGrid.EditorDefinitions</span><span style="color: #0000ff;">&gt;</span></p>
<p><span style="color: #008000;">&lt;!&#8211; This EditorDefinition will provide a TextBox to any property that is of type HorizontalAlignment, replacing the default ComboBox editor. &#8211;&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition</span><span style="color: #ff0000;"> TargetType</span><span style="color: #0000ff;">=&#8221;{</span><span style="color: #a31515;">x</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">Type</span><span style="color: #ff0000;"> HorizontalAlignment}</span><span style="color: #0000ff;">&#8220;&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition.EditorTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">DataTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">TextBox</span><span style="color: #ff0000;"> Background</span><span style="color: #0000ff;">=&#8221;Green&#8221;</span> <span style="color: #ff0000;"> Text</span><span style="color: #0000ff;">=&#8221;{</span><span style="color: #a31515;">Binding</span><span style="color: #ff0000;"> Value}</span><span style="color: #0000ff;">&#8221; /&gt;</span><span style="color: #a31515;"> </span><span style="color: #008000;">&lt;!&#8211; Always bind your editor&#8217;s value to the bound property&#8217;s Value &#8211;&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">DataTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition.EditorTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition</span><span style="color: #0000ff;">&gt;</span></p>
<p><span style="color: #008000;">&lt;!&#8211; This EditorDefinition will provide a TextBlock to any property that has any of the defined property names, replacing the default editor. &#8211;&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition.PropertiesDefinitions</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyDefinition</span><span style="color: #ff0000;"> Name</span><span style="color: #0000ff;">=&#8221;Age&#8221; /&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyDefinition</span><span style="color: #ff0000;"> Name</span><span style="color: #0000ff;">=&#8221;WritingFont&#8221; /&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyDefinition</span><span style="color: #ff0000;"> Name</span><span style="color: #0000ff;">=&#8221;Spouse&#8221; /&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition.PropertiesDefinitions</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition.EditorTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">DataTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">TextBlock</span><span style="color: #ff0000;"> Background</span><span style="color: #0000ff;">=&#8221;Yellow&#8221;</span> <span style="color: #ff0000;"> Text</span><span style="color: #0000ff;">=&#8221;{</span><span style="color: #a31515;">Binding</span><span style="color: #ff0000;"> Value}</span><span style="color: #0000ff;">&#8221; /&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">DataTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition.EditorTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition</span><span style="color: #0000ff;">&gt;</span></p>
<p><span style="color: #008000;">&lt;!&#8211; This EditorDefinition will provide a TextBox to any property that is of type Boolean and that has any of the defined property names, replacing the default editor. &#8211;&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition</span><span style="color: #ff0000;"> TargetType</span><span style="color: #0000ff;">=&#8221;{</span><span style="color: #a31515;">x</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">Type</span><span style="color: #ff0000;"> sys</span><span style="color: #0000ff;">:</span><span style="color: #ff0000;">Boolean}</span><span style="color: #0000ff;">&#8220;&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition.PropertiesDefinitions</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyDefinition</span><span style="color: #ff0000;"> Name</span><span style="color: #0000ff;">=&#8221;DateOfBirth&#8221; /&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyDefinition</span><span style="color: #ff0000;"> Name</span><span style="color: #0000ff;">=&#8221;LastName&#8221; /&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition.PropertiesDefinitions</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition.EditorTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">DataTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">TextBox</span><span style="color: #ff0000;"> Background</span><span style="color: #0000ff;">=&#8221;Red&#8221;</span> <span style="color: #ff0000;"> Text</span><span style="color: #0000ff;">=&#8221;{</span><span style="color: #a31515;">Binding</span><span style="color: #ff0000;"> Value}</span><span style="color: #0000ff;">&#8221; /&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">DataTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition.EditorTemplate</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">EditorDefinition</span><span style="color: #0000ff;">&gt;</span></p>
<p><span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyGrid.EditorDefinitions</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">extToolkit</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PropertyGrid</span><span style="color: #0000ff;">&gt;</span></div>
</div>
</div>
<div>Don’t like DataTemplates? No problem!  You can supply editors for a property by using the System.ComponentModel.EditorAttribute. In order to provide an editor with an attribute, the editor MUST implement the ITypeEditor interface. Your editor can be a simple class or a complex UserControl.</div>
<div><a href="http://elegantcode.com/wp-content/uploads/2011/10/customeditor_attributes.jpg"><img title="customeditor_attributes" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" src="http://elegantcode.com/wp-content/uploads/2011/10/customeditor_attributes_thumb.jpg" border="0" alt="customeditor_attributes" width="477" height="240" /></a></div>
<div style="margin: 0px; display: inline; float: none; padding: 0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c7572a68-6bf0-43ba-b987-a87ed9136b14" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt;">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #2b91af;">Person</span><br />
{<br />
[<span style="color: #2b91af;">Category</span>(<span style="color: #a31515;">"Information"</span>)]<br />
[<span style="color: #2b91af;">DisplayName</span>(<span style="color: #a31515;">"First Name"</span>)]<br />
[<span style="color: #2b91af;">Description</span>(<span style="color: #a31515;">"This property uses a TextBox as the default editor."</span>)]<br />
<span style="color: #008000;">//This custom editor is a Class that implements the ITypeEditor interface</span><br />
[<span style="color: #2b91af;">Editor</span>(<span style="color: #0000ff;">typeof</span>(<span style="color: #2b91af;">FirstNameEditor</span>), <span style="color: #0000ff;">typeof</span>(<span style="color: #2b91af;">FirstNameEditor</span>))]<br />
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> FirstName { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span>; }</div>
<div>[<span style="color: #2b91af;">Category</span>(<span style="color: #a31515;">"Information"</span>)]<br />
[<span style="color: #2b91af;">DisplayName</span>(<span style="color: #a31515;">"Last Name"</span>)]<br />
[<span style="color: #2b91af;">Description</span>(<span style="color: #a31515;">"This property uses a TextBox as the default editor."</span>)]<br />
<span style="color: #008000;">//This custom editor is a UserControl that implements the ITypeEditor interface</span><br />
[<span style="color: #2b91af;">Editor</span>(<span style="color: #0000ff;">typeof</span>(<span style="color: #2b91af;">LastNameUserControlEditor</span>), <span style="color: #0000ff;">typeof</span>(<span style="color: #2b91af;">LastNameUserControlEditor</span>))]<br />
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> LastName { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span>; }<br />
}</div>
</div>
</div>
<div>Your editors can be created as a class:</div>
<div style="margin: 0px; display: inline; float: none; padding: 0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d2a30fc6-c092-478a-a85c-4ab12fd32646" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt;">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap;"><span style="color: #008000;">//Custom editors that are used as attributes MUST implement the ITypeEditor interface.</span><br />
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #2b91af;">FirstNameEditor</span> : Microsoft.Windows.Controls.PropertyGrid.Editors.<span style="color: #2b91af;">ITypeEditor</span><br />
{<br />
<span style="color: #0000ff;">public</span> <span style="color: #2b91af;">FrameworkElement</span> ResolveEditor(Microsoft.Windows.Controls.PropertyGrid.<span style="color: #2b91af;">PropertyItem</span> propertyItem)<br />
{<br />
<span style="color: #2b91af;">TextBox</span> textBox = <span style="color: #0000ff;">new</span> <span style="color: #2b91af;">TextBox</span>();<br />
textBox.Background = <span style="color: #0000ff;">new</span> <span style="color: #2b91af;">SolidColorBrush</span>(<span style="color: #2b91af;">Colors</span>.Red);</div>
<div><span style="color: #008000;">//create the binding from the bound property item to the editor</span><br />
<span style="color: #0000ff;">var</span> _binding = <span style="color: #0000ff;">new</span> <span style="color: #2b91af;">Binding</span>(<span style="color: #a31515;">&#8220;Value&#8221;</span>); <span style="color: #008000;">//bind to the Value property of the PropertyItem</span><br />
_binding.Source = propertyItem;<br />
_binding.ValidatesOnExceptions = <span style="color: #0000ff;">true</span>;<br />
_binding.ValidatesOnDataErrors = <span style="color: #0000ff;">true</span>;<br />
_binding.Mode = propertyItem.IsReadOnly ? <span style="color: #2b91af;">BindingMode</span>.OneWay : <span style="color: #2b91af;">BindingMode</span>.TwoWay;<br />
<span style="color: #2b91af;">BindingOperations</span>.SetBinding(textBox, <span style="color: #2b91af;">TextBox</span>.TextProperty, _binding);<br />
<span style="color: #0000ff;">return</span> textBox;<br />
}<br />
}</div>
</div>
</div>
<div>Or as a complex UserControl:</div>
<div style="margin: 0px; display: inline; float: none; padding: 0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:66e4302b-e2a0-4137-a11f-9f7c7992f92d" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt;">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap;"><span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">UserControl</span><span style="color: #ff0000;"> x</span><span style="color: #0000ff;">:</span><span style="color: #ff0000;">Class</span><span style="color: #0000ff;">=&#8221;Samples.Modules.PropertyGrid.LastNameUserControlEditor&#8221;</span><br />
<span style="color: #ff0000;"> xmlns</span><span style="color: #0000ff;">=&#8221;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#8221;</span><br />
<span style="color: #ff0000;"> xmlns</span><span style="color: #0000ff;">:</span><span style="color: #ff0000;">x</span><span style="color: #0000ff;">=&#8221;http://schemas.microsoft.com/winfx/2006/xaml&#8221;</span><br />
<span style="color: #ff0000;"> x</span><span style="color: #0000ff;">:</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">=&#8221;_uc&#8221;&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">StackPanel</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">TextBox</span><span style="color: #ff0000;"> Text</span><span style="color: #0000ff;">=&#8221;{</span><span style="color: #a31515;">Binding</span><span style="color: #ff0000;"> Value</span><span style="color: #0000ff;">,</span><span style="color: #ff0000;"> ElementName</span><span style="color: #0000ff;">=</span>_<span style="color: #0000ff;">uc}&#8221;</span><span style="color: #ff0000;"> Background</span><span style="color: #0000ff;">=&#8221;YellowGreen&#8221;</span> <span style="color: #0000ff;"> /&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">Button</span><span style="color: #ff0000;"> Click</span><span style="color: #0000ff;">=&#8221;Button_Click&#8221;&gt;</span><span style="color: #a31515;">Clear</span><span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">Button</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">StackPanel</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">UserControl</span><span style="color: #0000ff;">&gt;</span></div>
</div>
</div>
<div style="margin: 0px; display: inline; float: none; padding: 0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c44d7199-8bac-4ad2-8a36-8ae2698395d6" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt;">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> <span style="color: #2b91af;">LastNameUserControlEditor</span> : <span style="color: #2b91af;">UserControl</span>, <span style="color: #2b91af;">ITypeEditor</span><br />
{<br />
<span style="color: #0000ff;">public</span> LastNameUserControlEditor()<br />
{<br />
InitializeComponent();<br />
}</div>
<div><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">readonly</span> <span style="color: #2b91af;">DependencyProperty</span> ValueProperty = <span style="color: #2b91af;">DependencyProperty</span>.Register(<span style="color: #a31515;">&#8220;Value&#8221;</span>, <span style="color: #0000ff;">typeof</span>(<span style="color: #0000ff;">string</span>), <span style="color: #0000ff;">typeof</span>(<span style="color: #2b91af;">LastNameUserControlEditor</span>), <span style="color: #0000ff;">new</span> <span style="color: #2b91af;">FrameworkPropertyMetadata</span>(<span style="color: #0000ff;">null</span>, <span style="color: #2b91af;">FrameworkPropertyMetadataOptions</span>.BindsTwoWayByDefault));<br />
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Value<br />
{<br />
<span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> (<span style="color: #0000ff;">string</span>)GetValue(ValueProperty); }<br />
<span style="color: #0000ff;">set</span> { SetValue(ValueProperty, <span style="color: #0000ff;">value</span>); }<br />
}</div>
<div><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> Button_Click(<span style="color: #0000ff;">object</span> sender, <span style="color: #2b91af;">RoutedEventArgs</span> e)<br />
{<br />
Value = <span style="color: #0000ff;">string</span>.Empty;<br />
}</div>
<div><span style="color: #0000ff;">public</span> <span style="color: #2b91af;">FrameworkElement</span> ResolveEditor(Microsoft.Windows.Controls.PropertyGrid.<span style="color: #2b91af;">PropertyItem</span> propertyItem)<br />
{<br />
<span style="color: #2b91af;">Binding</span> binding = <span style="color: #0000ff;">new</span> <span style="color: #2b91af;">Binding</span>(<span style="color: #a31515;">&#8220;Value&#8221;</span>);<br />
binding.Source = propertyItem;<br />
binding.Mode = propertyItem.IsReadOnly ? <span style="color: #2b91af;">BindingMode</span>.OneWay : <span style="color: #2b91af;">BindingMode</span>.TwoWay;<br />
<span style="color: #2b91af;">BindingOperations</span>.SetBinding(<span style="color: #0000ff;">this</span>, <span style="color: #2b91af;">LastNameUserControlEditor</span>.ValueProperty, binding);<br />
<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>;<br />
}<br />
}</div>
</div>
</div>
<h4>Custom ItemsSource</h4>
<div>Sometimes it is desirable to want to provide a collection of values represented by a ComboBox for a given property. The PropertyGrid supports this scenario by creating a class that implements the IItemsSource interface and decorating your property with the ItemsSourceAttribute.</div>
<div><a href="http://elegantcode.com/wp-content/uploads/2011/10/custom_itemssource.jpg"><img title="custom_itemssource" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" src="http://elegantcode.com/wp-content/uploads/2011/10/custom_itemssource_thumb.jpg" border="0" alt="custom_itemssource" width="473" height="484" /></a></div>
<div style="margin: 0px; display: inline; float: none; padding: 0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fbac7ce0-9aa0-4d3c-aafc-2e5e0cef1807" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt;">
<div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px; white-space: nowrap;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #2b91af;">Person</span><br />
{<br />
[<span style="color: #2b91af;">Category</span>(<span style="color: #a31515;">"Writing"</span>)]<br />
[<span style="color: #2b91af;">DisplayName</span>(<span style="color: #a31515;">"Writing Font Size"</span>)]<br />
[<span style="color: #2b91af;">Description</span>(<span style="color: #a31515;">"This property uses the DoubleUpDown as the default editor."</span>)]<br />
[<span style="color: #2b91af;">ItemsSource</span>(<span style="color: #0000ff;">typeof</span>(<span style="color: #2b91af;">FontSizeItemsSource</span>))]<br />
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">double</span> WritingFontSize { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span>; }<br />
}</div>
</div>
</div>
<div style="margin: 0px; display: inline; float: none; padding: 0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e1b0d1f8-7fbf-4976-a1ff-8f5476b08197" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt;">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #2b91af;">FontSizeItemsSource</span> : <span style="color: #2b91af;">IItemsSource</span><br />
{<br />
<span style="color: #0000ff;">public</span> <span style="color: #2b91af;">IList</span>&lt;<span style="color: #0000ff;">object</span>&gt; GetValues()<br />
{<br />
<span style="color: #2b91af;">List</span>&lt;<span style="color: #0000ff;">object</span>&gt; sizes = <span style="color: #0000ff;">new</span> <span style="color: #2b91af;">List</span>&lt;<span style="color: #0000ff;">object</span>&gt;()<br />
{<br />
5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,12.0,14.0,16.0,18.0,20.0<br />
};<br />
<span style="color: #0000ff;">return</span> sizes;<br />
}<br />
}</div>
</div>
</div>
<h4>Expandable Properties</h4>
<div>Wait a minute… I’m not done yet.  Do you have a property of a complex object that you want to expand in the PropertyGrid?  You do?  Well then you want to pay attention to this.  The PropertyGrid supports this scenario and allows you to drill down into a property&#8217;s heirarchy. To enable this behavior you must decorate your property with the ExpandableObject attribute.</div>
<div><a href="http://elegantcode.com/wp-content/uploads/2011/10/expandableobject.jpg"><img title="expandableobject" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" src="http://elegantcode.com/wp-content/uploads/2011/10/expandableobject_thumb.jpg" border="0" alt="expandableobject" width="469" height="408" /></a></div>
<div style="margin: 0px; display: inline; float: none; padding: 0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c46852fa-1754-49c2-9715-3126bdd93d38" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt;">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #2b91af;">Person</span><br />
{<br />
[<span style="color: #2b91af;">Category</span>(<span style="color: #a31515;">"Information"</span>)]<br />
[<span style="color: #2b91af;">DisplayName</span>(<span style="color: #a31515;">"First Name"</span>)]<br />
[<span style="color: #2b91af;">Description</span>(<span style="color: #a31515;">"This property uses a TextBox as the default editor."</span>)]<br />
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> FirstName { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span>; }</div>
<div>[<span style="color: #2b91af;">Category</span>(<span style="color: #a31515;">"Conections"</span>)]<br />
[<span style="color: #2b91af;">Description</span>(<span style="color: #a31515;">"This property is a complex property and has no default editor."</span>)]<br />
[<span style="color: #2b91af;">ExpandableObject</span>]<br />
<span style="color: #0000ff;">public</span> <span style="color: #2b91af;">Person</span> Spouse { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span>; }<br />
}</div>
</div>
</div>
<h4>Conclusion</h4>
<div>As you can see, I have put a lot of time and effort into this control to make it as feature rich and flexible as possible.  This WPF PropertyGrid is freely available in the Extended WPF Toolkit.  All I ask, is that if you use the <a href="http://wpftoolkit.codeplex.com/" target="_blank">Extended WPF Toolkit</a>, can you please rate the project and leave feedback with your impressions.  It is always nice to receive feedback to know if my efforts are paying off. Enjoy!</div>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2011/10/21/extended-wpf-toolkitthe-updated-propertygrid/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Extended WPF Toolkit&#8211;using the BusyIndicator</title>
		<link>http://elegantcode.com/2011/10/07/extended-wpf-toolkitusing-the-busyindicator/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=extended-wpf-toolkitusing-the-busyindicator</link>
		<comments>http://elegantcode.com/2011/10/07/extended-wpf-toolkitusing-the-busyindicator/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 21:40:03 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[.Net 4.0]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[busy indicator]]></category>
		<category><![CDATA[extended wpf toolkit]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2011/10/07/extended-wpf-toolkitusing-the-busyindicator/</guid>
		<description><![CDATA[As you may know, I am the author of a WPF control suite call the Extended WPF Toolkit.&#160; I also spend tons of time on various forums helping people solve problems with their WPF applications.&#160; Lately there have been a number of questions regarding the BusyIndicator control.&#160; The majority of questions deal with using it [...]]]></description>
			<content:encoded><![CDATA[<p>As you may know, I am the author of a WPF control suite call the <a href="http://wpftoolkit.codeplex.com/" target="_blank">Extended WPF Toolkit</a>.&#160; I also spend tons of time on various forums helping people solve problems with their WPF applications.&#160; Lately there have been a number of questions regarding the <a href="http://wpftoolkit.codeplex.com/wikipage?title=BusyIndicator&amp;referringTitle=Home" target="_blank">BusyIndicator</a> control.&#160; The majority of questions deal with using it in a multi-threaded environment.&#160; So I thought the best way to address the masses is to write up a post demonstrating the proper use of the BusyIndicator control.</p>
<p>Let’s begin by defining what the BusyIndicator is used for.&#160; The BusyIndicator is used to give an application user a visual indicator that a long running process is occurring.&#160; So from this definition we can make two assumptions. One; There must be a mechanism for notifying the BusyIndicator when the long running process begins and when it ends.&#160; Two; the long running process will have to occur on a separate thread as to not block the UI.</p>
<h4>Anatomy of the BusyIndicator</h4>
<p>The first thing you need to do when using any control inside the Extended WPF Toolkit is add a namespace declaration to the consuming view.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5924be3e-3c95-4be6-92ff-c462f833cac5" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Window</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Class</span><span style="color:#0000ff">=&quot;BusyIndicatorDemo.MainWindow&quot;</span><br />        <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">:</span><span style="color:#ff0000">extToolkit</span><span style="color:#0000ff">=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit/extended&quot;</span><br />        <span style="color:#0000ff"> &#8230;</span></div>
</p></div>
</p></div>
<p>The BusyIndicator is a ContentControl.&#160; What this means is that the BusyIndicator can contain a single child element within it’s open and closing tags.&#160; For example:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:596ca3ad-889f-4541-8855-2e7c1ffb4d33" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">extToolkit</span><span style="color:#0000ff">:</span><span style="color:#a31515">BusyIndicator</span><span style="color:#0000ff">&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Button</span><span style="color:#0000ff">&gt;</span><span style="color:#a31515">Start Process</span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Button</span><span style="color:#0000ff">&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br /> <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">extToolkit</span><span style="color:#0000ff">:</span><span style="color:#a31515">BusyIndicator</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>Looking at this code snippet you can see that the Grid is the BusyIndicator’s Content.&#160; If you were to place anything outside of this Grid element you would receive an exception.</p>
<p>The BusyIndicator has two visual states:</p>
<p><strong>Not Busy</strong>:</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/10/image1.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/10/image_thumb1.png" width="244" height="228" /></a></p>
<p><strong>Busy</strong>:</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/10/image2.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/10/image_thumb2.png" width="305" height="240" /></a></p>
<p>Toggling between these states is as simply as setting a single property called IsBusy.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a1b93d14-e297-411d-b217-3bd67de154a6" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">extToolkit</span><span style="color:#0000ff">:</span><span style="color:#a31515">BusyIndicator</span><span style="color:#ff0000"> IsBusy</span><span style="color:#0000ff">=&quot;True&quot; &gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Button</span><span style="color:#0000ff">&gt;</span><span style="color:#a31515">Start Process</span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Button</span><span style="color:#0000ff">&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br /> <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">extToolkit</span><span style="color:#0000ff">:</span><span style="color:#a31515">BusyIndicator</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>When the BusyIndicator.IsBusy property is set to True, the BusyIndicator becomes visible and prevents any user interaction with the BusyIndicator’s Content.&#160; So any elements that you have defined within the Content of the BusyIndicator will be disabled.&#160; When the IsBusy property is set to False, the Content re-enables and user interaction can continue.</p>
<h4>The Common Problem</h4>
<p>The most common problem I see when people are having trouble using the BusyIndicator is that they are doing everything on the UI thread.&#160; Let’s look at an example:</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:050d7667-af12-43ac-bd08-8e7e1fcb6685" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">extToolkit</span><span style="color:#0000ff">:</span><span style="color:#a31515">BusyIndicator</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Name</span><span style="color:#0000ff">=&quot;_busyIndicator&quot; &gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Button</span><span style="color:#ff0000"> Click</span><span style="color:#0000ff">=&quot;StartProcess&quot;&gt;</span><span style="color:#a31515">Start Process</span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Button</span><span style="color:#0000ff">&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br /> <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">extToolkit</span><span style="color:#0000ff">:</span><span style="color:#a31515">BusyIndicator</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
</p>
<p>The event handler for the button looks like this:</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:507b5dfc-48bb-436e-9fe7-003d2f63d756" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> StartProcess(<span style="color:#0000ff">object</span> sender, <span style="color:#2b91af">RoutedEventArgs</span> e)<br /> {<br />     <span style="color:#008000">//show BusyIndicator</span><br />     _busyIndicator.IsBusy = <span style="color:#0000ff">true</span>;<br />     <br />     <span style="color:#008000">//long running process</span><br />     <span style="color:#0000ff">for</span> (<span style="color:#0000ff">int</span> i = 0; i &lt; 100; i++)<br />     {<br />         System.Threading.<span style="color:#2b91af">Thread</span>.Sleep(50);<br />     }</p>
<p>     <span style="color:#008000">//hide BusyIndicator</span><br />     _busyIndicator.IsBusy = <span style="color:#0000ff">false</span>;<br /> }</div>
</p></div>
</p></div>
</p>
<p>Now the assumption is that first the BusyIndicator will be shown, then the long running process will occur, and lastly the BusyIndicator will be hidden.&#160; To most people’s surprise it doesn’t work.&#160; The BusyIndicator never shows and the UI is not responsive.&#160; Do you see the problem?&#160; The problem is that everything is running on the UI thread.</p>
<h4>Solution</h4>
<p>As we have already stated, the long running process must occur on a separate thread.&#160; The UI thread needs to stay responsive while the process is running.&#160; The most common method to place a long running process on a separate thread is to use the <a href="http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui/" target="_blank">BackgroundWorker</a>.</p>
<p>Let’s modify the event handler to utilize a BackgroundWorker.</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2d9f44bc-5752-45ae-9978-3790efb12e11" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> StartProcess(<span style="color:#0000ff">object</span> sender, <span style="color:#2b91af">RoutedEventArgs</span> e)<br /> {<br />     <span style="color:#2b91af">BackgroundWorker</span> worker = <span style="color:#0000ff">new</span> <span style="color:#2b91af">BackgroundWorker</span>();<br />     <span style="color:#008000">//this is where the long running process should go</span><br />     worker.DoWork += (o, ea) =&gt;<br />         {<br />             <span style="color:#008000">//no direct interaction with the UI is allowed from this method</span><br />             <span style="color:#0000ff">for</span> (<span style="color:#0000ff">int</span> i = 0; i &lt; 100; i++)<br />             {<br />                 System.Threading.<span style="color:#2b91af">Thread</span>.Sleep(50);<br />             }<br />         };<br />     worker.RunWorkerCompleted += (o, ea) =&gt;<br />         {<br />             <span style="color:#008000">//work has completed. you can now interact with the UI</span><br />             _busyIndicator.IsBusy = <span style="color:#0000ff">false</span>;<br />         };<br />     <span style="color:#008000">//set the IsBusy before you start the thread</span><br />     _busyIndicator.IsBusy = <span style="color:#0000ff">true</span>;<br />     worker.RunWorkerAsync();<br /> }</div>
</p></div>
</p></div>
</p>
<p>Examine the code.&#160; First we create an instance of a BackgroundWorker and add delegates for the DoWork and RunWorkerCompleted events.&#160; The DoWork hander is where the long running process should go.&#160; NO DIRECT INTERACTION WITH THE UI IS ALLOWED.&#160; The RunWorkerCompleted handler is code that will run when the long running process has completed.&#160; This is where you can interact with the UI again, meaning that this would be a perfect place to set the IsBusy property to False.&#160; After the long running process has finished.&#160; Now pay special attention to where we are calling RunWorkerAsync.&#160; Just before that call, we are setting the IsBusy property to true.&#160; Then the call to RunWorkerAsync is made.&#160; This will show the BusyIndicator and then start the long running process.&#160; When the process is complete the BusyIndicator is hidden again.&#160; Perfect!</p>
<h4>Common Problem 2</h4>
<p>The next common problem is dealing with using data that is generated on the background thread in the UI.&#160; Well if you read my post on <a href="http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui/" target="_blank">multi-threading</a> then you should already know how to solve this one.&#160; If you haven’t, I will show you again.&#160; This scenario requires that our UI have a ListBox control that is populated with items on a background thread.&#160; While the items are being populated, the BusyIndicator should show the user something is happening and that they need to be patient.&#160; Let’s modify our UI and our code behind to support his new scenario:</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:58af4917-346e-44f6-a7ff-44ebb8496123" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">extToolkit</span><span style="color:#0000ff">:</span><span style="color:#a31515">BusyIndicator</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Name</span><span style="color:#0000ff">=&quot;_busyIndicator&quot; &gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Grid.RowDefinitions</span><span style="color:#0000ff">&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">RowDefinition</span><span style="color:#ff0000"> Height</span><span style="color:#0000ff">=&quot;*&quot; /&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">RowDefinition</span><span style="color:#ff0000"> Height</span><span style="color:#0000ff">=&quot;Auto&quot; /&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Grid.RowDefinitions</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">ListBox</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Name</span><span style="color:#0000ff">=&quot;_listBox&quot; /&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Button</span><span style="color:#ff0000"> Grid.Row</span><span style="color:#0000ff">=&quot;1&quot;</span><span style="color:#ff0000"> Click</span><span style="color:#0000ff">=&quot;StartProcess&quot;&gt;</span><span style="color:#a31515">Start Process</span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Button</span><span style="color:#0000ff">&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br /> <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">extToolkit</span><span style="color:#0000ff">:</span><span style="color:#a31515">BusyIndicator</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:72133875-3c6a-4c6e-8851-28028ffb1e1b" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> StartProcess(<span style="color:#0000ff">object</span> sender, <span style="color:#2b91af">RoutedEventArgs</span> e)<br /> {<br />     <span style="color:#2b91af">BackgroundWorker</span> worker = <span style="color:#0000ff">new</span> <span style="color:#2b91af">BackgroundWorker</span>();<br />     worker.DoWork += (o, ea) =&gt;<br />         {<br />             _busyIndicator.IsBusy = <span style="color:#0000ff">true</span>;</p>
<p>             <span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">String</span>&gt; listOfString = <span style="color:#0000ff">new</span> <span style="color:#2b91af">List</span>&lt;<span style="color:#0000ff">string</span>&gt;();<br />             <span style="color:#0000ff">for</span> (<span style="color:#0000ff">int</span> i = 0; i &lt; 100; i++)<br />             {<br />                 listOfString.Add(<span style="color:#2b91af">String</span>.Format(<span style="color:#a31515">&quot;Item: {0}&quot;</span>, i));<br />             }</p>
<p>             <span style="color:#008000">//BAD MOJO</span><br />             _listBox.ItemsSource = listOfString;<br />             _busyIndicator.IsBusy = <span style="color:#0000ff">false</span>;<br />         };            <br />     worker.RunWorkerAsync();<br /> }</div>
</p></div>
</p></div>
</p>
<p>This is similar to what the problem cases look like.&#160; This code will most definitely fail.&#160; Remember, you cannot access any UI elements on a separate thread.&#160; Now let’s modify this code to make it run correctly.</p>
<h4>Solution</h4>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:503b197c-1e59-4aa3-b765-406528412ef6" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 500px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> StartProcess(<span style="color:#0000ff">object</span> sender, <span style="color:#2b91af">RoutedEventArgs</span> e)<br /> {<br />     <span style="color:#2b91af">BackgroundWorker</span> worker = <span style="color:#0000ff">new</span> <span style="color:#2b91af">BackgroundWorker</span>();<br />     worker.DoWork += (o, ea) =&gt;<br />         {<br />             <span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">String</span>&gt; listOfString = <span style="color:#0000ff">new</span> <span style="color:#2b91af">List</span>&lt;<span style="color:#0000ff">string</span>&gt;();<br />             <span style="color:#0000ff">for</span> (<span style="color:#0000ff">int</span> i = 0; i &lt; 10000000; i++)<br />             {<br />                 listOfString.Add(<span style="color:#2b91af">String</span>.Format(<span style="color:#a31515">&quot;Item: {0}&quot;</span>, i));<br />             }</p>
<p>             <span style="color:#008000">//use the Dispatcher to delegate the listOfStrings collection back to the UI</span><br />             Dispatcher.Invoke((<span style="color:#2b91af">Action</span>)(() =&gt; _listBox.ItemsSource = listOfString));<br />         };<br />     worker.RunWorkerCompleted += (o, ea) =&gt;<br />     {<br />         _busyIndicator.IsBusy = <span style="color:#0000ff">false</span>;<br />     };<br />     _busyIndicator.IsBusy = <span style="color:#0000ff">true</span>;<br />     worker.RunWorkerAsync();<br /> }</div>
</p></div>
</p></div>
</p>
<p>First we had to remove any reference to a UI element from the DoWork handler.&#160; Now in order to propagate the generate list of strings back to the ListBox we enlist the help of the <a href="http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx" target="_blank">Dispatcher</a>.&#160; The Dispatcher will take the collection of strings, and in a thread safe way, give them to the ListBox for consumption.&#160; Our BusyIndicator will be shown while the collection is being generated, and then be hidden when the process has been completed.</p>
<p>That about wraps it up.&#160; These are the most common troubles developers have had using the BusyIndicator control.&#160; If you have different problems that you haven’t been able to solve, feel free to post your question in the <a href="http://wpftoolkit.codeplex.com/" target="_blank">Discussions</a> page of the project site.&#160; You never know, it may be worth blogging about.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2011/10/07/extended-wpf-toolkitusing-the-busyindicator/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mapping a Route with Directions using the Bing Maps WPF Control (Beta)</title>
		<link>http://elegantcode.com/2011/09/09/mapping-a-route-with-directions-using-the-bing-maps-wpf-control-beta/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mapping-a-route-with-directions-using-the-bing-maps-wpf-control-beta</link>
		<comments>http://elegantcode.com/2011/09/09/mapping-a-route-with-directions-using-the-bing-maps-wpf-control-beta/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 16:51:29 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[.Net 4.0]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[bing maps]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2011/09/09/mapping-a-route-with-directions-using-the-bing-maps-wpf-control-beta/</guid>
		<description><![CDATA[So far we have built an earthquake application, mapped an address using geocoding, and even Prism-fied the Bing Maps WPF control.&#160; Now let’s see how to map a route with turn-by-turn directions.&#160; By now it should be no surprise that you will need to complete the following steps before you can create this application. Get [...]]]></description>
			<content:encoded><![CDATA[<p>So far we have built an <a href="http://elegantcode.com/2011/08/26/build-an-earthquake-application-with-bing-maps-wpf-control-beta/" target="_blank">earthquake application</a>, <a href="http://elegantcode.com/2011/08/30/mapping-an-address-with-the-bing-maps-wpf-control-beta/" target="_blank">mapped an address</a> using geocoding, and even <a href="http://elegantcode.com/2011/08/31/prism-fy-the-bing-maps-wpf-control-beta/" target="_blank">Prism-fied the Bing Maps WPF control</a>.&#160; Now let’s see how to map a route with turn-by-turn directions.&#160; By now it should be no surprise that you will need to complete the following steps before you can create this application.</p>
<ol>
<li><a href="http://www.microsoft.com/download/en/details.aspx?id=27165">Get the Bing Maps WPF control.</a> </li>
<li><a href="https://www.bingmapsportal.com/">Get a Bing Maps API key.</a> </li>
</ol>
<p>You <strong><u>MUST</u></strong> have a Bing Maps API key in order to use any of the SOAP services. </p>
<p>For this application we will be using the Geocode Service and the Route Service.&#160; The Geocode service is used to match addresses, places, and geographic entities to latitude and longitude coordinates on the map, as well as return location information for a specified latitude and longitude coordinate.&#160; The Route service is used to generate routes and driving directions based on locations or waypoints.</p>
<p>Now that you have that out of the way let’s write an application. Create a new WPF application targeting the .NET 4.0 framework. Add a reference to the <strong>Microsoft.Maps.MapControl.WPF.dll</strong>. This will most likely be located in Program Files or Program Files (x86) –&gt; Bing Maps WPF Control –&gt; Beta –&gt; Libraries. </p>
<p>Open up your App.xaml. You need to add an ApplicationIdCredentialsProvider as a resource and enter your ApplicationId:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ca628505-dd3b-4d33-ae53-ad0ea17f81a9" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Application</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Class</span><span style="color:#0000ff">=&quot;BingMapsCalculateRouteDemo.App&quot;</span><br />             <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span><br />             <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">:</span><span style="color:#ff0000">x</span><span style="color:#0000ff">=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span><br />             <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">:</span><span style="color:#ff0000">bing</span><span style="color:#0000ff">=&quot;clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF&quot;</span><br />             <span style="color:#ff0000"> StartupUri</span><span style="color:#0000ff">=&quot;MainWindow.xaml&quot;&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Application.Resources</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">ApplicationIdCredentialsProvider</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Key</span><span style="color:#0000ff">=&quot;MyCredentials&quot;</span><span style="color:#ff0000"> ApplicationId</span><span style="color:#0000ff">=&quot;Your API Key&quot; /&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Application.Resources</span><span style="color:#0000ff">&gt;</span><br /> <span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Application</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>We need to add the Geocode and Route service to our application.&#160; First, let’s start by adding the Geocode service.&#160; Right click the project and select “Add Service Reference”.&#160; Use the following address:</p>
<p><a href="http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc">http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc</a></p>
<p>Give your service a name. I called mine BingServices.&#160; Now we need to add the Route service, but we don’t want to add a separate service reference.&#160; Ideally we would have a single service that contained both the Geocode and Route services.&#160; Luckily there is a trick we can use to do just that.&#160; Select the Project and click the “Show All Files” button at the top of the Solution Explorer.&#160; Expand the Service Reference folder and then expand the BingServices service.&#160; Look for a file called <strong>Reference.svcmap</strong>. Open the References.svcmap and locate the MetadataSource node.&#160; It will loko something like this:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1e1e98d3-82a4-419a-a32f-707e0559123c" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">&lt;</span><span style="color:#a31515">MetadataSources</span><span style="color:#0000ff">&gt;</span><br />   <span style="color:#0000ff">&lt;</span><span style="color:#a31515">MetadataSource</span><span style="color:#0000ff"> </span><span style="color:#ff0000">Address</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc/mex</span>&quot;<span style="color:#0000ff"> </span><span style="color:#ff0000">Protocol</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">mex</span>&quot;<span style="color:#0000ff"> </span><span style="color:#ff0000">SourceId</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">1</span>&quot;<span style="color:#0000ff"> /&gt;</span><br /> <span style="color:#0000ff">&lt;/</span><span style="color:#a31515">MetadataSources</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>Simply add a new MetatdataSource as follows:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7291104c-336c-4f44-9a3e-5843babcba3d" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">&lt;</span><span style="color:#a31515">MetadataSources</span><span style="color:#0000ff">&gt;</span><br />   <span style="color:#0000ff">&lt;</span><span style="color:#a31515">MetadataSource</span><span style="color:#0000ff"> </span><span style="color:#ff0000">Address</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc/mex</span>&quot;<span style="color:#0000ff"> </span><span style="color:#ff0000">Protocol</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">mex</span>&quot;<span style="color:#0000ff"> </span><span style="color:#ff0000">SourceId</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">1</span>&quot;<span style="color:#0000ff"> /&gt;</span><br />   <span style="color:#0000ff">&lt;</span><span style="color:#a31515">MetadataSource</span><span style="color:#0000ff"> </span><span style="color:#ff0000">Address</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/mex</span>&quot;<span style="color:#0000ff"> </span><span style="color:#ff0000">Protocol</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">mex</span>&quot;<span style="color:#0000ff"> </span><span style="color:#ff0000">SourceId</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">2</span>&quot;<span style="color:#0000ff"> /&gt;</span><br /> <span style="color:#0000ff">&lt;/</span><span style="color:#a31515">MetadataSources</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>As you can see we added a new MetadataSource that points to the Route service and we gave it a SourceId of 2.&#160; Now right click the service and select “Update Service Reference”.&#160; This will generate a single service proxy for both the Geocode and Route services.&#160; Pretty slick huh?</p>
<p>The next step will be to create a ViewModel that will contain an ICommand that will execute the route calculation, properties that will represent a “To” address and a “From” address.&#160; We will also need a property for the RouteResult and for the directions we generate.&#160; Lets first create our Direction object:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0230a924-5d25-4bed-880a-8b8cca1043e9" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">Direction</span><br /> {<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> Description { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }<br />     <span style="color:#0000ff">public</span> <span style="color:#2b91af">Location</span> Location { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }<br /> }</div>
</p></div>
</p></div>
<p>Now we will need a make-shift delegate command (do not use in production code):</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:424be6fd-5bed-4501-ac25-33db908058c2" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">DelegateCommand</span> : <span style="color:#2b91af">ICommand</span><br /> {<br />     <span style="color:#0000ff">private</span> <span style="color:#2b91af">Action</span> _execute;<br />     <span style="color:#0000ff">public</span> DelegateCommand(<span style="color:#2b91af">Action</span> execute)<br />     {<br />         _execute = execute;<br />     }<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">bool</span> CanExecute(<span style="color:#0000ff">object</span> parameter)<br />     {<br />         <span style="color:#0000ff">return</span> <span style="color:#0000ff">true</span>;<br />     }<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">event</span> <span style="color:#2b91af">EventHandler</span> CanExecuteChanged;<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> Execute(<span style="color:#0000ff">object</span> parameter)<br />     {<br />         _execute.Invoke();<br />     }<br /> }</div>
</p></div>
</p></div>
<p>Now on to the ViewModel itself:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d9737cbe-bea9-4b93-af31-534d3ad53cb1" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">RouteViewModel</span>: <span style="color:#2b91af">INotifyPropertyChanged</span><br /> {<br />     <span style="color:#0000ff">public</span> <span style="color:#2b91af">ICommand</span> CalculateRouteCommand { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">private</span> <span style="color:#0000ff">set</span>; }</p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#0000ff">string</span> _from = <span style="color:#a31515">&quot;Meridian, ID&quot;</span>;<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> From<br />     {<br />         <span style="color:#0000ff">get</span> { <span style="color:#0000ff">return</span> _from; }<br />         <span style="color:#0000ff">set</span><br />         {<br />             _from = <span style="color:#0000ff">value</span>;<br />             OnPropertyChanged(<span style="color:#a31515">&quot;From&quot;</span>);<br />         }<br />     }</p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#0000ff">string</span> _to = <span style="color:#a31515">&quot;Boise, ID&quot;</span>;<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> To<br />     {<br />         <span style="color:#0000ff">get</span> { <span style="color:#0000ff">return</span> _to; }<br />         <span style="color:#0000ff">set</span><br />         {<br />             _to = <span style="color:#0000ff">value</span>;<br />             OnPropertyChanged(<span style="color:#a31515">&quot;To&quot;</span>);<br />         }<br />     }</p>
<p>     <span style="color:#0000ff">private</span> BingServices.<span style="color:#2b91af">RouteResult</span> _routeResult;<br />     <span style="color:#0000ff">public</span> BingServices.<span style="color:#2b91af">RouteResult</span> RouteResult<br />     {<br />         <span style="color:#0000ff">get</span> { <span style="color:#0000ff">return</span> _routeResult; }<br />         <span style="color:#0000ff">set</span><br />         {<br />             _routeResult = <span style="color:#0000ff">value</span>;<br />             OnPropertyChanged(<span style="color:#a31515">&quot;RouteResult&quot;</span>);<br />         }<br />     }<br />     </p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#2b91af">ObservableCollection</span>&lt;<span style="color:#2b91af">Direction</span>&gt; _directions;<br />     <span style="color:#0000ff">public</span> <span style="color:#2b91af">ObservableCollection</span>&lt;<span style="color:#2b91af">Direction</span>&gt; Directions<br />     {<br />         <span style="color:#0000ff">get</span> { <span style="color:#0000ff">return</span> _directions; }<br />         <span style="color:#0000ff">set</span><br />         {<br />             _directions = <span style="color:#0000ff">value</span>;<br />             OnPropertyChanged(<span style="color:#a31515">&quot;Directions&quot;</span>);<br />         }<br />     }</p>
<p>     <span style="color:#0000ff">public</span> RouteViewModel()<br />     {<br />         CalculateRouteCommand = <span style="color:#0000ff">new</span> <span style="color:#2b91af">DelegateCommand</span>(CalculateRoute);<br />     }</p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> CalculateRoute()<br />     {<br />         <span style="color:#0000ff">var</span> from = GeocodeAddress(From);<br />         <span style="color:#0000ff">var</span> to = GeocodeAddress(To);</p>
<p>         CalculateRoute(from, to);<br />     }</p>
<p>     <span style="color:#0000ff">private</span> BingServices.<span style="color:#2b91af">GeocodeResult</span> GeocodeAddress(<span style="color:#0000ff">string</span> address)<br />     {<br />         BingServices.<span style="color:#2b91af">GeocodeResult</span> result = <span style="color:#0000ff">null</span>;</p>
<p>         <span style="color:#0000ff">using</span> (BingServices.<span style="color:#2b91af">GeocodeServiceClient</span> client = <span style="color:#0000ff">new</span> BingServices.<span style="color:#2b91af">GeocodeServiceClient</span>(<span style="color:#a31515">&quot;CustomBinding_IGeocodeService&quot;</span>))<br />         {<br />             BingServices.<span style="color:#2b91af">GeocodeRequest</span> request = <span style="color:#0000ff">new</span> BingServices.<span style="color:#2b91af">GeocodeRequest</span>();<br />             request.Credentials = <span style="color:#0000ff">new</span> <span style="color:#2b91af">Credentials</span>() { ApplicationId = (<span style="color:#2b91af">App</span>.Current.Resources[<span style="color:#a31515">&quot;MyCredentials&quot;</span>] <span style="color:#0000ff">as</span> <span style="color:#2b91af">ApplicationIdCredentialsProvider</span>).ApplicationId };<br />             request.Query = address;<br />             result = client.Geocode(request).Results[0];<br />         }</p>
<p>         <span style="color:#0000ff">return</span> result;<br />     }</p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> CalculateRoute(BingServices.<span style="color:#2b91af">GeocodeResult</span> from, BingServices.<span style="color:#2b91af">GeocodeResult</span> to)<br />     {<br />         <span style="color:#0000ff">using</span> (BingServices.<span style="color:#2b91af">RouteServiceClient</span> client = <span style="color:#0000ff">new</span> BingServices.<span style="color:#2b91af">RouteServiceClient</span>(<span style="color:#a31515">&quot;CustomBinding_IRouteService&quot;</span>))<br />         {<br />             BingServices.<span style="color:#2b91af">RouteRequest</span> request = <span style="color:#0000ff">new</span> BingServices.<span style="color:#2b91af">RouteRequest</span>();<br />             request.Credentials = <span style="color:#0000ff">new</span> <span style="color:#2b91af">Credentials</span>() { ApplicationId = (<span style="color:#2b91af">App</span>.Current.Resources[<span style="color:#a31515">&quot;MyCredentials&quot;</span>] <span style="color:#0000ff">as</span> <span style="color:#2b91af">ApplicationIdCredentialsProvider</span>).ApplicationId };<br />             request.Waypoints = <span style="color:#0000ff">new</span> <span style="color:#2b91af">ObservableCollection</span>&lt;BingServices.<span style="color:#2b91af">Waypoint</span>&gt;();<br />             request.Waypoints.Add(ConvertResultToWayPoint(from));<br />             request.Waypoints.Add(ConvertResultToWayPoint(to));</p>
<p>             request.Options = <span style="color:#0000ff">new</span> BingServices.<span style="color:#2b91af">RouteOptions</span>();<br />             request.Options.RoutePathType = BingServices.<span style="color:#2b91af">RoutePathType</span>.Points;</p>
<p>             RouteResult = client.CalculateRoute(request).Result;<br />         }</p>
<p>         GetDirections();<br />     }</p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> GetDirections()<br />     {<br />         Directions = <span style="color:#0000ff">new</span> <span style="color:#2b91af">ObservableCollection</span>&lt;<span style="color:#2b91af">Direction</span>&gt;();</p>
<p>         <span style="color:#0000ff">foreach</span> (BingServices.<span style="color:#2b91af">ItineraryItem</span> item <span style="color:#0000ff">in</span> RouteResult.Legs[0].Itinerary)<br />         {<br />             <span style="color:#0000ff">var</span> direction = <span style="color:#0000ff">new</span> <span style="color:#2b91af">Direction</span>();<br />             direction.Description = GetDirectionText(item);<br />             direction.Location = <span style="color:#0000ff">new</span> <span style="color:#2b91af">Location</span>(item.Location.Latitude, item.Location.Longitude);<br />             Directions.Add(direction);<br />         }<br />     }</p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">string</span> GetDirectionText(BingServices.<span style="color:#2b91af">ItineraryItem</span> item)<br />     {<br />         <span style="color:#0000ff">string</span> contentString = item.Text;<br />         <span style="color:#008000">//Remove tags from the string</span><br />         <span style="color:#2b91af">Regex</span> regex = <span style="color:#0000ff">new</span> <span style="color:#2b91af">Regex</span>(<span style="color:#a31515">&quot;&lt;(.|&#92;n)*?&gt;&quot;</span>);<br />         contentString = regex.Replace(contentString, <span style="color:#0000ff">string</span>.Empty);<br />         <span style="color:#0000ff">return</span> contentString;<br />     }</p>
<p>     <span style="color:#0000ff">private</span> BingServices.<span style="color:#2b91af">Waypoint</span> ConvertResultToWayPoint(BingServices.<span style="color:#2b91af">GeocodeResult</span> result)<br />     {<br />         BingServices.<span style="color:#2b91af">Waypoint</span> waypoint = <span style="color:#0000ff">new</span> BingServices.<span style="color:#2b91af">Waypoint</span>();<br />         waypoint.Description = result.DisplayName;<br />         waypoint.Location = result.Locations[0];<br />         <span style="color:#0000ff">return</span> waypoint;<br />     }</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">event</span> <span style="color:#2b91af">PropertyChangedEventHandler</span> PropertyChanged;<br />     <span style="color:#0000ff">protected</span> <span style="color:#0000ff">virtual</span> <span style="color:#0000ff">void</span> OnPropertyChanged(<span style="color:#0000ff">string</span> propertyName)<br />     {<br />         <span style="color:#0000ff">if</span> (PropertyChanged != <span style="color:#0000ff">null</span>)<br />             PropertyChanged(<span style="color:#0000ff">this</span>, <span style="color:#0000ff">new</span> <span style="color:#2b91af">PropertyChangedEventArgs</span>(propertyName));<br />     }<br /> }</div>
</p></div>
</p></div>
<p>Let’s walk though the CalculateRoute Method.&#160; First we geocode the “From” and “To” properties the same way we did in the <a href="http://elegantcode.com/2011/08/30/mapping-an-address-with-the-bing-maps-wpf-control-beta/" target="_blank">geocoding post</a>.&#160; Once we have our From and To locations we use those results to generate a RouteRequest and send that request to the Route service.&#160; The service will generate a result and we set our RouteResult property accordingly.&#160; This property will be used in data binding shortly.&#160; Next we generate an ObservableCollection&lt;Direction&gt; by looping through all the ItineraryItems in the result.&#160; </p>
<p>Now that we have generate all of our data, we need to create a View that supports and displays this data, but before we do that we need to create some attached properties.&#160; Why do you ask?&#160; Well because as it stands, the Bing Maps WPF control is not data binding friendly.&#160; So we need to enable data binding with the use of attached properties.&#160; We will need an attached property for the Route result which will be responsible for drawing the route line on the map.&#160; We will also need one for the MapLayer that will be used to contain the route line.&#160; Here is the code:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:55925f26-554d-4793-8b07-532984d855c6" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">MapInteractivity</span><br /> {<br />     <span style="color:#0000ff">#region</span> RouteResult</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">readonly</span> <span style="color:#2b91af">DependencyProperty</span> RouteResultProperty = <span style="color:#2b91af">DependencyProperty</span>.RegisterAttached(<span style="color:#a31515">&quot;RouteResult&quot;</span>, <span style="color:#0000ff">typeof</span>(BingServices.<span style="color:#2b91af">RouteResult</span>), <span style="color:#0000ff">typeof</span>(<span style="color:#2b91af">MapInteractivity</span>), <span style="color:#0000ff">new</span> <span style="color:#2b91af">UIPropertyMetadata</span>(<span style="color:#0000ff">null</span>, OnRouteResultChanged));<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> BingServices.<span style="color:#2b91af">RouteResult</span> GetRouteResult(<span style="color:#2b91af">DependencyObject</span> target)<br />     {<br />         <span style="color:#0000ff">return</span> (BingServices.<span style="color:#2b91af">RouteResult</span>)target.GetValue(RouteResultProperty);<br />     }<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> SetRouteResult(<span style="color:#2b91af">DependencyObject</span> target, BingServices.<span style="color:#2b91af">RouteResult</span> value)<br />     {<br />         target.SetValue(RouteResultProperty, value);<br />     }</p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> OnRouteResultChanged(<span style="color:#2b91af">DependencyObject</span> o, <span style="color:#2b91af">DependencyPropertyChangedEventArgs</span> e)<br />     {<br />         OnRouteResultChanged((<span style="color:#2b91af">Map</span>)o, (BingServices.<span style="color:#2b91af">RouteResult</span>)e.OldValue, (BingServices.<span style="color:#2b91af">RouteResult</span>)e.NewValue);<br />     }</p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> OnRouteResultChanged(<span style="color:#2b91af">Map</span> map, BingServices.<span style="color:#2b91af">RouteResult</span> oldValue, BingServices.<span style="color:#2b91af">RouteResult</span> newValue)<br />     {<br />         <span style="color:#2b91af">MapPolyline</span> routeLine = <span style="color:#0000ff">new</span> <span style="color:#2b91af">MapPolyline</span>();<br />         routeLine.Locations = <span style="color:#0000ff">new</span> <span style="color:#2b91af">LocationCollection</span>();<br />         routeLine.Opacity = 0.65;<br />         routeLine.Stroke = <span style="color:#0000ff">new</span> <span style="color:#2b91af">SolidColorBrush</span>(<span style="color:#2b91af">Colors</span>.Blue);<br />         routeLine.StrokeThickness = 5.0;</p>
<p>         <span style="color:#0000ff">foreach</span> (BingServices.<span style="color:#2b91af">Location</span> loc <span style="color:#0000ff">in</span> newValue.RoutePath.Points)<br />         {<br />             routeLine.Locations.Add(<span style="color:#0000ff">new</span> <span style="color:#2b91af">Location</span>(loc.Latitude, loc.Longitude));<br />         }</p>
<p>         <span style="color:#0000ff">var</span> routeLineLayer = GetRouteLineLayer(map);<br />         <span style="color:#0000ff">if</span> (routeLineLayer == <span style="color:#0000ff">null</span>)<br />         {<br />             routeLineLayer = <span style="color:#0000ff">new</span> <span style="color:#2b91af">MapLayer</span>();<br />             SetRouteLineLayer(map, routeLineLayer);<br />         }</p>
<p>         routeLineLayer.Children.Clear();<br />         routeLineLayer.Children.Add(routeLine);</p>
<p>         <span style="color:#008000">//Set the map view</span><br />         <span style="color:#2b91af">LocationRect</span> rect = <span style="color:#0000ff">new</span> <span style="color:#2b91af">LocationRect</span>(routeLine.Locations[0], routeLine.Locations[routeLine.Locations.Count - 1]);<br />         map.SetView(rect);<br />     }</p>
<p>     <span style="color:#0000ff">#endregion</span> <span style="color:#008000">//RouteResult</span></p>
<p>     <span style="color:#0000ff">#region</span> RouteLineLayer</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">readonly</span> <span style="color:#2b91af">DependencyProperty</span> RouteLineLayerProperty = <span style="color:#2b91af">DependencyProperty</span>.RegisterAttached(<span style="color:#a31515">&quot;RouteLineLayer&quot;</span>, <span style="color:#0000ff">typeof</span>(<span style="color:#2b91af">MapLayer</span>), <span style="color:#0000ff">typeof</span>(<span style="color:#2b91af">MapInteractivity</span>), <span style="color:#0000ff">new</span> <span style="color:#2b91af">UIPropertyMetadata</span>(<span style="color:#0000ff">null</span>, OnRouteLineLayerChanged));<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#2b91af">MapLayer</span> GetRouteLineLayer(<span style="color:#2b91af">DependencyObject</span> target)<br />     {<br />         <span style="color:#0000ff">return</span> (<span style="color:#2b91af">MapLayer</span>)target.GetValue(RouteLineLayerProperty);<br />     }<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> SetRouteLineLayer(<span style="color:#2b91af">DependencyObject</span> target, <span style="color:#2b91af">MapLayer</span> value)<br />     {<br />         target.SetValue(RouteLineLayerProperty, value);<br />     }<br />     <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> OnRouteLineLayerChanged(<span style="color:#2b91af">DependencyObject</span> o, <span style="color:#2b91af">DependencyPropertyChangedEventArgs</span> e)<br />     {<br />         OnRouteLineLayerChanged((<span style="color:#2b91af">Map</span>)o, (<span style="color:#2b91af">MapLayer</span>)e.OldValue, (<span style="color:#2b91af">MapLayer</span>)e.NewValue);<br />     }<br />     <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> OnRouteLineLayerChanged(<span style="color:#2b91af">Map</span> map, <span style="color:#2b91af">MapLayer</span> oldValue, <span style="color:#2b91af">MapLayer</span> newValue)<br />     {<br />         <span style="color:#0000ff">if</span> (!map.Children.Contains(newValue))<br />             map.Children.Add(newValue);<br />     }</p>
<p>     <span style="color:#0000ff">#endregion</span> <span style="color:#008000">//RouteLineLayer</span><br /> }</div>
</p></div>
</p></div>
<p>The RouteResult property simply creates a MapPolyline, loops through all the points in the result and adds the locations to the route line.&#160; It then gets the RouteLineLayer and adds it to the map.&#160; Lastly, it sets the map’s view to best fit the route line.</p>
<p>Now we are ready for the View:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:393d6882-6c78-48e8-9046-d517df235427" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Window</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Class</span><span style="color:#0000ff">=&quot;BingMapsCalculateRouteDemo.MainWindow&quot;</span><br />        <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span><br />        <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">:</span><span style="color:#ff0000">x</span><span style="color:#0000ff">=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span><br />        <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">:</span><span style="color:#ff0000">bing</span><span style="color:#0000ff">=&quot;clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF&quot;</span><br />        <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">:</span><span style="color:#ff0000">core</span><span style="color:#0000ff">=&quot;clr-namespace:BingMapsCalculateRouteDemo.Core&quot;</span><br />        <span style="color:#ff0000"> Title</span><span style="color:#0000ff">=&quot;MainWindow&quot;</span><span style="color:#ff0000"> Height</span><span style="color:#0000ff">=&quot;600&quot;</span><span style="color:#ff0000"> Width</span><span style="color:#0000ff">=&quot;800&quot;&gt;</span></p>
<p>     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Window.Resources</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">DataTemplate</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Key</span><span style="color:#0000ff">=&quot;RouteTemplate&quot;&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Ellipse</span><span style="color:#ff0000"> Width</span><span style="color:#0000ff">=&quot;12&quot;</span><span style="color:#ff0000"> Height</span><span style="color:#0000ff">=&quot;12&quot;</span><span style="color:#ff0000"> Fill</span><span style="color:#0000ff">=&quot;Red&quot;</span><span style="color:#ff0000"> Opacity</span><span style="color:#0000ff">=&quot;0.8&quot;</span> <br />                     <span style="color:#ff0000"> bing</span><span style="color:#0000ff">:</span><span style="color:#ff0000">MapLayer.Position</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">Binding</span><span style="color:#ff0000"> Location}</span><span style="color:#0000ff">&quot;</span> <br />                     <span style="color:#ff0000"> bing</span><span style="color:#0000ff">:</span><span style="color:#ff0000">MapLayer.PositionOrigin</span><span style="color:#0000ff">=&quot;Center&quot;</span><br />                     <span style="color:#ff0000"> Tag</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">Binding}</span><span style="color:#0000ff">&quot;</span><br />                     <span style="color:#ff0000"> MouseEnter</span><span style="color:#0000ff">=&quot;Route_MouseEnter&quot;</span> <br />                     <span style="color:#ff0000"> MouseLeave</span><span style="color:#0000ff">=&quot;Route_MouseLeave&quot;/&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">DataTemplate</span><span style="color:#0000ff">&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Window.Resources</span><span style="color:#0000ff">&gt;</span><br />     <span style="color:#a31515"></span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Grid.ColumnDefinitions</span><span style="color:#0000ff">&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">ColumnDefinition</span><span style="color:#ff0000"> Width</span><span style="color:#0000ff">=&quot;Auto&quot; /&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">ColumnDefinition</span><span style="color:#ff0000"> Width</span><span style="color:#0000ff">=&quot;*&quot; /&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Grid.ColumnDefinitions</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">StackPanel</span><span style="color:#ff0000"> MinWidth</span><span style="color:#0000ff">=&quot;150&quot;</span><span style="color:#ff0000"> Margin</span><span style="color:#0000ff">=&quot;10&quot;&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">TextBox</span><span style="color:#ff0000"> Text</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">Binding</span><span style="color:#ff0000"> From}</span><span style="color:#0000ff">&quot; /&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">TextBox</span><span style="color:#ff0000"> Text</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">Binding</span><span style="color:#ff0000"> To}</span><span style="color:#0000ff">&quot;/&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Button</span><span style="color:#ff0000"> Content</span><span style="color:#0000ff">=&quot;Get Route&quot;</span><span style="color:#ff0000"> Command</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">Binding</span><span style="color:#ff0000"> CalculateRouteCommand}</span><span style="color:#0000ff">&quot;/&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">StackPanel</span><span style="color:#0000ff">&gt;</span></p>
<p>         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">Map</span><span style="color:#ff0000"> Grid.Column</span><span style="color:#0000ff">=&quot;1&quot;</span><span style="color:#ff0000"> Mode</span><span style="color:#0000ff">=&quot;AerialWithLabels&quot;</span><span style="color:#ff0000"> HorizontalAlignment</span><span style="color:#0000ff">=&quot;Stretch&quot;</span><span style="color:#ff0000"> VerticalAlignment</span><span style="color:#0000ff">=&quot;Stretch&quot;</span><span style="color:#ff0000"> AnimationLevel</span><span style="color:#0000ff">=&quot;Full&quot;</span><br />                  <span style="color:#ff0000"> core</span><span style="color:#0000ff">:</span><span style="color:#ff0000">MapInteractivity.RouteResult</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">Binding</span><span style="color:#ff0000"> RouteResult}</span><span style="color:#0000ff">&quot;</span><br />                  <span style="color:#ff0000"> core</span><span style="color:#0000ff">:</span><span style="color:#ff0000">MapInteractivity.RouteLineLayer</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">Binding</span><span style="color:#ff0000"> ElementName</span><span style="color:#0000ff">=RouteLineLayer}&quot;</span><br />                  <span style="color:#ff0000"> CredentialsProvider</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">StaticResource</span><span style="color:#ff0000"> MyCredentials}</span><span style="color:#0000ff">&quot; &gt;</span><br />             <span style="color:#a31515"></span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">MapLayer</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Name</span><span style="color:#0000ff">=&quot;RouteLineLayer&quot; /&gt;</span><br />             <span style="color:#a31515"></span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">MapLayer</span><span style="color:#0000ff">&gt;</span><br />                 <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">MapItemsControl</span><span style="color:#ff0000"> ItemsSource</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">Binding</span><span style="color:#ff0000"> Directions}</span><span style="color:#0000ff">&quot;</span><br />                                      <span style="color:#ff0000"> ItemTemplate</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">StaticResource</span><span style="color:#ff0000"> RouteTemplate}</span><span style="color:#0000ff">&quot;/&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">MapLayer</span><span style="color:#0000ff">&gt;</span></p>
<p>             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">MapLayer</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Name</span><span style="color:#0000ff">=&quot;ContentPopupLayer&quot;&gt;</span><br />                 <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Grid</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Name</span><span style="color:#0000ff">=&quot;ContentPopup&quot;</span><span style="color:#ff0000"> Visibility</span><span style="color:#0000ff">=&quot;Collapsed&quot;</span><span style="color:#ff0000"> Background</span><span style="color:#0000ff">=&quot;White&quot;&gt;</span><br />                     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">StackPanel</span><span style="color:#ff0000"> Margin</span><span style="color:#0000ff">=&quot;15&quot;&gt;</span><br />                         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">TextBlock</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Name</span><span style="color:#0000ff">=&quot;ContentPopupText&quot;</span><span style="color:#ff0000"> FontSize</span><span style="color:#0000ff">=&quot;12&quot;</span><span style="color:#ff0000"> FontWeight</span><span style="color:#0000ff">=&quot;Bold&quot;</span><span style="color:#ff0000"> TextWrapping</span><span style="color:#0000ff">=&quot;Wrap&quot; /&gt;</span><br />                     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">StackPanel</span><span style="color:#0000ff">&gt;</span><br />                 <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">MapLayer</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">Map</span><span style="color:#0000ff">&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br /> <span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Window</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>Oh and don’t forget the code behind:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:14f2277a-a347-48e8-afd6-41465898d7fe" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">partial</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">MainWindow</span> : <span style="color:#2b91af">Window</span><br /> {<br />     <span style="color:#0000ff">public</span> MainWindow()<br />     {<br />         InitializeComponent();<br />         DataContext = <span style="color:#0000ff">new</span> <span style="color:#2b91af">RouteViewModel</span>();<br />     }</p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> Route_MouseEnter(<span style="color:#0000ff">object</span> sender, <span style="color:#2b91af">MouseEventArgs</span> e)<br />     {<br />         <span style="color:#2b91af">FrameworkElement</span> pin = sender <span style="color:#0000ff">as</span> <span style="color:#2b91af">FrameworkElement</span>;<br />         <span style="color:#2b91af">MapLayer</span>.SetPosition(ContentPopup, <span style="color:#2b91af">MapLayer</span>.GetPosition(pin));<br />         <span style="color:#2b91af">MapLayer</span>.SetPositionOffset(ContentPopup, <span style="color:#0000ff">new</span> <span style="color:#2b91af">Point</span>(20, -15));</p>
<p>         <span style="color:#0000ff">var</span> location = (<span style="color:#2b91af">Direction</span>)pin.Tag;</p>
<p>         ContentPopupText.Text = location.Description;<br />         ContentPopup.Visibility = <span style="color:#2b91af">Visibility</span>.Visible;<br />     }</p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> Route_MouseLeave(<span style="color:#0000ff">object</span> sender, <span style="color:#2b91af">MouseEventArgs</span> e)<br />     {<br />         ContentPopup.Visibility = <span style="color:#2b91af">Visibility</span>.Collapsed;<br />     }<br /> }</div>
</p></div>
</p></div>
<p>Now let’s view the fruits of our labor at runtime.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/09/image.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/09/image_thumb.png" width="644" height="453" /></a></p>
<p>As you can see, given a “From” and “To” address, we can draw a route line and provide turn-by-turn directions as the user hovers over the direction pins.&#160; Pretty neat huh?&#160; And it wasn’t too difficult to pull off.&#160; As always you can <a href="http://www.brianlagunas.com/downloads/source/BingMapsCalculateRouteDemo.zip">Download the Source</a> and start playing.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2011/09/09/mapping-a-route-with-directions-using-the-bing-maps-wpf-control-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prism-fy the Bing Maps WPF Control (Beta)</title>
		<link>http://elegantcode.com/2011/08/31/prism-fy-the-bing-maps-wpf-control-beta/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=prism-fy-the-bing-maps-wpf-control-beta</link>
		<comments>http://elegantcode.com/2011/08/31/prism-fy-the-bing-maps-wpf-control-beta/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 16:13:02 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[.Net 4.0]]></category>
		<category><![CDATA[Prism]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[bing maps]]></category>
		<category><![CDATA[prism]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2011/08/31/prism-fy-the-bing-maps-wpf-control-beta/</guid>
		<description><![CDATA[If you know me or know of me you are aware that I am a big Prism advocate/evangelist.&#160; You may have also noticed that I have been playing around with the new Bing Maps WPF control.&#160; So it shouldn’t surprise you that I would find a way to compose a Bing Map of loosely coupled [...]]]></description>
			<content:encoded><![CDATA[<p>If you know me or know of me you are aware that I am a big Prism advocate/evangelist.&#160; You may have also noticed that I have been <a href="http://elegantcode.com/2011/08/26/build-an-earthquake-application-with-bing-maps-wpf-control-beta/" target="_blank">playing</a> <a href="http://elegantcode.com/2011/08/30/mapping-an-address-with-the-bing-maps-wpf-control-beta/" target="_blank">around</a> with the new Bing Maps WPF control.&#160; So it shouldn’t surprise you that I would find a way to compose a Bing Map of loosely coupled MapLayers at runtime using Prism.</p>
<p>The concept is simple.&#160; We want a Bing Maps application that can be extended at runtime.&#160; By extended, I mean that I want the ability to add new elements/modules to the Map at runtime.&#160; The important thing about these elements/modules is that they can come from anywhere and they should be loosely coupled from the Map as well as other elements/modules that may exist on the Map.</p>
<p>Luckily for us this is extremely simple to accomplish.&#160; All we have to do is create a custom RegionAdapter, register it with our Prism application, and then apply it to our Bing Map control.&#160; So let’s start with the RegionAdapter.</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e8809704-1b89-4479-9f50-32a29a8ce6e3" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">MapRegionAdapter</span> : <span style="color:#2b91af">RegionAdapterBase</span>&lt;<span style="color:#2b91af">Map</span>&gt;<br /> {<br />     <span style="color:#0000ff">public</span> MapRegionAdapter(<span style="color:#2b91af">IRegionBehaviorFactory</span> regionBehaviorFactory)<br />         : <span style="color:#0000ff">base</span>(regionBehaviorFactory)<br />     {</p>
<p>     }</p>
<p>     <span style="color:#0000ff">protected</span> <span style="color:#0000ff">override</span> <span style="color:#0000ff">void</span> Adapt(<span style="color:#2b91af">IRegion</span> region, <span style="color:#2b91af">Map</span> regionTarget)<br />     {<br />         region.Views.CollectionChanged += (s, e) =&gt;<br />         {<br />             <span style="color:#0000ff">if</span> (e.Action == System.Collections.Specialized.<span style="color:#2b91af">NotifyCollectionChangedAction</span>.Add)<br />             {<br />                 <span style="color:#0000ff">foreach</span> (<span style="color:#2b91af">FrameworkElement</span> element <span style="color:#0000ff">in</span> e.NewItems)<br />                     regionTarget.Children.Add(element);<br />             }<br />             <span style="color:#0000ff">else</span> <span style="color:#0000ff">if</span> (e.Action == System.Collections.Specialized.<span style="color:#2b91af">NotifyCollectionChangedAction</span>.Remove)<br />             {<br />                 <span style="color:#0000ff">foreach</span> (<span style="color:#2b91af">FrameworkElement</span> element <span style="color:#0000ff">in</span> e.OldItems)<br />                     <span style="color:#0000ff">if</span> (regionTarget.Children.Contains(element))<br />                         regionTarget.Children.Remove(element);<br />             }<br />         };<br />     }</p>
<p>     <span style="color:#0000ff">protected</span> <span style="color:#0000ff">override</span> <span style="color:#2b91af">IRegion</span> CreateRegion()<br />     {<br />         <span style="color:#0000ff">return</span> <span style="color:#0000ff">new</span> <span style="color:#2b91af">AllActiveRegion</span>();<br />     }<br /> }</div>
</p></div>
</p></div>
</p>
<p>Now in the Bootstrapper we need to register our mapping.</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fce11974-ec82-4641-ac5c-a37a9ff443df" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">protected</span> <span style="color:#0000ff">override</span> <span style="color:#2b91af">RegionAdapterMappings</span> ConfigureRegionAdapterMappings()<br /> {<br />     <span style="color:#2b91af">RegionAdapterMappings</span> mappings = <span style="color:#0000ff">base</span>.ConfigureRegionAdapterMappings();<br />     mappings.RegisterMapping(<span style="color:#0000ff">typeof</span>(<span style="color:#2b91af">Map</span>), Container.Resolve&lt;<span style="color:#2b91af">MapRegionAdapter</span>&gt;());<br />     <span style="color:#0000ff">return</span> mappings;<br /> }</div>
</p></div>
</p></div>
</p>
<p>Now we simply give the Map a region name. (this is actually all the shell has in it)</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a72303d9-120c-4bba-a39e-18ae1979a63a" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">Map</span><span style="color:#ff0000"> prism</span><span style="color:#0000ff">:</span><span style="color:#ff0000">RegionManager.RegionName</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">x</span><span style="color:#0000ff">:</span><span style="color:#a31515">Static</span><span style="color:#ff0000"> inf</span><span style="color:#0000ff">:</span><span style="color:#ff0000">RegionNames</span><span style="color:#0000ff">.MapRegion}&quot;</span><span style="color:#ff0000"> Center</span><span style="color:#0000ff">=&quot;40,-95&quot;</span><span style="color:#ff0000"> ZoomLevel</span><span style="color:#0000ff">=&quot;4&quot; /&gt;</span><br /> <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
</p>
<p>That is all there is to it.&#160; You can now start injecting modules onto the Map at runtime.&#160; Lets look at my two modules I am using as an example.&#160; Here is the structure of my application:</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/image12.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb13.png" width="305" height="190" /></a></p>
<ul>
<li>ModuleA will inject a MapPolygon in the Shape of Texas.</li>
<li>ModuleB is the Earthquake application we built in an <a href="http://elegantcode.com/2011/08/26/build-an-earthquake-application-with-bing-maps-wpf-control-beta/" target="_blank">earlier post</a>.</li>
<li>Infrastructure is the project where shared code goes, in this case our MapRegionAdapter</li>
<li>BingMapsPrismfiedDemo is of course our shell project.</li>
</ul>
<p>This is what the application looks like at runtime when both modules have been injected into it.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/image13.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb14.png" width="644" height="334" /></a></p>
<p>Now I can easily add more layers to this map as I see fit.&#160; As always, <a href="http://www.brianlagunas.com/downloads/source/BingMapsPrismfiedDemo.zip">Download the Source</a> and start playing.&#160; You may want to add MEF support as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2011/08/31/prism-fy-the-bing-maps-wpf-control-beta/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mapping an Address with the Bing Maps WPF Control (Beta)</title>
		<link>http://elegantcode.com/2011/08/30/mapping-an-address-with-the-bing-maps-wpf-control-beta/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mapping-an-address-with-the-bing-maps-wpf-control-beta</link>
		<comments>http://elegantcode.com/2011/08/30/mapping-an-address-with-the-bing-maps-wpf-control-beta/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 22:21:00 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[.Net 4.0]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[bing maps]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2011/08/30/mapping-an-address-with-the-bing-maps-wpf-control-beta/</guid>
		<description><![CDATA[In my last post I showed you how to get started using the Bing Maps WPF control by creating an earthquake application.&#160; Now I want to introduce you to the Bing Maps SOAP Services.&#160; The Bing Maps SOAP Services is a set of programmable SOAP services that allow you to integrate maps and imagery, driving [...]]]></description>
			<content:encoded><![CDATA[<p>In my last <a href="http://elegantcode.com/2011/08/26/build-an-earthquake-application-with-bing-maps-wpf-control-beta/" target="_blank">post</a> I showed you how to get started using the Bing Maps WPF control by creating an earthquake application.&#160; Now I want to introduce you to the Bing Maps SOAP Services.&#160; The Bing Maps SOAP Services is a set of programmable SOAP services that allow you to integrate maps and imagery, driving directions, distance calculations, and other location intelligence into your applications, business processes, and Web sites. </p>
<p>Let’s start with the Geocode Service which is used to match addresses, places, and geographic entities to latitude and longitude coordinates on the map, as well as return location information for a specified latitude and longitude coordinate.&#160; We will create a simple application that allows you to enter an address and place a pushpin at that location.&#160; First thing is first:</p>
<ol>
<li><a href="http://www.microsoft.com/download/en/details.aspx?id=27165" target="_blank">Get the Bing Maps WPF control.</a> </li>
<li><a href="https://www.bingmapsportal.com/" target="_blank">Get a Bing Maps API key.</a> </li>
</ol>
<p>You <strong><u>MUST</u></strong> have a Bing Maps API key in order to use any of the SOAP services.&#160; Now that you have that out of the way let’s write an application. Create a new WPF application targeting the .NET 4.0 framework. Add a reference to the <strong>Microsoft.Maps.MapControl.WPF.dll</strong>. This will most likely be located in Program Files or Program Files (x86) –&gt; Bing Maps WPF Control –&gt; Beta –&gt; Libraries. </p>
<p>Open up your App.xaml.&#160; You need to add an ApplicationIdCredentialsProvider as a resource and enter your ApplicationId:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1c7fbbfb-a6ac-496d-a298-bddbd655ac65" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Application</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Class</span><span style="color:#0000ff">=&quot;BingMapsGeocodeDemo.App&quot;</span><br />             <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span><br />             <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">:</span><span style="color:#ff0000">x</span><span style="color:#0000ff">=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span><br />             <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">:</span><span style="color:#ff0000">bing</span><span style="color:#0000ff">=&quot;clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF&quot;</span><br />             <span style="color:#ff0000"> StartupUri</span><span style="color:#0000ff">=&quot;MainWindow.xaml&quot;&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Application.Resources</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">ApplicationIdCredentialsProvider</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Key</span><span style="color:#0000ff">=&quot;MyCredentials&quot;</span><span style="color:#ff0000"> ApplicationId</span><span style="color:#0000ff">=&quot;Your API Key&quot; /&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Application.Resources</span><span style="color:#0000ff">&gt;</span><br /> <span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Application</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>Now create a very simple UI that will accept an address and a button to perform the geocoding:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fc9a874e-765b-4bc2-b82b-88a96f1ef84c" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Window</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Class</span><span style="color:#0000ff">=&quot;BingMapsGeocodeDemo.MainWindow&quot;</span><br />        <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span><br />        <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">:</span><span style="color:#ff0000">x</span><span style="color:#0000ff">=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span><br />        <span style="color:#ff0000"> xmlns</span><span style="color:#0000ff">:</span><span style="color:#ff0000">bing</span><span style="color:#0000ff">=&quot;clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF&quot;</span><br />        <span style="color:#ff0000"> Title</span><span style="color:#0000ff">=&quot;MainWindow&quot;</span><span style="color:#ff0000"> Height</span><span style="color:#0000ff">=&quot;600&quot;</span><span style="color:#ff0000"> Width</span><span style="color:#0000ff">=&quot;800&quot;&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Grid.RowDefinitions</span><span style="color:#0000ff">&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">RowDefinition</span><span style="color:#ff0000"> Height</span><span style="color:#0000ff">=&quot;Auto&quot; /&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">RowDefinition</span><span style="color:#ff0000"> Height</span><span style="color:#0000ff">=&quot;*&quot; /&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Grid.RowDefinitions</span><span style="color:#0000ff">&gt;</span></p>
<p>         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">StackPanel</span><span style="color:#ff0000"> Orientation</span><span style="color:#0000ff">=&quot;Horizontal&quot;</span><span style="color:#ff0000"> Margin</span><span style="color:#0000ff">=&quot;10&quot; &gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">TextBox</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Name</span><span style="color:#0000ff">=&quot;_txtAddress&quot;</span><span style="color:#ff0000"> MinWidth</span><span style="color:#0000ff">=&quot;250&quot; /&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Button</span><span style="color:#ff0000"> Content</span><span style="color:#0000ff">=&quot;Map It&quot;</span><span style="color:#ff0000"> IsDefault</span><span style="color:#0000ff">=&quot;True&quot;/&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">StackPanel</span><span style="color:#0000ff">&gt;</span></p>
<p>         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">Map</span><span style="color:#ff0000"> Grid.Row</span><span style="color:#0000ff">=&quot;1&quot;</span><span style="color:#ff0000"> CredentialsProvider</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">StaticResource</span><span style="color:#ff0000"> MyCredentials}</span><span style="color:#0000ff">&quot;</span><span style="color:#ff0000"> Center</span><span style="color:#0000ff">=&quot;40,-95&quot;</span><br />                  <span style="color:#ff0000"> ZoomLevel</span><span style="color:#0000ff">=&quot;4&quot;</span><span style="color:#ff0000"> AnimationLevel</span><span style="color:#0000ff">=&quot;Full&quot; &gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">Map</span><span style="color:#0000ff">&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Grid</span><span style="color:#0000ff">&gt;</span><br /> <span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Window</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>The next thing we need to do is add a new Service Reference to the project and point to the following service:</p>
<p><a title="http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc" href="http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc">http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc</a></p>
<p>Give your service a name (I called mine BingMapsService) and just for fun, in the “Add Service Reference” dialog, click the “Advanced” button and click “Generate asynchronous operations”.</p>
<p>Next we need to create a ViewModel to support our View.&#160; This is a WPF application after all.&#160; This ViewModel will need a command for the button that will perform the geocoding, and a property that will represent the result of the service that the UI will use to map the address.&#160; It should resemble something like this:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7b09cd91-31d1-426f-a539-9fe004a3702a" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">GeocodeViewModel</span> : <span style="color:#2b91af">INotifyPropertyChanged</span><br /> {<br />     <span style="color:#0000ff">public</span> <span style="color:#2b91af">ICommand</span> GeocodeAddressCommand { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">private</span> <span style="color:#0000ff">set</span>; }</p>
<p>     <span style="color:#0000ff">private</span> BingMapsService.<span style="color:#2b91af">GeocodeResult</span> _geocodeResult;<br />     <span style="color:#0000ff">public</span> BingMapsService.<span style="color:#2b91af">GeocodeResult</span> GeocodeResult<br />     {<br />         <span style="color:#0000ff">get</span> { <span style="color:#0000ff">return</span> _geocodeResult; }<br />         <span style="color:#0000ff">set</span><br />         {<br />             _geocodeResult = <span style="color:#0000ff">value</span>;<br />             OnPropertyChanged(<span style="color:#a31515">&quot;GeocodeResult&quot;</span>);<br />         }<br />     }</p>
<p>     <span style="color:#0000ff">public</span> GeocodeViewModel()<br />     {<br />         GeocodeAddressCommand = <span style="color:#0000ff">new</span> <span style="color:#2b91af">DelegateCommand</span>&lt;<span style="color:#2b91af">String</span>&gt;(GeocodeAddress);<br />     }</p>
<p>     <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> GeocodeAddress(<span style="color:#0000ff">string</span> address)<br />     {</p>
<p>     }</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">event</span> <span style="color:#2b91af">PropertyChangedEventHandler</span> PropertyChanged;<br />     <span style="color:#0000ff">protected</span> <span style="color:#0000ff">virtual</span> <span style="color:#0000ff">void</span> OnPropertyChanged(<span style="color:#0000ff">string</span> propertyName)<br />     {<br />         <span style="color:#0000ff">if</span> (PropertyChanged != <span style="color:#0000ff">null</span>)<br />             PropertyChanged(<span style="color:#0000ff">this</span>, <span style="color:#0000ff">new</span> <span style="color:#2b91af">PropertyChangedEventArgs</span>(propertyName));<br />     }<br /> }</div>
</p></div>
</p></div>
<p>I want to point out that the DelegateCommand&lt;T&gt; is a very simple ICommand implementation and should NOT be used in production applications.&#160; Here is the code:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5cac2fd6-5f40-4d30-b70e-39cf0eb39d77" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">DelegateCommand</span>&lt;T&gt; : <span style="color:#2b91af">ICommand</span><br /> {<br />     <span style="color:#0000ff">private</span> <span style="color:#2b91af">Action</span>&lt;T&gt; _execute;</p>
<p>     <span style="color:#0000ff">public</span> DelegateCommand(<span style="color:#2b91af">Action</span>&lt;T&gt; execute)<br />     {<br />         _execute = execute;<br />     }</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">bool</span> CanExecute(<span style="color:#0000ff">object</span> parameter)<br />     {<br />         <span style="color:#0000ff">return</span> <span style="color:#0000ff">true</span>;<br />     }</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">event</span> <span style="color:#2b91af">EventHandler</span> CanExecuteChanged;</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> Execute(<span style="color:#0000ff">object</span> parameter)<br />     {<br />         _execute.Invoke((T)parameter);<br />     }<br /> }</div>
</p></div>
</p></div>
<p>Let’s hook our UI up to our command.&#160; it should look something like this:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7f154da3-e1a9-48e1-8dcd-53063e2268ec" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">&lt;</span><span style="color:#a31515">StackPanel</span><span style="color:#ff0000"> Orientation</span><span style="color:#0000ff">=&quot;Horizontal&quot;</span><span style="color:#ff0000"> Margin</span><span style="color:#0000ff">=&quot;10&quot; &gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">TextBox</span><span style="color:#ff0000"> x</span><span style="color:#0000ff">:</span><span style="color:#ff0000">Name</span><span style="color:#0000ff">=&quot;_txtAddress&quot;</span><span style="color:#ff0000"> MinWidth</span><span style="color:#0000ff">=&quot;250&quot; /&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Button</span><span style="color:#ff0000"> Content</span><span style="color:#0000ff">=&quot;Map It&quot;</span><span style="color:#ff0000"> IsDefault</span><span style="color:#0000ff">=&quot;True&quot;</span> <br />                    <span style="color:#ff0000"> Command</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">Binding</span><span style="color:#ff0000"> GeocodeAddressCommand}</span><span style="color:#0000ff">&quot;</span><br />                    <span style="color:#ff0000"> CommandParameter</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">Binding</span><span style="color:#ff0000"> Text</span><span style="color:#0000ff">,</span><span style="color:#ff0000">ElementName</span><span style="color:#0000ff">=</span>_<span style="color:#0000ff">txtAddress}&quot;/&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">StackPanel</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>Notice that we are using the text of the TextBox as the CommandParameter.&#160; Next, we need to implement the command:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0d2006e3-d7cf-483a-b57b-284d06ecffff" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> GeocodeAddress(<span style="color:#0000ff">string</span> address)<br /> {<br />     <span style="color:#0000ff">using</span> (BingMapsService.<span style="color:#2b91af">GeocodeServiceClient</span> client = <span style="color:#0000ff">new</span> BingMapsService.<span style="color:#2b91af">GeocodeServiceClient</span>(<span style="color:#a31515">&quot;CustomBinding_IGeocodeService&quot;</span>))<br />     {<br />         client.GeocodeCompleted += (o, e) =&gt;<br />         {<br />             <span style="color:#0000ff">if</span> (e.Error == <span style="color:#0000ff">null</span>)<br />             {<br />                 GeocodeResult = e.Result.Results[0];<br />             }<br />         };</p>
<p>         BingMapsService.<span style="color:#2b91af">GeocodeRequest</span> request = <span style="color:#0000ff">new</span> BingMapsService.<span style="color:#2b91af">GeocodeRequest</span>();<br />         request.Credentials = <span style="color:#0000ff">new</span> <span style="color:#2b91af">Credentials</span>() { ApplicationId = (<span style="color:#2b91af">App</span>.Current.Resources[<span style="color:#a31515">&quot;MyCredentials&quot;</span>] <span style="color:#0000ff">as</span> <span style="color:#2b91af">ApplicationIdCredentialsProvider</span>).ApplicationId };<br />         request.Query = address;<br />         client.GeocodeAsync(request);<br />     }<br /> }</div>
</p></div>
</p></div>
<p>In this command we are simply creating an instance of the service client, creating a GeocodeRequest, setting the credentials using the ApplicationId we have stored in the App.xaml, and then using the address as the Query for the request.&#160; When the call to the service is completed we are setting the GeocodeResult property to the first element in the results.</p>
<p>Now the tricky part.&#160; We want to place a Pushpin on the address that was entered and then move the map to that location.&#160; We also need to make sure that when another address is entered, we clear any previous Pushpins that may exist on the map.&#160; We also have to be aware that other elements my be on the map and we don’t want to accidentally alter those elements.&#160; Oh and did I mention this was an MVVM application and this has to be done with just data binding? </p>
<p>The approach that I decided to go with is to use <a href="http://msdn.microsoft.com/en-us/library/ms749011.aspx" target="_blank">Attached Properties</a>.&#160; So I created two attached properties; one for the GeocodeResult and another for a MapLayer that will be dedicated to the GeocodeResult.&#160; This will allow us to create a MapLayer that is specific to our GeocodeResut and not alter any other elements that may be on the map.&#160; Let’s check out the code.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3cc3f4e4-cbae-4ffe-93bf-4a10f2e36d08" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">MapInteractivity</span><br /> {<br />     <span style="color:#0000ff">#region</span> GeocodeResult</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">readonly</span> <span style="color:#2b91af">DependencyProperty</span> GeocodeResultProperty = <span style="color:#2b91af">DependencyProperty</span>.RegisterAttached(<span style="color:#a31515">&quot;GeocodeResult&quot;</span>, <span style="color:#0000ff">typeof</span>(BingMapsService.<span style="color:#2b91af">GeocodeResult</span>), <span style="color:#0000ff">typeof</span>(<span style="color:#2b91af">MapInteractivity</span>), <span style="color:#0000ff">new</span> <span style="color:#2b91af">UIPropertyMetadata</span>(<span style="color:#0000ff">null</span>, OnGeocodeResultChanged));<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> BingMapsService.<span style="color:#2b91af">GeocodeResult</span> GetGeocodeResult(<span style="color:#2b91af">Map</span> target)<br />     {<br />         <span style="color:#0000ff">return</span> (BingMapsService.<span style="color:#2b91af">GeocodeResult</span>)target.GetValue(GeocodeResultProperty);<br />     }<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> SetGeocodeResult(<span style="color:#2b91af">Map</span> target, BingMapsService.<span style="color:#2b91af">GeocodeResult</span> value)<br />     {<br />         target.SetValue(GeocodeResultProperty, value);<br />     }<br />     <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> OnGeocodeResultChanged(<span style="color:#2b91af">DependencyObject</span> o, <span style="color:#2b91af">DependencyPropertyChangedEventArgs</span> e)<br />     {<br />         OnGeocodeResultChanged((<span style="color:#2b91af">Map</span>)o, (BingMapsService.<span style="color:#2b91af">GeocodeResult</span>)e.OldValue, (BingMapsService.<span style="color:#2b91af">GeocodeResult</span>)e.NewValue);<br />     }<br />     <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> OnGeocodeResultChanged(<span style="color:#2b91af">Map</span> map, BingMapsService.<span style="color:#2b91af">GeocodeResult</span> oldValue, BingMapsService.<span style="color:#2b91af">GeocodeResult</span> newValue)<br />     {<br />         <span style="color:#2b91af">Location</span> location = newValue.Locations.Select(x =&gt; <span style="color:#0000ff">new</span> <span style="color:#2b91af">Location</span>(x.Latitude, x.Longitude)).First();</p>
<p>         <span style="color:#2b91af">Pushpin</span> pin = <span style="color:#0000ff">new</span> <span style="color:#2b91af">Pushpin</span>();<br />         pin.Location = location;<br />         pin.ToolTip = newValue.Address.FormattedAddress;</p>
<p>         <span style="color:#0000ff">var</span> locationLayer = GetGeocodeResultLayer(map);<br />         <span style="color:#0000ff">if</span> (locationLayer == <span style="color:#0000ff">null</span>)<br />         {<br />             locationLayer = <span style="color:#0000ff">new</span> <span style="color:#2b91af">MapLayer</span>();<br />             SetGeocodeResultLayer(map, locationLayer);<br />         }</p>
<p>         locationLayer.Children.Clear();<br />         locationLayer.Children.Add(pin);</p>
<p>         map.SetView(location, map.ZoomLevel);<br />     }</p>
<p>     <span style="color:#0000ff">#endregion</span> <span style="color:#008000">//GeocodeResult</span></p>
<p>     <span style="color:#0000ff">#region</span> GeocodeResultLayer</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">readonly</span> <span style="color:#2b91af">DependencyProperty</span> GeocodeResultLayerProperty = <span style="color:#2b91af">DependencyProperty</span>.RegisterAttached(<span style="color:#a31515">&quot;GeocodeResultLayer&quot;</span>, <span style="color:#0000ff">typeof</span>(<span style="color:#2b91af">MapLayer</span>), <span style="color:#0000ff">typeof</span>(<span style="color:#2b91af">MapInteractivity</span>), <span style="color:#0000ff">new</span> <span style="color:#2b91af">UIPropertyMetadata</span>(<span style="color:#0000ff">null</span>, OnGeocodeResultLayerChanged));<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#2b91af">MapLayer</span> GetGeocodeResultLayer(<span style="color:#2b91af">DependencyObject</span> target)<br />     {<br />         <span style="color:#0000ff">return</span> (<span style="color:#2b91af">MapLayer</span>)target.GetValue(GeocodeResultLayerProperty);<br />     }<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> SetGeocodeResultLayer(<span style="color:#2b91af">DependencyObject</span> target, <span style="color:#2b91af">MapLayer</span> value)<br />     {<br />         target.SetValue(GeocodeResultLayerProperty, value);<br />     }<br />     <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> OnGeocodeResultLayerChanged(<span style="color:#2b91af">DependencyObject</span> o, <span style="color:#2b91af">DependencyPropertyChangedEventArgs</span> e)<br />     {<br />         OnGeocodeResultLayerChanged((<span style="color:#2b91af">Map</span>)o, (<span style="color:#2b91af">MapLayer</span>)e.OldValue, (<span style="color:#2b91af">MapLayer</span>)e.NewValue);<br />     }<br />     <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> OnGeocodeResultLayerChanged(<span style="color:#2b91af">Map</span> map, <span style="color:#2b91af">MapLayer</span> oldValue, <span style="color:#2b91af">MapLayer</span> newValue)<br />     {<br />         map.Children.Add(newValue);<br />     }</p>
<p>     <span style="color:#0000ff">#endregion</span> <span style="color:#008000">//GeocodeResultLayer</span><br /> }</div>
</p></div>
</p></div>
<p>Notice that when the GeocodeResult changes we get the Location and create a pushpin for that location.&#160; We also set the tooltip to the FormattedAddress of the GeocodeResult.&#160; So when we hover over the pushpin we will see a nice little tooltip of the address.&#160; Next we try to get the GeocodeResultLayer from the map, if it is null this means it doesn’t exist on the map yet so we create one and assign it accordingly.&#160; We clear the layer child elemnts and then add out pushpin.&#160; The last thing we do is call the SetView method of the Map control passing in the location and the current ZoomLevel.</p>
<p>The final step is to use our AttachedProperty on the map.&#160; Be sure to create a namespace for the MapInteractivity class and define it as follows:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:72d6307a-aef3-4f70-8d47-8d4529fc74e0" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">Map</span><span style="color:#ff0000"> Grid.Row</span><span style="color:#0000ff">=&quot;1&quot;</span><span style="color:#ff0000"> CredentialsProvider</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">StaticResource</span><span style="color:#ff0000"> MyCredentials}</span><span style="color:#0000ff">&quot;</span><span style="color:#ff0000"> Center</span><span style="color:#0000ff">=&quot;40,-95&quot;</span><br />          <span style="color:#ff0000"> core</span><span style="color:#0000ff">:</span><span style="color:#ff0000">MapInteractivity.GeocodeResult</span><span style="color:#0000ff">=&quot;{</span><span style="color:#a31515">Binding</span><span style="color:#ff0000"> GeocodeResult}</span><span style="color:#0000ff">&quot;</span><br />          <span style="color:#ff0000"> ZoomLevel</span><span style="color:#0000ff">=&quot;4&quot;</span><span style="color:#ff0000"> AnimationLevel</span><span style="color:#0000ff">=&quot;Full&quot; &gt;</span><br /> <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">bing</span><span style="color:#0000ff">:</span><span style="color:#a31515">Map</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>One last thing.&#160; Be sure to remember to set your DataContext of your View to the ViewModel we have created:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2f7d0b4f-e096-487d-8343-fb42c94c3360" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> MainWindow()<br /> {<br />     InitializeComponent();<br />     DataContext = <span style="color:#0000ff">new</span> <span style="color:#2b91af">GeocodeViewModel</span>(); <br /> }</div>
</p></div>
</p></div>
<p>That’s it.&#160; You now have an application the can map (geocode) an address using the Bing Maps WPF Control and the Geocoding SOAP Service.&#160; Oh and we are doing this all with MVVM and data binding which is my favorite part.&#160; Be sure to <a href="http://www.brianlagunas.com/downloads/source/bingmapsgeocodedemo.zip">Download the Source</a> and start playing around.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2011/08/30/mapping-an-address-with-the-bing-maps-wpf-control-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Build an Earthquake Application with Bing Maps WPF Control (Beta)</title>
		<link>http://elegantcode.com/2011/08/26/build-an-earthquake-application-with-bing-maps-wpf-control-beta/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=build-an-earthquake-application-with-bing-maps-wpf-control-beta</link>
		<comments>http://elegantcode.com/2011/08/26/build-an-earthquake-application-with-bing-maps-wpf-control-beta/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 21:45:33 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[.Net 4.0]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[bing maps]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2011/08/26/build-an-earthquake-application-with-bing-maps-wpf-control-beta/</guid>
		<description><![CDATA[Recently you may have noticed that the Bing Maps team released a WPF Map control which is currently in Beta.&#160; In light of the recent earth quake on the east coast of the United States, I thought an earthquake application would be a great way to become familiar with the Map control.&#160; There are a [...]]]></description>
			<content:encoded><![CDATA[<p>Recently you may have noticed that the Bing Maps team released a WPF Map control which is currently in Beta.&#160; In light of the recent earth quake on the east coast of the United States, I thought an earthquake application would be a great way to become familiar with the Map control.&#160; There are a few things you must do before we can get started.</p>
<ol>
<li><a href="http://www.microsoft.com/download/en/details.aspx?id=27165" target="_blank">Get the Bing Maps WPF control.</a> </li>
<li><a href="https://www.bingmapsportal.com/" target="_blank">Get a Bing Maps API key.</a> (not needed for development) </li>
</ol>
<p>Now that you have that out of the way let’s write an application.&#160; Create a new WPF application targeting the .NET 4.0 framework.&#160; Add a reference to the <strong>Microsoft.Maps.MapControl.WPF.dll</strong>.&#160; This will most likely be located in Program Files or Program Files (x86) –&gt; Bing Maps WPF Control –&gt; Beta –&gt; Libraries.&#160; Next you need to declare a namespace in XAML:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b0e45db1-178c-47ee-a43c-f96c4ebed32f" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">:</span><span style="color: #ff0000">map</span><span style="color: #0000ff">=&quot;clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF&quot;</span></div>
</p></div>
</p></div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<div id="codeSnippetWrapper">
<div>Now just add the control to your view:</div>
<div>&#160;</div>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cf458cf2-300f-473d-9f65-36ba8e09d15d" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">Grid</span><span style="color: #0000ff">&gt;</span>          <br />&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">Map</span><span style="color: #0000ff"> /&gt;</span>          <br /><span style="color: #a31515"></span><span style="color: #0000ff">&lt;/</span><span style="color: #a31515">Grid</span><span style="color: #0000ff">&gt;</span></div>
</p></div>
</p></div>
<div>&#160;</div>
<p> And this is the control at run time:</p></div>
<div>&#160;</div>
<div><a href="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb11.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image_thumb1" border="0" alt="image_thumb1" src="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb1_thumb.png" width="657" height="460" /></a></div>
<p>Not much to look at, but it’s definitely a map. Notice that because we are not using an API key we get a nice little message that tells us where to get one.&#160; Well this is great and all, but we want to see earth quakes!&#160; So let’s start doing the real coding now. We know we will need an object to hold information about the earthquakes.</p>
<div id="codeSnippetWrapper">
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9d6f095e-dee9-4a74-a0ac-ecf48191c766" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> <span style="color: #2b91af">Earthquake</span>          <br />{          <br />&#160;&#160;&#160; <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Title { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }          <br />&#160;&#160;&#160; <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Description { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }          <br />&#160;&#160;&#160; <span style="color: #0000ff">public</span> <span style="color: #2b91af">Location</span> Location { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }          <br />}</div>
</p></div>
</p></div>
<div></div>
</p></div>
<p>That should take care of that.&#160; Next we need data about earthquakes and their locations.&#160; Luckily for us there is a free resource available to grab this information from <a href="http://earthquake.usgs.gov/" target="_blank">USGS</a>.&#160; So let’s write a simple service to get this information:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ca70e904-51dc-4915-b503-39a7448e3c55" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> <span style="color: #2b91af">EarthquakeService</span>        <br />{        <br />&#160;&#160;&#160; <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> GetRecentEarthquakes(<span style="color: #2b91af">EventHandler</span>&lt;<span style="color: #2b91af">EarthquakeEventArgs</span>&gt; callback)        <br />&#160;&#160;&#160; {        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #2b91af">WebClient</span> client = <span style="color: #0000ff">new</span> <span style="color: #2b91af">WebClient</span>();        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; client.OpenReadCompleted += (o, e) =&gt;        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #2b91af">XDocument</span> doc = <span style="color: #2b91af">XDocument</span>.Load(e.Result);        </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #0000ff">var</span> data = (<span style="color: #0000ff">from</span> eq <span style="color: #0000ff">in</span> doc.Element(<span style="color: #a31515">&quot;rss&quot;</span>).Element(<span style="color: #a31515">&quot;channel&quot;</span>).Elements(<span style="color: #a31515">&quot;item&quot;</span>)        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #0000ff">select</span> <span style="color: #0000ff">new</span> <span style="color: #2b91af">Earthquake</span>()        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Title = eq.Element(<span style="color: #a31515">&quot;title&quot;</span>).Value,        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Description = eq.Element(<span style="color: #a31515">&quot;description&quot;</span>).Value,        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Location = <span style="color: #0000ff">new</span> <span style="color: #2b91af">Location</span>(<span style="color: #2b91af">Convert</span>.ToDouble(eq.Element(<span style="color: #2b91af">XName</span>.Get(<span style="color: #a31515">&quot;lat&quot;</span>, <span style="color: #a31515">&quot;http://www.w3.org/2003/01/geo/wgs84_pos#&quot;</span>)).Value), <span style="color: #2b91af">Convert</span>.ToDouble(eq.Element(<span style="color: #2b91af">XName</span>.Get(<span style="color: #a31515">&quot;long&quot;</span>, <span style="color: #a31515">&quot;http://www.w3.org/2003/01/geo/wgs84_pos#&quot;</span>)).Value))        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }).ToList();        </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; callback(<span style="color: #0000ff">null</span>, <span style="color: #0000ff">new</span> <span style="color: #2b91af">EarthquakeEventArgs</span>(data));        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; };        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; client.OpenReadAsync(<span style="color: #0000ff">new</span> <span style="color: #2b91af">Uri</span>(<span style="color: #a31515">&quot;http://earthquake.usgs.gov/eqcenter/recenteqsww/catalogs/eqs7day-M2.5.xml&quot;</span>));        <br />&#160;&#160;&#160; }        <br />}        </p>
<p><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> <span style="color: #2b91af">EarthquakeEventArgs</span> : <span style="color: #2b91af">EventArgs</span>        <br />{        <br />&#160;&#160;&#160; <span style="color: #0000ff">public</span> <span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">Earthquake</span>&gt; Locations { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }        </p>
<p>&#160;&#160;&#160; <span style="color: #0000ff">public</span> EarthquakeEventArgs(<span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">Earthquake</span>&gt; locations)        <br />&#160;&#160;&#160; {        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Locations = locations;        <br />&#160;&#160;&#160; }        <br />}</div>
</p></div>
</p></div>
<p>The last thing we need is a ViewModel that will expose our earthquakes from consumption by our view:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3f07ad34-5279-4fcc-8938-70c637a61e25" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> <span style="color: #2b91af">EarthquakeViewModel</span> : <span style="color: #2b91af">INotifyPropertyChanged</span>        <br />{        <br />&#160;&#160;&#160; <span style="color: #0000ff">private</span> <span style="color: #2b91af">ObservableCollection</span>&lt;<span style="color: #2b91af">Earthquake</span>&gt; _earthquakes;        <br />&#160;&#160;&#160; <span style="color: #0000ff">public</span> <span style="color: #2b91af">ObservableCollection</span>&lt;<span style="color: #2b91af">Earthquake</span>&gt; Earthquakes        <br />&#160;&#160;&#160; {        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #0000ff">get</span> { <span style="color: #0000ff">return</span> _earthquakes; }        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #0000ff">set</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _earthquakes = <span style="color: #0000ff">value</span>;        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; OnPropertyChanged(<span style="color: #a31515">&quot;Earthquakes&quot;</span>);        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }        <br />&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p>
<p>&#160;&#160;&#160; <span style="color: #0000ff">public</span> EarthquakeViewModel()        <br />&#160;&#160;&#160; {        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #2b91af">EarthquakeService</span>.GetRecentEarthquakes((o, ea) =&gt;        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Earthquakes = <span style="color: #0000ff">new</span> <span style="color: #2b91af">ObservableCollection</span>&lt;<span style="color: #2b91af">Earthquake</span>&gt;(ea.Locations);        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; });        <br />&#160;&#160;&#160; }        </p>
<p>&#160;&#160;&#160; <span style="color: #0000ff">public</span> <span style="color: #0000ff">event</span> <span style="color: #2b91af">PropertyChangedEventHandler</span> PropertyChanged;        <br />&#160;&#160;&#160; <span style="color: #0000ff">protected</span> <span style="color: #0000ff">virtual</span> <span style="color: #0000ff">void</span> OnPropertyChanged(<span style="color: #0000ff">string</span> propertyName)        <br />&#160;&#160;&#160; {        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #0000ff">if</span> (PropertyChanged != <span style="color: #0000ff">null</span>)        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PropertyChanged(<span style="color: #0000ff">this</span>, <span style="color: #0000ff">new</span> <span style="color: #2b91af">PropertyChangedEventArgs</span>(propertyName));        <br />&#160;&#160;&#160; }        <br />}</div>
</p></div>
</p></div>
<p>Don’t forget to set the DataContext of the view to our ViewModel:</p>
<div>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1e71ff2c-77af-4fda-9a2b-14408c9a9421" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #0000ff">public</span> MainWindow()          <br />{          <br />&#160;&#160;&#160; InitializeComponent();          <br />&#160;&#160;&#160; DataContext = <span style="color: #0000ff">new</span> <span style="color: #2b91af">EarthquakeViewModel</span>();          <br />}</div>
</p></div>
</p></div>
</p></div>
<div>&#160;</div>
<div>Now we need to data bind our Earthquakes property to the Map control and to do that we need to use a MapItemsControl:</div>
<div>&#160;</div>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b1d00ae8-d763-48d6-97d7-d6ceeeafb18b" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">Map</span><span style="color: #0000ff">&gt;</span>        <br />&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">MapItemsControl</span><span style="color: #ff0000"> ItemsSource</span><span style="color: #0000ff">=&quot;{</span><span style="color: #a31515">Binding</span><span style="color: #ff0000"> Earthquakes}</span><span style="color: #0000ff">&quot; /&gt;</span>        <br /><span style="color: #a31515"></span><span style="color: #0000ff">&lt;/</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">Map</span><span style="color: #0000ff">&gt;</span></div>
</p></div>
</p></div>
<div id="codeSnippetWrapper">&#160;</div>
<p>Here is what you will see when you run the application:</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb31.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image_thumb3" border="0" alt="image_thumb3" src="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb3_thumb.png" width="533" height="358" /></a></p>
<p>HEY! Where the hell are my earthquakes?&#160; This thing sucks!&#160; Piece of sh….. Oh wait, I need to tell the map how to render the earthquakes.&#160; So we need to create a DataTemplate:</p>
<div id="codeSnippetWrapper">
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e456abe8-55c6-4683-bf3d-d604829d7b23" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">Window.Resources</span><span style="color: #0000ff">&gt;</span>          <br />&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">DataTemplate</span><span style="color: #ff0000"> x</span><span style="color: #0000ff">:</span><span style="color: #ff0000">Key</span><span style="color: #0000ff">=&quot;EarthquakeTemplate&quot;&gt;</span>          <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">Pushpin</span><span style="color: #ff0000"> map</span><span style="color: #0000ff">:</span><span style="color: #ff0000">MapLayer.Position</span><span style="color: #0000ff">=&quot;{</span><span style="color: #a31515">Binding</span><span style="color: #ff0000"> Location}</span><span style="color: #0000ff">&quot; /&gt;</span>          <br />&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;/</span><span style="color: #a31515">DataTemplate</span><span style="color: #0000ff">&gt;</span>          <br /><span style="color: #a31515"></span><span style="color: #0000ff">&lt;/</span><span style="color: #a31515">Window.Resources</span><span style="color: #0000ff">&gt;</span></div>
</p></div>
</p></div>
<div></div>
</p></div>
<p>And don’t forget to specify the ItemTemplate:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a1d85e9f-15f5-4e4e-aa90-005a5b100a3d" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">Map</span><span style="color: #0000ff">&gt;</span>        <br />&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">MapItemsControl</span><span style="color: #ff0000"> ItemsSource</span><span style="color: #0000ff">=&quot;{</span><span style="color: #a31515">Binding</span><span style="color: #ff0000"> Earthquakes}</span><span style="color: #0000ff">&quot;</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ff0000"> ItemTemplate</span><span style="color: #0000ff">=&quot;{</span><span style="color: #a31515">StaticResource</span><span style="color: #ff0000"> EarthquakeTemplate}</span><span style="color: #0000ff">&quot;/&gt;</span>        <br /><span style="color: #a31515"></span><span style="color: #0000ff">&lt;/</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">Map</span><span style="color: #0000ff">&gt;</span></div>
</p></div>
</p></div>
<div>&#160;</div>
<p>Now let’s see what we get when we run the application:</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb51.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image_thumb5" border="0" alt="image_thumb5" src="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb5_thumb.png" width="533" height="358" /></a></p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb71.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image_thumb7" border="0" alt="image_thumb7" src="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb7_thumb.png" width="533" height="358" /></a></p>
<p>Hey look! Earthquakes.&#160; That is so cool. But wait, I want to see information about the earth quake.&#160; Preferably in a popup when I hover over a Pushpin.&#160; Well Lets wire that up real quick.&#160; First we need to add a MapLayer to the map that will act as our popup:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f7532b8a-4e19-4a95-b8f5-ac8ed3e25f96" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">Map</span><span style="color: #0000ff">&gt;</span>        <br />&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">MapItemsControl</span><span style="color: #ff0000"> ItemsSource</span><span style="color: #0000ff">=&quot;{</span><span style="color: #a31515">Binding</span><span style="color: #ff0000"> Earthquakes}</span><span style="color: #0000ff">&quot;</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ff0000"> ItemTemplate</span><span style="color: #0000ff">=&quot;{</span><span style="color: #a31515">StaticResource</span><span style="color: #ff0000"> EarthquakeTemplate}</span><span style="color: #0000ff">&quot;/&gt;</span>        </p>
<p>&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">MapLayer</span><span style="color: #ff0000"> x</span><span style="color: #0000ff">:</span><span style="color: #ff0000">Name</span><span style="color: #0000ff">=&quot;ContentPopupLayer&quot;&gt;</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">Grid</span><span style="color: #ff0000"> x</span><span style="color: #0000ff">:</span><span style="color: #ff0000">Name</span><span style="color: #0000ff">=&quot;ContentPopup&quot;</span><span style="color: #ff0000"> Visibility</span><span style="color: #0000ff">=&quot;Collapsed&quot;</span><span style="color: #ff0000"> Background</span><span style="color: #0000ff">=&quot;White&quot;</span><span style="color: #ff0000"> Opacity</span><span style="color: #0000ff">=&quot;0.85&quot;&gt;</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">StackPanel</span><span style="color: #ff0000"> Margin</span><span style="color: #0000ff">=&quot;15&quot;&gt;</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">TextBlock</span><span style="color: #ff0000"> x</span><span style="color: #0000ff">:</span><span style="color: #ff0000">Name</span><span style="color: #0000ff">=&quot;ContentPopupText&quot;</span> <span style="color: #ff0000">FontSize</span><span style="color: #0000ff">=&quot;12&quot;</span><span style="color: #ff0000"> FontWeight</span><span style="color: #0000ff">=&quot;Bold&quot; &gt;&lt;/</span><span style="color: #a31515">TextBlock</span><span style="color: #0000ff">&gt;</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">TextBlock</span><span style="color: #ff0000"> x</span><span style="color: #0000ff">:</span><span style="color: #ff0000">Name</span><span style="color: #0000ff">=&quot;ContentPopupDescription&quot;</span> <span style="color: #ff0000">FontSize</span><span style="color: #0000ff">=&quot;12&quot;&gt;&lt;/</span><span style="color: #a31515">TextBlock</span><span style="color: #0000ff">&gt;</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;/</span><span style="color: #a31515">StackPanel</span><span style="color: #0000ff">&gt;</span>        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;/</span><span style="color: #a31515">Grid</span><span style="color: #0000ff">&gt;</span>        <br />&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;/</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">MapLayer</span><span style="color: #0000ff">&gt;</span>        <br /><span style="color: #a31515"></span><span style="color: #0000ff">&lt;/</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">Map</span><span style="color: #0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>Now we need to add some event handler to the ItemTemplate.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a09d4b21-e4aa-4e56-ae8c-7109e3c1f3e8" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">DataTemplate</span><span style="color: #ff0000"> x</span><span style="color: #0000ff">:</span><span style="color: #ff0000">Key</span><span style="color: #0000ff">=&quot;EarthquakeTemplate&quot;&gt;</span>        <br />&#160;&#160;&#160; <span style="color: #a31515"></span><span style="color: #0000ff">&lt;</span><span style="color: #a31515">map</span><span style="color: #0000ff">:</span><span style="color: #a31515">Pushpin</span><span style="color: #ff0000"> map</span><span style="color: #0000ff">:</span><span style="color: #ff0000">MapLayer.Position</span><span style="color: #0000ff">=&quot;{</span><span style="color: #a31515">Binding</span><span style="color: #ff0000"> Location}</span><span style="color: #0000ff">&quot;</span><span style="color: #ff0000"> Tag</span><span style="color: #0000ff">=&quot;{</span><span style="color: #a31515">Binding}</span><span style="color: #0000ff">&quot;</span><span style="color: #ff0000"> MouseEnter</span><span style="color: #0000ff">=&quot;Pushpin_MouseEnter&quot;</span><span style="color: #ff0000"> MouseLeave</span><span style="color: #0000ff">=&quot;Pushpin_MouseLeave&quot; /&gt;</span>        <br /><span style="color: #a31515"></span><span style="color: #0000ff">&lt;/</span><span style="color: #a31515">DataTemplate</span><span style="color: #0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>We have added two event handlers; one for when we mouse over and the other for when the mouse is no longer over the pushpin.&#160; Notice that I am storing the bound item in the Tag of the Pushpin object.&#160; We will need that to change the location of popup.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e7ae0e84-6550-4e87-a3cd-690848e1281c" class="wlWriterSmartContent">
<div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid">
<div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; white-space: nowrap; max-height: 300px; overflow: auto; padding-top: 2px"><span style="color: #0000ff">private</span> <span style="color: #0000ff">void</span> Pushpin_MouseEnter(<span style="color: #0000ff">object</span> sender, <span style="color: #2b91af">MouseEventArgs</span> e)        <br />{        <br />&#160;&#160;&#160; <span style="color: #2b91af">FrameworkElement</span> pin = sender <span style="color: #0000ff">as</span> <span style="color: #2b91af">FrameworkElement</span>;        <br />&#160;&#160;&#160; <span style="color: #2b91af">MapLayer</span>.SetPosition(ContentPopup, <span style="color: #2b91af">MapLayer</span>.GetPosition(pin));        <br />&#160;&#160;&#160; <span style="color: #2b91af">MapLayer</span>.SetPositionOffset(ContentPopup, <span style="color: #0000ff">new</span> <span style="color: #2b91af">Point</span>(20, -15));        </p>
<p>&#160;&#160;&#160; <span style="color: #0000ff">var</span> location = (<span style="color: #2b91af">Earthquake</span>)pin.Tag;        </p>
<p>&#160;&#160;&#160; ContentPopupText.Text = location.Title;        <br />&#160;&#160;&#160; ContentPopupDescription.Text = location.Description;        <br />&#160;&#160;&#160; ContentPopup.Visibility = <span style="color: #2b91af">Visibility</span>.Visible;        <br />}        </p>
<p><span style="color: #0000ff">private</span> <span style="color: #0000ff">void</span> Pushpin_MouseLeave(<span style="color: #0000ff">object</span> sender, <span style="color: #2b91af">MouseEventArgs</span> e)        <br />{        <br />&#160;&#160;&#160; ContentPopup.Visibility = <span style="color: #2b91af">Visibility</span>.Collapsed;        <br />}</div>
</p></div>
</p></div>
<div id="codeSnippetWrapper">&#160;</div>
<p>Now when we hover over the Pushpin we get some useful information about the earthquake:</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb91.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image_thumb9" border="0" alt="image_thumb9" src="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb9_thumb.png" width="533" height="358" /></a></p>
<p>That’s it for this application.&#160; The Bing Maps WPF Control has been a long awaited control and I am glad it finally made it to WPF.&#160; As you can see it is pretty easy to use as well.&#160; Now you can <a href="http://brianlagunas.com/downloads/source/BingMapsWPFDemo.zip">Download the source</a> and start playing.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2011/08/26/build-an-earthquake-application-with-bing-maps-wpf-control-beta/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Extended WPF Toolkit Release 1.5.0</title>
		<link>http://elegantcode.com/2011/08/09/extended-wpf-toolkit-release-1-5-0/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=extended-wpf-toolkit-release-1-5-0</link>
		<comments>http://elegantcode.com/2011/08/09/extended-wpf-toolkit-release-1-5-0/#comments</comments>
		<pubDate>Tue, 09 Aug 2011 20:23:59 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[checklistbox]]></category>
		<category><![CDATA[collectioneditor]]></category>
		<category><![CDATA[dropdownbutton]]></category>
		<category><![CDATA[multilinetexteditor]]></category>
		<category><![CDATA[primitivetypecollectioneditor]]></category>
		<category><![CDATA[wizard]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2011/08/09/extended-wpf-toolkit-release-1-5-0/</guid>
		<description><![CDATA[You may have been wondering why I have been so quite lately here on ElegantCode.&#160; Well the reason is because I have been hard at work getting the next version of the Extended WPF Toolkit released.&#160; Now is the time. The Extended WPF Toolkit version 1.5.0 is now officially released.&#160; You can download it form [...]]]></description>
			<content:encoded><![CDATA[<p>You may have been wondering why I have been so quite lately here on ElegantCode.&#160; Well the reason is because I have been hard at work getting the next version of the <a href="http://wpftoolkit.codeplex.com/" target="_blank">Extended WPF Toolkit</a> released.&#160; Now is the time. The Extended WPF Toolkit version 1.5.0 is now officially released.&#160; You can download it form the <a href="http://wpftoolkit.codeplex.com/releases/view/71499" target="_blank">project site</a> or from <a href="http://nuget.org/List/Packages/Extended.Wpf.Toolkit" target="_blank">NuGet</a>.&#160; This version have a few bug fixes, some updates controls, and six new controls. Let take a quick look at the newest controls in the Extended WPF Toolkit family.</p>
<h4><a href="http://wpftoolkit.codeplex.com/wikipage?title=CheckListBox" target="_blank">CheckListBox</a></h4>
<p>The CheckListBox control is a ListBox in which each item is represented with a CheckBox. The CheckBox.IsSelected can be data bound using the CheckedMemberPath property. The CheckListBox also provides a Command property which will execute everytime an item is checked/unchecked. The CommandParameter is the recently checked/unchecked item.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/checklistbox.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="checklistbox" border="0" alt="checklistbox" src="http://elegantcode.com/wp-content/uploads/2011/08/checklistbox_thumb.jpg" width="226" height="224" /></a></p>
<h4><a href="http://wpftoolkit.codeplex.com/wikipage?title=CollectionEditor" target="_blank">CollectionEditor</a></h4>
<p>The CollectionEditor is exactly what it sounds like.&#160; It is a control that is used to edit collections the implement the IList interface.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/collectioneditor.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="collectioneditor" border="0" alt="collectioneditor" src="http://elegantcode.com/wp-content/uploads/2011/08/collectioneditor_thumb.jpg" width="586" height="324" /></a></p>
<h4><a href="http://wpftoolkit.codeplex.com/wikipage?title=CollectionEditorDialog" target="_blank">CollectionEditorDialog</a></h4>
<p>The CollectionEditorDialog is basically the CollectionEditor stuffed inside a Window.&#160; You could have probably done this yourself, but I figured I would save you the trouble.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/collectioneditordialog.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="collectioneditordialog" border="0" alt="collectioneditordialog" src="http://elegantcode.com/wp-content/uploads/2011/08/collectioneditordialog_thumb.jpg" width="603" height="404" /></a></p>
<h4><a href="http://wpftoolkit.codeplex.com/wikipage?title=DropDownButton" target="_blank">DropDownButton</a></h4>
<p>The DropDownButton control is a button that when clicked displays a drop down in which you can place any custom content within. </p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/dropdownbutton.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="dropdownbutton" border="0" alt="dropdownbutton" src="http://elegantcode.com/wp-content/uploads/2011/08/dropdownbutton_thumb.jpg" width="538" height="393" /></a></p>
<h4><a href="http://wpftoolkit.codeplex.com/wikipage?title=MultiLineTextEditor" target="_blank">MultiLineTextEditor</a></h4>
<p>The MultiLineTextEditor is a ComboBox that, when opened, provides a drop down text editor.&#160; This is useful for those scenarios when you want to provide you user with a way to edit a large amount of text, but without the need for a TextBox that is a mile long or mile high.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/multilinetexteditor.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="multilinetexteditor" border="0" alt="multilinetexteditor" src="http://elegantcode.com/wp-content/uploads/2011/08/multilinetexteditor_thumb.jpg" width="578" height="282" /></a></p>
<h4><a href="http://wpftoolkit.codeplex.com/wikipage?title=PrimitiveTypeCollectionEditor" target="_blank">PrimitiveTypeCollectionEditor</a></h4>
<p>The PrimitiveTypeCollectionEditor is a collection editor that is meant for use with a IList of primitive types such as String, Int, Double, etc.&#160; Items are represented by a new line.&#160; The following example is bound to a List&lt;String&gt;.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/primitivetypecollectioneditor.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="primitivetypecollectioneditor" border="0" alt="primitivetypecollectioneditor" src="http://elegantcode.com/wp-content/uploads/2011/08/primitivetypecollectioneditor_thumb.jpg" width="266" height="215" /></a></p>
<h4><a href="http://wpftoolkit.codeplex.com/wikipage?title=Wizard" target="_blank">Wizard</a></h4>
<p>This is another control that is self explanatory.&#160; You simply create various WizardPages to represent you flow.&#160; Each Wizard page has a PageType which specifies if it is a blank page, interior page, or an external page.&#160; The PreviousPage and NextPage properties are for navigation.&#160; If you do not specify a PreviousPage or NextPage, the Wizard will use indexing for navigating between pages.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/image2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb2.png" width="529" height="354" /></a></p>
<p>&#160;</p>
<h4>Sample Application</h4>
<p>There is also a new sample application that will show basic usage of each control.&#160; Over time I will add new and more advance samples. You can always <a href="http://wpftoolkit.codeplex.com/discussions" target="_blank">request</a> a sample to be added.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/image3.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb3.png" width="806" height="487" /></a></p>
<p>You will be able to see the XAML:</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/image4.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb4.png" width="806" height="487" /></a></p>
<p>As well as any C# code:</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/08/image5.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/08/image_thumb5.png" width="806" height="487" /></a></p>
<p>I know the documentation on these controls are lacking but these controls will be documented in more detail in the coming weeks or as soon as I can get to it.</p>
<p>As you can see I have been hard at work trying to make the Extended WPF Toolkit the most functional, feature rich, and FREE open source WPF toolkit available.&#160; Please be sure to submit bugs or request new features in the <a href="http://wpftoolkit.codeplex.com/workitem/list/basic" target="_blank">Issue Tracker</a>, and ask any questions or to get support in the <a href="http://wpftoolkit.codeplex.com/discussions" target="_blank">Discussions</a>.&#160; I would like to thank the community for all the feedback and support you have given this project.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2011/08/09/extended-wpf-toolkit-release-1-5-0/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Extended WPF Toolkit Release 1.4.0</title>
		<link>http://elegantcode.com/2011/04/08/extended-wpf-toolkit-release-1-4-0/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=extended-wpf-toolkit-release-1-4-0</link>
		<comments>http://elegantcode.com/2011/04/08/extended-wpf-toolkit-release-1-4-0/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 13:40:15 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[.Net 4.0]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[extended wpf toolkit]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2011/04/08/extended-wpf-toolkit-release-1-4-0/</guid>
		<description><![CDATA[It’s that time again.&#160; Time for another release of the Extended WPF Toolkit.&#160; I know it’s only been three short months since the last release, but this release is packed with 11 new controls as well as many bug fixes and updated controls.&#160; I have been working hard to provide the WPF community with a [...]]]></description>
			<content:encoded><![CDATA[<p>It’s that time again.&#160; Time for another release of the <a href="http://wpftoolkit.codeplex.com/" target="_blank">Extended WPF Toolkit</a>.&#160; I know it’s only been three short months since the last release, but this release is packed with 11 new controls as well as many bug fixes and updated controls.&#160; I have been working hard to provide the WPF community with a full set of controls to meet the most common control needs.&#160; So let’s look at the newest members of the Extended WPF Toolkit family.</p>
<h3><a href="http://wpftoolkit.codeplex.com/wikipage?title=Calculator&amp;referringTitle=Home" target="_blank">Calculator</a></h3>
<p>The Calculator is a control used for performing mathematical calculations.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/calculator.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="calculator" border="0" alt="calculator" src="http://elegantcode.com/wp-content/uploads/2011/04/calculator_thumb.jpg" width="245" height="270" /></a></p>
<p>It provides basic math functions, memory functions, as well as mouse and keyboard support.</p>
<h3><a href="http://wpftoolkit.codeplex.com/wikipage?title=CalculatorUpDown&amp;referringTitle=Documentation" target="_blank">CalculatorUpDown</a></h3>
<p>The CalculatorUpDown provides a TextBox with button spinners that allow incrementing and decrementing numeric values by using the spinner buttons, keyboard up/down arrows, or mouse wheel. It also provides a Calculator dropdown which allows you to perform mathematical calculations.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/calculatorupdown.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="calculatorupdown" border="0" alt="calculatorupdown" src="http://elegantcode.com/wp-content/uploads/2011/04/calculatorupdown_thumb.jpg" width="198" height="244" /></a></p>
<h3><a href="http://wpftoolkit.codeplex.com/wikipage?title=ColorCanvas&amp;referringTitle=Documentation" target="_blank">ColorCanvas</a></h3>
<p>The ColorCanvas allows you to select a color either using an advanced color canvas, by setting the HexadecimalString, or by setting the ARGB values.&#160; This control has also been merged with the <a href="http://wpftoolkit.codeplex.com/wikipage?title=ColorPicker&amp;referringTitle=Documentation" target="_blank">ColorPicker</a> to provide advanced color editing abilities.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/color_canvas.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="color_canvas" border="0" alt="color_canvas" src="http://elegantcode.com/wp-content/uploads/2011/04/color_canvas_thumb.jpg" width="257" height="275" /></a></p>
<h3><a href="http://wpftoolkit.codeplex.com/wikipage?title=DateTimePicker&amp;referringTitle=Documentation" target="_blank">DateTimePicker</a></h3>
<p>Get the best of both worlds. The DateTimePicker provides a DateTimeUpDown control as well as a dropdown with a calendar and a TimePicker.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/datetimepicker.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="datetimepicker" border="0" alt="datetimepicker" src="http://elegantcode.com/wp-content/uploads/2011/04/datetimepicker_thumb.jpg" width="308" height="263" /></a></p>
<h3><a href="http://wpftoolkit.codeplex.com/wikipage?title=DecimalUpDown&amp;referringTitle=Documentation" target="_blank">DecimalUpDown</a></h3>
<p>The DecimalUpDown control provides a TextBox with button spinners that allow incrementing and decrementing Nullable&lt;Decimal&gt; values by using the spinner buttons, keyboard up/down arrows, or mouse wheel.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/decimalupdown.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="decimalupdown" border="0" alt="decimalupdown" src="http://elegantcode.com/wp-content/uploads/2011/04/decimalupdown_thumb.jpg" width="524" height="226" /></a></p>
<p>When using the DecimalUpDown in data binding scenarios, bind your object&#8217;s value to the <b>Value</b> property. You can specify how much to increment the value by setting the <b>Increment</b> property. You can control the minimum and maximum allowed values by setting the <b>Minimum</b> and the <b>Maximum</b> properties. You can also specify if the user can directly edit the values in the text box by setting the <b>IsEditable</b> property. If you would like to get the actual fromatted string representation of the value, you can use the <b>Text</b> property.</p>
<h3><a href="http://wpftoolkit.codeplex.com/wikipage?title=DoubleUpDown&amp;referringTitle=Documentation" target="_blank">DoubleUpDown</a></h3>
<p>The DoubleUpDown control provides a TextBox with button spinners that allow incrementing and decrementing Nullable&lt;Double&gt; values by using the spinner buttons, keyboard up/down arrows, or mouse wheel.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/decimalupdown1.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="decimalupdown" border="0" alt="decimalupdown" src="http://elegantcode.com/wp-content/uploads/2011/04/decimalupdown_thumb1.jpg" width="524" height="226" /></a></p>
<h3><a href="http://wpftoolkit.codeplex.com/wikipage?title=IntegerUpDown&amp;referringTitle=Documentation" target="_blank">IntegerUpDown</a></h3>
<p>The IntegerUpDown control provides a TextBox with button spinners that allow incrementing and decrementing Nullable&lt;int&gt; values by using the spinner buttons, keyboard up/down arrows, or mouse wheel.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/integerupdown.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="integerupdown" border="0" alt="integerupdown" src="http://elegantcode.com/wp-content/uploads/2011/04/integerupdown_thumb.jpg" width="448" height="236" /></a></p>
<h3><a href="http://wpftoolkit.codeplex.com/wikipage?title=PropertyGrid&amp;referringTitle=Documentation" target="_blank">PropertyGrid</a></h3>
<p>The PropertyGrid is a pure WPF replacement for the WinForm PropertyGrid control.&#160; Currently the PropertyGrid is in beta and still has a lot of work to be done on it.&#160; But it is ready from simple use and testing.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/propertygrid.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="propertygrid" border="0" alt="propertygrid" src="http://elegantcode.com/wp-content/uploads/2011/04/propertygrid_thumb.jpg" width="413" height="762" /></a></p>
<h3><a href="http://wpftoolkit.codeplex.com/wikipage?title=SplitButton&amp;referringTitle=Documentation" target="_blank">SplitButton</a></h3>
<p>The SplitButton control is a button that can be clicked and also provides a drop down in which you can place any custom content within. </p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/splitbutton.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="splitbutton" border="0" alt="splitbutton" src="http://elegantcode.com/wp-content/uploads/2011/04/splitbutton_thumb.jpg" width="496" height="470" /></a></p>
<h3><a href="http://wpftoolkit.codeplex.com/wikipage?title=TimePicker&amp;referringTitle=Documentation" target="_blank">TimePicker</a></h3>
<p>The TimePicker is a control that is specifically for the Time portion of a DateTime property.&#160; It provides a ButtonSpinner as well as a list of times to choose from.&#160; You can also manually type in the time as long as it matches the specified format.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/time_picker.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="time_picker" border="0" alt="time_picker" src="http://elegantcode.com/wp-content/uploads/2011/04/time_picker_thumb.jpg" width="176" height="178" /></a></p>
<h3><a href="http://wpftoolkit.codeplex.com/wikipage?title=WatermarkTextBox&amp;referringTitle=Documentation" target="_blank">WatermarkTextBox</a></h3>
<p>The WatermarkTextBox is simply a TextBox that allows you to sepcify an object, usually a String, to represent null or missing text.&#160; Don’t think you are limited to just text!&#160; With this control you may use any object as a watermark.&#160; Here is an example using an image with text:</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/watermarktextbox_image.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="watermarktextbox_image" border="0" alt="watermarktextbox_image" src="http://elegantcode.com/wp-content/uploads/2011/04/watermarktextbox_image_thumb.jpg" width="230" height="38" /></a></p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/04/watermarktextbox_imagename.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="watermarktextbox_imagename" border="0" alt="watermarktextbox_imagename" src="http://elegantcode.com/wp-content/uploads/2011/04/watermarktextbox_imagename_thumb.jpg" width="229" height="43" /></a></p>
<p>Also, all input controls in the Extended WPF Toolkit now provide a Watermark option.</p>
<p>That’s it for the new controls.&#160; I hope you enjoy version 1.4.0 and be sure to report any bugs or request new features in the <a href="http://wpftoolkit.codeplex.com/workitem/list/basic" target="_blank">Issue Tracker</a>.&#160; As always if you have any questions be sure to ask them in the <a href="http://wpftoolkit.codeplex.com/discussions" target="_blank">Discussions</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2011/04/08/extended-wpf-toolkit-release-1-4-0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WPF: Advanced Jump Lists using a Single Instance Application</title>
		<link>http://elegantcode.com/2011/03/02/wpf-advanced-jump-lists-using-a-single-instance-application/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wpf-advanced-jump-lists-using-a-single-instance-application</link>
		<comments>http://elegantcode.com/2011/03/02/wpf-advanced-jump-lists-using-a-single-instance-application/#comments</comments>
		<pubDate>Wed, 02 Mar 2011 19:10:12 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[win 7 task bar]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2011/03/02/wpf-advanced-jump-lists-using-a-single-instance-application/</guid>
		<description><![CDATA[Back in January I wrote a post on how to add Jump Lists to the Windows 7 Task Bar for your application.&#160; One of the comments for that post was filled with some frustration, because the poster has not been able to find an example of a jump list that was more realistic or geared [...]]]></description>
			<content:encoded><![CDATA[<p>Back in January I wrote a <a href="http://elegantcode.com/2011/01/21/wpf-windows-7-taskbar-part-two-jump-lists/" target="_blank">post</a> on how to add Jump Lists to the Windows 7 Task Bar for your application.&#160; One of the comments for that post was filled with some frustration, because the poster has not been able to find an example of a jump list that was more realistic or geared towards a more advanced implementation.&#160; This post will try to help ease the poster of that comment as well as others seeking the same thing.</p>
<p>This post is intended to get you started in using jump lists in an advanced implementation, and is not meant to be an all inclusive solution for all problems you may run into.&#160; The problem we will solve with this post is how to open another part of an application that is already running based on the jump list item the user clicked.</p>
<p>Outlook for example has a number of tasks that be performed using the jump list:</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/01/image8.png"><img title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/01/image_thumb8.png" width="267" height="254" /></a></p>
<p>The first thing we need to do is ensure that our WPF application is a single instance application.&#160; Meaning that only one instance can run at once.&#160; We want to retain any state that the user may be in and perform any related tasks with the jump list, so we want prevent opening a new instance of the application and work with what is currently running.</p>
<p>There are a couple of ways to create a single instance application.&#160; One involves using Windows Forms classes, but since I don’t want to pollute my WPF application with WinForms I will use an implementation from a Microsoft reference application.</p>
<h4>Single Instance Application</h4>
<p>First thing you need to do is add the <a href="http://elegantcode.com/wp-content/uploads/2011/03/SingleInstance_cs.txt" target="_blank">SingleInstance.cs</a> file to your application.&#160; This class provides all the hard work that is done for you.&#160; </p>
<p>Next you need to add a reference to System.Runtime.Remoting to your project.&#160; </p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/03/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/03/image_thumb.png" width="261" height="359" /></a></p>
<p>Now have your App.xaml.cs class implement ISingleInstanceApp.&#160; There is only one method in this interface called SignalExternalCommandLineArgs that provides an ILIst&lt;string&gt; as a parameter.&#160; It is called when a second instance of your application tries to run.&#160; The args parameter is the command line arguments passed to the second instance.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:708f1fcb-2b32-4531-ba1e-35c5cf555523" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">partial</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">App</span> : <span style="color:#2b91af">Application</span>, <span style="color:#2b91af">ISingleInstanceApp</span><br /> {<br />     <span style="color:#0000ff">#region</span> ISingleInstanceApp Members</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">bool</span> SignalExternalCommandLineArgs(<span style="color:#2b91af">IList</span>&lt;<span style="color:#0000ff">string</span>&gt; args)<br />     {<br />         <span style="color:#0000ff">throw</span> <span style="color:#0000ff">new</span> <span style="color:#2b91af">NotImplementedException</span>();<br />     }</p>
<p>     <span style="color:#0000ff">#endregion</span><br /> }</div>
</p></div>
</p></div>
<p>The next step is to define your own Main function that will use the SingleInstance&lt;TApplication&gt; class and an Init method.&#160; Your application class should look something like this:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:230e933a-2493-4216-945e-f8b84790a2aa" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">partial</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">App</span> : <span style="color:#2b91af">Application</span>, <span style="color:#2b91af">ISingleInstanceApp</span><br /> {<br />     [<span style="color:#2b91af">STAThread</span>]<br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> Main()<br />     {<br />         <span style="color:#0000ff">if</span> (<span style="color:#2b91af">SingleInstance</span>&lt;<span style="color:#2b91af">App</span>&gt;.InitializeAsFirstInstance(<span style="color:#a31515">&quot;AdvancedJumpList&quot;</span>))<br />         {<br />             <span style="color:#0000ff">var</span> application = <span style="color:#0000ff">new</span> <span style="color:#2b91af">App</span>();</p>
<p>             application.Init();<br />             application.Run();</p>
<p>             <span style="color:#008000">// Allow single instance code to perform cleanup operations</span><br />             <span style="color:#2b91af">SingleInstance</span>&lt;<span style="color:#2b91af">App</span>&gt;.Cleanup();<br />         }<br />     }</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> Init()<br />     {<br />         <span style="color:#0000ff">this</span>.InitializeComponent();<br />     }</p>
<p>     <span style="color:#0000ff">#region</span> ISingleInstanceApp Members</p>
<p>     <span style="color:#0000ff">public</span> <span style="color:#0000ff">bool</span> SignalExternalCommandLineArgs(<span style="color:#2b91af">IList</span>&lt;<span style="color:#0000ff">string</span>&gt; args)<br />     {<br />         <span style="color:#008000">//TODO: handle command line arguments</span><br />         <span style="color:#0000ff">return</span> <span style="color:#0000ff">true</span>;<br />     }</p>
<p>     <span style="color:#0000ff">#endregion</span><br /> }</div>
</p></div>
</p></div>
<p>&#160;</p>
<p>Now this next step is <strong>VERY IMPORTANT. </strong>You need to change the Build Action of the App.xaml to Page.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/03/image1.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/03/image_thumb1.png" width="228" height="350" /></a></p>
<p>That’s it for the single instance application.&#160; Now only one instance of you application will run at one time.</p>
<h4>Adding a Jump List </h4>
<p>Now that we know we will only have one instance of our application running, we need to create our jump list.&#160; For this post we will have a simple Hello and Goodbye JumpTask as follows.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5d35e586-715a-4b71-bc82-8fca9b3b0eb5" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> CreateJumpList()<br /> {<br />     <span style="color:#2b91af">JumpList</span> jumpList = <span style="color:#0000ff">new</span> <span style="color:#2b91af">JumpList</span>();<br />     <span style="color:#2b91af">JumpList</span>.SetJumpList(<span style="color:#2b91af">Application</span>.Current, jumpList);</p>
<p>     <span style="color:#2b91af">JumpTask</span> helloTask = <span style="color:#0000ff">new</span> <span style="color:#2b91af">JumpTask</span>();<br />     helloTask.Title = <span style="color:#a31515">&quot;Say Hello&quot;</span>;<br />     helloTask.Description = <span style="color:#a31515">&quot;Shows a Hello World message.&quot;</span>;<br />     helloTask.ApplicationPath = <span style="color:#2b91af">Assembly</span>.GetEntryAssembly().Location;<br />     helloTask.Arguments = <span style="color:#a31515">&quot;/hello&quot;</span>;<br />     jumpList.JumpItems.Add(helloTask);</p>
<p>     <span style="color:#2b91af">JumpTask</span> goodbyeTask = <span style="color:#0000ff">new</span> <span style="color:#2b91af">JumpTask</span>();<br />     goodbyeTask.Title = <span style="color:#a31515">&quot;Say Goodbye&quot;</span>;<br />     goodbyeTask.Description = <span style="color:#a31515">&quot;Shows a goodbye message.&quot;</span>;<br />     goodbyeTask.ApplicationPath = <span style="color:#2b91af">Assembly</span>.GetEntryAssembly().Location;<br />     goodbyeTask.Arguments = <span style="color:#a31515">&quot;/goodbye&quot;</span>;<br />     jumpList.JumpItems.Add(goodbyeTask);</p>
<p>     jumpList.Apply();<br /> }</div>
</p></div>
</p></div>
<p>Notice that we are using reflection to get the location of our application.&#160; We are also passing an string to the Argument property of the JumpTask object.&#160; This is what we will use to know what action to perform.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2011/03/image2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://elegantcode.com/wp-content/uploads/2011/03/image_thumb2.png" width="237" height="188" /></a></p>
<h4>Responding to JumpTasks</h4>
<p>So now we have a single instance application and our JumpList is defined.&#160; Next thing we need to do is respond when a JumpTask is clicked.&#160; To do that we need to do two things.&#160; First we need a method somewhere that will perform the action.&#160; The method will need to return a bool because it will be called from the SignalExternalCommandLineArgs method in the App.xaml.cs.&#160; In this example I will create it on the MainWindow.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3842cfeb-750c-4363-b942-58222b8c8367" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">bool</span> ProcessCommandLineArgs(<span style="color:#2b91af">IList</span>&lt;<span style="color:#0000ff">string</span>&gt; args)<br /> {<br />     <span style="color:#0000ff">if</span> (args == <span style="color:#0000ff">null</span> || args.Count == 0)<br />         <span style="color:#0000ff">return</span> <span style="color:#0000ff">true</span>;</p>
<p>     <span style="color:#0000ff">if</span> ((args.Count &gt; 1))<br />     {<br />         <span style="color:#008000">//the first index always contains the location of the exe so we need to check the second index</span><br />         <span style="color:#0000ff">if</span> ((args[1].ToLowerInvariant() == <span style="color:#a31515">&quot;/hello&quot;</span>))<br />         {<br />             <span style="color:#2b91af">MessageBox</span>.Show(<span style="color:#a31515">&quot;Hello World&quot;</span>);<br />         }<br />         <span style="color:#0000ff">else</span> <span style="color:#0000ff">if</span> ((args[1].ToLowerInvariant() == <span style="color:#a31515">&quot;/goodbye&quot;</span>))<br />         {<br />             <span style="color:#2b91af">MessageBox</span>.Show(<span style="color:#a31515">&quot;Goodbye cruel world&quot;</span>);<br />         }<br />     }</p>
<p>     <span style="color:#0000ff">return</span> <span style="color:#0000ff">true</span>;<br /> }</div>
</p></div>
</p></div>
<p>&#160;</p>
<p>Now this method is going to be called when a second instance is created and the SignalExternalCommandLineArgs method is run:</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a362a327-5bfb-48b9-8425-2b550c57f902" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#0000ff">public</span> <span style="color:#0000ff">bool</span> SignalExternalCommandLineArgs(<span style="color:#2b91af">IList</span>&lt;<span style="color:#0000ff">string</span>&gt; args)<br /> {<br />     <span style="color:#0000ff">return</span> ((<span style="color:#2b91af">MainWindow</span>)MainWindow).ProcessCommandLineArgs(args);<br /> }</div>
</p></div>
</p></div>
</p>
<h4>Conclusion</h4>
<p>As you can see the most complicated part of this whole thing is making sure we have a single instance application.&#160; The rest is pretty easy.&#160; I know this post doesn’t cover every single scenario of using a jump list, but is should give you the start you need to start solving those problems.</p>
<p>Be sure to <a href="http://www.brianlagunas.com/downloads/source/AdvancedJumpList.zip">download the source</a> and start playing around with the code.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2011/03/02/wpf-advanced-jump-lists-using-a-single-instance-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

