<?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; bing maps</title>
	<atom:link href="http://elegantcode.com/tag/bing-maps/feed/" rel="self" type="application/rss+xml" />
	<link>http://elegantcode.com</link>
	<description></description>
	<lastBuildDate>Sun, 12 Feb 2012 04:40: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>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>NETDUG: Silverlight Bing Maps Sample Code</title>
		<link>http://elegantcode.com/2010/07/17/netdug-silverlight-bing-maps-sample-code/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=netdug-silverlight-bing-maps-sample-code</link>
		<comments>http://elegantcode.com/2010/07/17/netdug-silverlight-bing-maps-sample-code/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 00:24:09 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[NETDUG]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[bing maps]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2010/07/17/netdug-silverlight-bing-maps-sample-code/</guid>
		<description><![CDATA[Thanks to everyone who attended last weeks NETDUG presentations. For those of you who would like to get started right away with Bing Maps in your Silverlight applications, you can start here: Get the Bing Maps Silverlight Control Get a Bing Maps API Key Play with the Bing Maps interactive SDK Application Read the Bing [...]]]></description>
			<content:encoded><![CDATA[<p>Thanks to everyone who attended last weeks NETDUG presentations. For those of you who would like to get started right away with Bing Maps in your Silverlight applications, you can start here:</p>
<ul>
<li><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=beb29d27-6f0c-494f-b028-1e0e3187e830" target="_blank">Get the Bing Maps Silverlight Control</a> </li>
<li><a href="https://www.bingmapsportal.com/" target="_blank">Get a Bing Maps API Key</a> </li>
<li><a href="http://www.microsoft.com/maps/isdk/silverlight/default.htm" target="_blank">Play with the Bing Maps interactive SDK Application</a> </li>
<li><a href="http://www.bing.com/community/blogs/maps/" target="_blank">Read the Bing Maps blog</a> </li>
<li><a href="http://social.msdn.microsoft.com/Forums/en-US/vemapcontroldev/threads" target="_blank">Check out the Bing Maps forum</a> </li>
</ul>
<p>You can also get the source code to my presentation here:&#160; <a href="http://brianlagunas.com/downloads/presentations/BingMapsSilverlightSamples.zip">Download the source</a>.</p>
<p><em><strong>Note</strong>: You will need to download the Bing Maps Silverlight control and re-reference the DLLs before the source will compile.&#160; Also, you have to have a Bing Maps API key in order to use any of the geocoding service examples.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2010/07/17/netdug-silverlight-bing-maps-sample-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

