<?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; xaml</title>
	<atom:link href="http://elegantcode.com/tag/xaml/feed/" rel="self" type="application/rss+xml" />
	<link>http://elegantcode.com</link>
	<description></description>
	<lastBuildDate>Fri, 10 Feb 2012 04:38: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>WPF &#8211; dynamically compile and run event handlers within loose XAML using CodeDom</title>
		<link>http://elegantcode.com/2010/12/21/wpf-dynamically-compile-and-run-event-handlers-within-loose-xaml-using-codedom/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wpf-dynamically-compile-and-run-event-handlers-within-loose-xaml-using-codedom</link>
		<comments>http://elegantcode.com/2010/12/21/wpf-dynamically-compile-and-run-event-handlers-within-loose-xaml-using-codedom/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 21:37:00 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[CodeDom]]></category>
		<category><![CDATA[dynamic code]]></category>
		<category><![CDATA[wpd]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2010/12/21/wpf-dynamically-compile-and-run-event-handlers-within-loose-xaml-using-codedom/</guid>
		<description><![CDATA[Last week I wrote a blog post showing how you can write inline code in XAML.&#160; When that blog post was published, @ElegantCode tweeted the post on Twitter.&#160; Rob Relyea soon re-tweeted that post with a link to one of his own posts on exploring new techniques for DLR script in XAML which also links [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I wrote a blog post showing how <a href="http://elegantcode.com/2010/12/14/yes-you-can-write-inline-code-in-xaml/" target="_blank">you can write inline code in XAML</a>.&#160; When that blog post was published, @ElegantCode tweeted the post on Twitter.&#160; Rob Relyea soon <a href="http://twitter.com/#!/rrelyea/status/15099827364827136" target="_blank">re-tweeted</a> that post with a link to one of his own posts on <a href="http://blogs.windowsclient.net/rob_relyea/archive/2009/11/14/exploring-new-techniques-for-dlr-script-in-xaml.aspx" target="_blank">exploring new techniques for DLR script in XAML</a> which also links to another one of his posts which shows different techniques for <a href="http://blogs.windowsclient.net/rob_relyea/archive/2009/06/03/xaml-events-in-compiled-and-uncompiled-scenarios.aspx" target="_blank">hooking up events in compiled and uncompiled scenarios</a> which in turn links to <a href="http://www.thinkbottomup.com.au/site/blog/Embedding_DLR_Scripts_in_XAML_Part_1" target="_blank">this post about embedding DLR scripts in XAML</a> written by Daniel Paull.&#160; Wow, that is a lot of linking.</p>
<p>Well, now that everyone has been given their respective credit, let’s continue.&#160; I wanted to take my last post a little further.&#160; In that post I simply created an event handler for a button click event using inline code in the x:Code directive.&#160; If you started to play with the sample code, you might have thought to yourself, “I wonder if I can load this XAML, event handler and all, from a file or database and have it still work.”.&#160; Well, if you tried it, you found the answer really quick.&#160; No!&#160; The reason is pretty simple; code must be compiled in order to execute.&#160; Therefore any code inside loose XAML will fail.&#160; Also, when using loose XAML, trying to hookup an event handler would crash your application because it is not allowed.</p>
<p>Oh, then it must not be possible? Wrong!&#160; Well, then how do you do it if the code must be compiled?&#160; Simple, we compile the code just before we run it.&#160; Say what?&#160; That’s right, let me introduce you to the <a href="http://msdn.microsoft.com/en-us/library/y2k85ax6.aspx" target="_blank">CodeDom</a>.&#160; The CodeDom allows you to dynamically generate and compile code at runtime.&#160; Let’s get to it.</p>
<p>We need to attach event handlers to elements in loose XAML, and have them execute C# code.&#160; Each element has different events to handle, and each event will execute different code.&#160; This tells me that we need an object that contains two properties, one to specify the RoutedEvent to handle, and another to specify the c# code to execute.&#160; We also need a common event handler definition to execute whenever the RoutedEvent is invoked.</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:2c257533-76d5-4e97-9754-1b389f8f52b5" 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">DynamicEvent</span><br /> {<br />     <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;summary&gt;</span><br />     <span style="color:#808080">///</span><span style="color:#008000"> Gets or sets the routed event to execute.</span><br />     <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;/summary&gt;</span><br />     <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;value&gt;</span><span style="color:#008000">The routed event.</span><span style="color:#808080">&lt;/value&gt;</span><br />     <span style="color:#0000ff">public</span> <span style="color:#2b91af">RoutedEvent</span> RoutedEvent { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }</p>
<p>     <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;summary&gt;</span><br />     <span style="color:#808080">///</span><span style="color:#008000"> Gets or sets the script to run when the RoutedEvent is executed.</span><br />     <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;/summary&gt;</span><br />     <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;value&gt;</span><span style="color:#008000">The script.</span><span style="color:#808080">&lt;/value&gt;</span><br />     <span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> Script { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }</p>
<p>     <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;summary&gt;</span><br />     <span style="color:#808080">///</span><span style="color:#008000"> Called when the RoutedEvent is executed.</span><br />     <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;/summary&gt;</span><br />     <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;param name=&quot;sender&quot;&gt;</span><span style="color:#008000">The sender.</span><span style="color:#808080">&lt;/param&gt;</span><br />     <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;param name=&quot;e&quot;&gt;</span><span style="color:#008000">The </span><span style="color:#808080">&lt;see cref=&quot;System.Windows.RoutedEventArgs&quot;/&gt;</span><span style="color:#008000"> instance containing the event data.</span><span style="color:#808080">&lt;/param&gt;</span><br />     <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> OnEventExecuted(<span style="color:#0000ff">object</span> sender, <span style="color:#2b91af">RoutedEventArgs</span> e)<br />     {<br />         <br />     }<br /> }</div>
</p></div>
</p></div>
<p>That was simple enough.&#160; Now, in order to attach event handlers to elements in loose XAML, we need away to get around the “no event handlers allowed” limitation.&#160; To do this we can use an attached property.</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:51c6021e-2311-4633-85f8-8fcb27a9cb89" 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">static</span> <span style="color:#0000ff">readonly</span> <span style="color:#2b91af">DependencyProperty</span> HandlerProperty = <span style="color:#2b91af">DependencyProperty</span>.RegisterAttached(<span style="color:#a31515">&quot;Handler&quot;</span>, <span style="color:#0000ff">typeof</span>(<span style="color:#2b91af">DynamicEvent</span>), <span style="color:#0000ff">typeof</span>(<span style="color:#2b91af">DynamicEvent</span>), <span style="color:#0000ff">new</span> <span style="color:#2b91af">UIPropertyMetadata</span>(OnHandlerChanged));<br /> <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#2b91af">DynamicEvent</span> GetHandler(<span style="color:#2b91af">DependencyObject</span> obj)<br /> {<br />     <span style="color:#0000ff">return</span> (<span style="color:#2b91af">DynamicEvent</span>)obj.GetValue(HandlerProperty);<br /> }<br /> <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> SetHandler(<span style="color:#2b91af">DependencyObject</span> obj, <span style="color:#0000ff">bool</span> value)<br /> {<br />     obj.SetValue(HandlerProperty, value);<br /> }</p>
<p> <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> OnHandlerChanged(<span style="color:#2b91af">DependencyObject</span> o, <span style="color:#2b91af">DependencyPropertyChangedEventArgs</span> e)<br /> {<br />     <span style="color:#2b91af">UIElement</span> uie = o <span style="color:#0000ff">as</span> <span style="color:#2b91af">UIElement</span>;<br />     <span style="color:#0000ff">if</span> (uie == <span style="color:#0000ff">null</span>)<br />         <span style="color:#0000ff">throw</span> <span style="color:#0000ff">new</span> <span style="color:#2b91af">Exception</span>(<span style="color:#a31515">&quot;Attempt to set EventHandler on non-UIElement Type&quot;</span>);</p>
<p>     <span style="color:#2b91af">DynamicEvent</span> oldHandler = e.OldValue <span style="color:#0000ff">as</span> <span style="color:#2b91af">DynamicEvent</span>;<br />     <span style="color:#2b91af">DynamicEvent</span> newHandler = e.NewValue <span style="color:#0000ff">as</span> <span style="color:#2b91af">DynamicEvent</span>;</p>
<p>     <span style="color:#008000">// unhook the old event</span><br />     <span style="color:#0000ff">if</span> (oldHandler != <span style="color:#0000ff">null</span>)<br />         uie.RemoveHandler(oldHandler.RoutedEvent, <span style="color:#0000ff">new</span> <span style="color:#2b91af">RoutedEventHandler</span>(oldHandler.OnEventExecuted));</p>
<p>     <span style="color:#008000">// hook up the new</span><br />     <span style="color:#0000ff">if</span> (newHandler != <span style="color:#0000ff">null</span>)<br />         uie.AddHandler(newHandler.RoutedEvent, <span style="color:#0000ff">new</span> <span style="color:#2b91af">RoutedEventHandler</span>(newHandler.OnEventExecuted));</p>
<p> }</p></div>
</p></div>
</p></div>
<p>This attached property allows use to attach an instance of our DynamicEvent class to our element.&#160; When the Handler attached property is set, we simple add our OnEventExecute event handler to the RoutedEvent specified in the RoutedEvent property.&#160; Now we have the basic framework needed to attach and event handler to any event on any element in loose XAML.&#160; Let’s see how to attach an event handler in XAML using this newly created DynamicEvent class.</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:c323adca-e880-4dd4-997e-958bccc70c3d" 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">Button</span><span style="color:#ff0000"> Height</span><span style="color:#0000ff">=&quot;24&quot;</span><span style="color:#ff0000"> Content</span><span style="color:#0000ff">=&quot;Initial Text&quot;&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">local</span><span style="color:#0000ff">:</span><span style="color:#a31515">DynamicEvent.Handler</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">local</span><span style="color:#0000ff">:</span><span style="color:#a31515">DynamicEvent</span><span style="color:#ff0000"> RoutedEvent</span><span style="color:#0000ff">=&quot;Button.Click&quot;&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">local</span><span style="color:#0000ff">:</span><span style="color:#a31515">DynamicEvent.Script</span><span style="color:#0000ff">&gt;</span><br />                 <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">sys</span><span style="color:#0000ff">:</span><span style="color:#a31515">String</span><span style="color:#ff0000"> xml</span><span style="color:#0000ff">:</span><span style="color:#ff0000">space</span><span style="color:#0000ff">=&quot;preserve&quot;&gt;</span><br />                         <span style="color:#a31515"></span><span style="color:#808080">&lt;![CDATA[            </span><br />                         <span style="color:#808080">var button = sender as Button;</span><br />                         <span style="color:#808080">button.Content = &quot;Changed with Dynamic Code&quot;;</span><br />                         <span style="color:#808080">]]&gt;</span><br />                     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">sys</span><span style="color:#0000ff">:</span><span style="color:#a31515">String</span><span style="color:#0000ff">&gt;</span><br />             <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">local</span><span style="color:#0000ff">:</span><span style="color:#a31515">DynamicEvent.Script</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">local</span><span style="color:#0000ff">:</span><span style="color:#a31515">DynamicEvent</span><span style="color:#0000ff">&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">local</span><span style="color:#0000ff">:</span><span style="color:#a31515">DynamicEvent.Handler</span><span style="color:#0000ff">&gt;</span><br /> <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">Button</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>As you can see I have added a handler for a Button’s Click event.&#160; I also provided a Script to execute when the event is invoked.&#160; Notice that we are preserving the whitespace in the script.&#160; Of course nothing will happen just yet.&#160; Now we need to take the script and compile it at run time.&#160; This is where the CodeDom comes in.</p>
<p>The steps necessary to compile code at run time go a little something like this:</p>
<ul>
<li>Create a CodeCompileUnit </li>
<li>Add our namespace and import statements </li>
<li>create our dynamic class </li>
<li>add a method that will execute the Script </li>
<li>compile the code </li>
<li>execute the code </li>
</ul>
<p>All these steps must be performed when the ROutedEvent is invoked, which means the code must be compiled inside the OnEventExecuted event handler.</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:56b1a794-ec6b-4976-9f18-e819f5a52641" 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> OnEventExecuted(<span style="color:#0000ff">object</span> sender, <span style="color:#2b91af">RoutedEventArgs</span> e)<br /> {<br />     <span style="color:#2b91af">CodeCompileUnit</span> compileUnit = <span style="color:#0000ff">new</span> <span style="color:#2b91af">CodeCompileUnit</span>();</p>
<p>     <span style="color:#008000">//create our namesapce and import statements, then add it to the compile unit</span><br />     <span style="color:#2b91af">CodeNamespace</span> namespaces = CreateNamespaceAndImports();<br />     compileUnit.Namespaces.Add(namespaces);</p>
<p>     <span style="color:#008000">//create our target class and add it to the namespace</span><br />     <span style="color:#2b91af">CodeTypeDeclaration</span> targetClass = CreateTargetClass();<br />     namespaces.Types.Add(targetClass);</p>
<p>     <span style="color:#008000">//create the ExecuteScript method and then add it to our class</span><br />     <span style="color:#2b91af">CodeMemberMethod</span> executeEventMethod = CreateExecuteScriptMethod();<br />     targetClass.Members.Add(executeEventMethod);</p>
<p>     <span style="color:#008000">//create our compiler parameters</span><br />     <span style="color:#2b91af">CompilerParameters</span> compilerParams = CreateCompilerParameters();</p>
<p>     <span style="color:#008000">//compile the assembly</span><br />     <span style="color:#0000ff">var</span> results = CompileAssembly(compileUnit, compilerParams);</p>
<p>     <span style="color:#008000">//execute the code</span><br />     ExecuteCode(results, sender, e);<br /> }</div>
</p></div>
</p></div>
<p>The first step is really easy.&#160; We simply need to create an instance of the CodeCompileUnit class.&#160; The CodeCompileUnit references the CodeDom object graph and has properties for storing attributes, namespaces, and assemblies.&#160; Next we need to create our namespace and import statements.</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:6b89b170-e94b-4b3b-a8d8-8df82193e6d3" 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:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;summary&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> Creates the namespace and imports.</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;/summary&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;remarks&gt;</span><span style="color:#008000">I have only added three import statements as an example. You should add all import statements required to run your dynamic code</span><span style="color:#808080">&lt;/remarks&gt;</span><br /> <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#2b91af">CodeNamespace</span> CreateNamespaceAndImports()<br /> {<br />     <span style="color:#2b91af">CodeNamespace</span> namespaces = <span style="color:#0000ff">new</span> <span style="color:#2b91af">CodeNamespace</span>(<span style="color:#a31515">&quot;WPFCodeInjection&quot;</span>);<br />     namespaces.Imports.Add(<span style="color:#0000ff">new</span> <span style="color:#2b91af">CodeNamespaceImport</span>(<span style="color:#a31515">&quot;System&quot;</span>));<br />     namespaces.Imports.Add(<span style="color:#0000ff">new</span> <span style="color:#2b91af">CodeNamespaceImport</span>(<span style="color:#a31515">&quot;System.Windows&quot;</span>));<br />     namespaces.Imports.Add(<span style="color:#0000ff">new</span> <span style="color:#2b91af">CodeNamespaceImport</span>(<span style="color:#a31515">&quot;System.Windows.Controls&quot;</span>));<br />     <span style="color:#0000ff">return</span> namespaces;<br /> }</div>
</p></div>
</p></div>
<p>Once the namespace and import statement are created we need to add them to out CodeCompileUnit instance.&#160; Then we need to create our dynamic class.&#160; We need to make sure it is a public class:</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:a495da08-da32-46e0-ba99-c5fac5d189e1" 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:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;summary&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> Creates the target class.</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;/summary&gt;</span><br /> <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#2b91af">CodeTypeDeclaration</span> CreateTargetClass()<br /> {<br />     <span style="color:#2b91af">CodeTypeDeclaration</span> targetClass = <span style="color:#0000ff">new</span> <span style="color:#2b91af">CodeTypeDeclaration</span>(<span style="color:#a31515">&quot;DynamicClass&quot;</span>);<br />     targetClass.TypeAttributes = <span style="color:#2b91af">TypeAttributes</span>.Public;<br />     <span style="color:#0000ff">return</span> targetClass;<br /> }</div>
</p></div>
</p></div>
<p>When the dynamic class is created we add it to our namespace.&#160; Now we create a method. We give it a name of ExecuteScript and set its access modifier to public.&#160; We specify that it accepts two parameters.&#160; One being the sender which is of type object, and one that is the event args that is of type RoutedEventArgs.&#160; Lastly, we set the body of the method to the Script property.</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:4cae0858-7130-4df1-b3b1-cf49063a4d50" 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:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;summary&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> Creates the ExecuteScript method.</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;/summary&gt;</span><br /> <span style="color:#0000ff">private</span> <span style="color:#2b91af">CodeMemberMethod</span> CreateExecuteScriptMethod()<br /> {<br />     <span style="color:#2b91af">CodeMemberMethod</span> executeEventMethod = <span style="color:#0000ff">new</span> <span style="color:#2b91af">CodeMemberMethod</span>();<br />     executeEventMethod.Name = <span style="color:#a31515">&quot;ExecuteScript&quot;</span>;<br />     executeEventMethod.Attributes = <span style="color:#2b91af">MemberAttributes</span>.Public | <span style="color:#2b91af">MemberAttributes</span>.Final;<br />     executeEventMethod.Parameters.Add(<span style="color:#0000ff">new</span> <span style="color:#2b91af">CodeParameterDeclarationExpression</span>(<span style="color:#a31515">&quot;System.Object&quot;</span>, <span style="color:#a31515">&quot;sender&quot;</span>));<br />     executeEventMethod.Parameters.Add(<span style="color:#0000ff">new</span> <span style="color:#2b91af">CodeParameterDeclarationExpression</span>(<span style="color:#a31515">&quot;System.Windows.RoutedEventArgs&quot;</span>, <span style="color:#a31515">&quot;e&quot;</span>));<br />     executeEventMethod.Statements.Add(<span style="color:#0000ff">new</span> <span style="color:#2b91af">CodeSnippetStatement</span>(Script));<br />     <span style="color:#0000ff">return</span> executeEventMethod;<br /> }</div>
</p></div>
</p></div>
<p>Now we have to create our compiler parameters.&#160; These include adding referencing to the necessary Dlls required to run your code.&#160; We also want to specify that we want to generate the code in memory.&#160; If you wanted to you could save the assembly to a file.</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:cebbac90-1864-436d-8248-de681876fa83" 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:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;summary&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> Creates the compiler parameters.</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;/summary&gt;</span><br /> <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#2b91af">CompilerParameters</span> CreateCompilerParameters()<br /> {<br />     <span style="color:#008000">//add compiler parameters and assembly references</span><br />     <span style="color:#2b91af">CompilerParameters</span> compilerParams = <span style="color:#0000ff">new</span> <span style="color:#2b91af">CompilerParameters</span>();<br />     compilerParams.CompilerOptions = <span style="color:#a31515">&quot;/target:library /optimize&quot;</span>;<br />     compilerParams.GenerateExecutable = <span style="color:#0000ff">false</span>;<br />     compilerParams.GenerateInMemory = <span style="color:#0000ff">true</span>;</p>
<p>     <span style="color:#008000">//you can add references individually if you want by providing the location of the assembly</span><br />     <span style="color:#008000">//compilerParams.ReferencedAssemblies.Add(&quot;System.dll&quot;);</span></p>
<p>     <span style="color:#008000">//I am lazy so I will just loop through the assemblies that are already loaded and add those</span><br />     <span style="color:#0000ff">foreach</span> (<span style="color:#2b91af">Assembly</span> assembly <span style="color:#0000ff">in</span> <span style="color:#2b91af">AppDomain</span>.CurrentDomain.GetAssemblies())<br />     {<br />         <span style="color:#0000ff">try</span><br />         {<br />             <span style="color:#0000ff">string</span> location = assembly.Location;<br />             <span style="color:#0000ff">if</span> (!<span style="color:#2b91af">String</span>.IsNullOrEmpty(location))<br />                 compilerParams.ReferencedAssemblies.Add(location);<br />         }<br />         <span style="color:#0000ff">catch</span> (<span style="color:#2b91af">NotSupportedException</span>)<br />         {<br />             <span style="color:#008000">// this happens for dynamic assemblies, so just ignore it.                     </span><br />         }<br />     }</p>
<p>     <span style="color:#0000ff">return</span> compilerParams;<br /> }</div>
</p></div>
</p></div>
<p>Now we compile the code into an assembly.</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:b05d391c-e1d9-47c3-b9b3-2c147f47e7bb" 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:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;summary&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> Compiles the assembly.</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;/summary&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;param name=&quot;compileUnit&quot;&gt;</span><span style="color:#008000">The compile unit.</span><span style="color:#808080">&lt;/param&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;param name=&quot;compilerParams&quot;&gt;</span><span style="color:#008000">The compiler params.</span><span style="color:#808080">&lt;/param&gt;</span><br /> <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#2b91af">CompilerResults</span> CompileAssembly(<span style="color:#2b91af">CodeCompileUnit</span> compileUnit, <span style="color:#2b91af">CompilerParameters</span> compilerParams)<br /> {<br />     <span style="color:#0000ff">using</span> (<span style="color:#2b91af">CSharpCodeProvider</span> provider = <span style="color:#0000ff">new</span> <span style="color:#2b91af">CSharpCodeProvider</span>())<br />     {<br />         <span style="color:#008000">// =============================================================================== //</span><br />         <span style="color:#008000">// if you want to see the actual complied source code uncomment //</span><br />         <span style="color:#008000">// =============================================================================== //</span></p>
<p>         <span style="color:#008000">//StringBuilder source = new StringBuilder();</span><br />         <span style="color:#008000">//StringWriter sw = new StringWriter(source);</span><br />         <span style="color:#008000">//provider.GenerateCodeFromCompileUnit(compileUnit, sw, new CodeGeneratorOptions());</span><br />         <span style="color:#008000">//string sourceCode = source.ToString();</span></p>
<p>         <span style="color:#0000ff">var</span> results = provider.CompileAssemblyFromDom(compilerParams, compileUnit);<br />         <span style="color:#0000ff">return</span> results;<br />     }<br /> }</div>
</p></div>
</p></div>
<p>The last thing we need to do is run the code that was just compiled.&#160; We will need the help of reflection to accomplish 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:09c68e9b-98f4-4334-aa9f-ecf464569e54" 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:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;summary&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> Executes the ExecuteScript method from the compiled CodeDom assembly.</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;/summary&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;param name=&quot;results&quot;&gt;</span><span style="color:#008000">The results.</span><span style="color:#808080">&lt;/param&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;param name=&quot;sender&quot;&gt;</span><span style="color:#008000">The sender.</span><span style="color:#808080">&lt;/param&gt;</span><br /> <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080">&lt;param name=&quot;e&quot;&gt;</span><span style="color:#008000">The </span><span style="color:#808080">&lt;see cref=&quot;System.Windows.RoutedEventArgs&quot;/&gt;</span><span style="color:#008000"> instance containing the event data.</span><span style="color:#808080">&lt;/param&gt;</span><br /> <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> ExecuteCode(<span style="color:#2b91af">CompilerResults</span> results, <span style="color:#0000ff">object</span> sender, <span style="color:#2b91af">RoutedEventArgs</span> e)<br /> {<br />     <span style="color:#0000ff">try</span><br />     {<br />         <span style="color:#2b91af">Assembly</span> executingAssembly = results.CompiledAssembly;<br />         <span style="color:#0000ff">if</span> (executingAssembly != <span style="color:#0000ff">null</span>)<br />         {<br />             <span style="color:#008000">//create an instance of our newly compiled assembly</span><br />             <span style="color:#0000ff">object</span> assemblyInstance = executingAssembly.CreateInstance(<span style="color:#a31515">&quot;WPFCodeInjection.DynamicClass&quot;</span>);</p>
<p>             <span style="color:#008000">//get our ExecuteScript method and execute it.</span><br />             <span style="color:#2b91af">MethodInfo</span> info = assemblyInstance.GetType().GetMethod(<span style="color:#a31515">&quot;ExecuteScript&quot;</span>);<br />             info.Invoke(assemblyInstance, <span style="color:#0000ff">new</span> <span style="color:#0000ff">object</span>[] { sender, e });<br />         }<br />     }<br />     <span style="color:#0000ff">catch</span> (<span style="color:#2b91af">Exception</span> ex)<br />     {<br />         <span style="color:#2b91af">Console</span>.WriteLine(<span style="color:#a31515">&quot;Error: An exception occurred while executing the script&quot;</span>, ex);<br />     }<br /> }</div>
</p></div>
</p></div>
<p>That is it.&#160; Now to test this out lets create a .txt file that contains our XAML that we define above and save it CodeSnippet.txt.&#160; In our MainWindow.xaml.cs, lets handle the Loaded event and load our CodeSnippet.txt using the XamlReader.Load method.</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:bc56e72c-6fdc-4430-afb5-4498031c46f1" 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">void</span> MainWindow_Loaded(<span style="color:#0000ff">object</span> sender, <span style="color:#2b91af">RoutedEventArgs</span> e)<br /> {<br />     <span style="color:#0000ff">using</span> (<span style="color:#2b91af">FileStream</span> fs = <span style="color:#0000ff">new</span> <span style="color:#2b91af">FileStream</span>(<span style="color:#a31515">@&quot;./CodeSnippet.txt&quot;</span>, <span style="color:#2b91af">FileMode</span>.Open))<br />     {<br />         <span style="color:#0000ff">this</span>.Content = <span style="color:#2b91af">XamlReader</span>.Load(fs);<br />     }<br /> }</div>
</p></div>
</p></div>
<p>Run the application is this is what it should look like.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2010/12/image9.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/2010/12/image_thumb9.png" width="174" height="179" /></a></p>
<p>Now click the button and our C# code defined within the Script property will be dynamically compiled and executed changed the text of the button to this:</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2010/12/image10.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/2010/12/image_thumb10.png" width="184" height="179" /></a></p>
<p>This is a very simple example and is not intended to be a complete solution, but it does show some of the powerful capabilities you have using WPF, XAML, and the CodeDom.&#160; Like always <a href="http://brianlagunas.com/downloads/source/WpfCodeInjection.zip">download the source</a> and start playing around.&#160; See what kind of cool stuff you can do with it.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2010/12/21/wpf-dynamically-compile-and-run-event-handlers-within-loose-xaml-using-codedom/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Yes you can write Inline Code in XAML</title>
		<link>http://elegantcode.com/2010/12/14/yes-you-can-write-inline-code-in-xaml/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=yes-you-can-write-inline-code-in-xaml</link>
		<comments>http://elegantcode.com/2010/12/14/yes-you-can-write-inline-code-in-xaml/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 21:11:51 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[Esoterica]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2010/12/14/yes-you-can-write-inline-code-in-xaml/</guid>
		<description><![CDATA[A couple of days ago I was spreading the WPF goodness and was talking about how MVVM (Model-View-ViewModel) helps promote separation of concerns by removing the need for the code-behind file from the associated XAML file.&#160; After my statement someone replied with the following question, “So why even have it there, can you just delete [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of days ago I was spreading the WPF goodness and was talking about how MVVM (Model-View-ViewModel) helps promote separation of concerns by removing the need for the code-behind file from the associated XAML file.&#160; After my statement someone replied with the following question, “So why even have it there, can you just delete it?”.&#160; Obviously I replied yes, you absolutely can delete the code-behind file from a XAML file and the application will still work.&#160; Then they replied, “That’s cool I guess, but what about the code that needs to execute, such as event handlers?”.&#160; Naturally I brought up the fact that using MVVM you don’t use event handlers, but as most developers do, they said, “Well what if I really needed it?”.&#160; My reply to that question was, “If you really had to, it is possible to write inline code inside the XAML file”.</p>
<p>They looked at me in amazement, “Really?”.&#160; Apparently that is a little known fact about WPF.&#160; Yes, it is absolutely possible to write inline code inside a XAML page without the need for a code-behind file, and everything will work as expected.&#160; I quickly realized that his was going somewhere I didn’t want it to go.&#160; I knew what was coming next; they asked me to show them how to do it. Uggg…</p>
<p>Okay here is the deal; what I am about to show you is not recommended.&#160; It goes against everything I have been teaching in the community, but if you are curious how to actually do this, it is quit simple.</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:ddf41891-b77a-41c9-89aa-aeb2944933da" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 500px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="color:#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:#008000">&lt;!&#8211;Define the button content &#8211;&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">Button</span><span style="color:#ff0000"> Width</span><span style="color:#0000ff">=&quot;133&quot;</span><span style="color:#ff0000"> Height</span><span style="color:#0000ff">=&quot;24&quot;</span><span style="color:#ff0000"> Name</span><span style="color:#0000ff">=&quot;btnExitApp&quot;</span><span style="color:#ff0000"> Click</span><span style="color:#0000ff">=&quot;btnExitApp_Clicked&quot;</span><span style="color:#ff0000"> Content</span><span style="color:#0000ff">=&quot;Exit Application&quot;/&gt;</span></p>
<p>     <span style="color:#a31515"></span><span style="color:#008000">&lt;!&#8211;The C# implementation of the button&#39;s Click event handler. &#8211;&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;</span><span style="color:#a31515">x</span><span style="color:#0000ff">:</span><span style="color:#a31515">Code</span><span style="color:#0000ff">&gt;</span><br />         <span style="color:#a31515"></span><span style="color:#808080">&lt;![CDATA[            </span><br />             <span style="color:#808080">private void btnExitApp_Clicked(object sender, RoutedEventArgs e)</span><br />             <span style="color:#808080">{</span><br />                 <span style="color:#808080">// Get a handle to the current app and shut it down.</span><br />                 <span style="color:#808080">Application.Current.Shutdown();</span><br />             <span style="color:#808080">}</span><br />         <span style="color:#808080">]]&gt;</span><br />     <span style="color:#a31515"></span><span style="color:#0000ff">&lt;/</span><span style="color:#a31515">x</span><span style="color:#0000ff">:</span><span style="color:#a31515">Code</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>
<p>As you can see the code snippet above is pretty simple.&#160; You will notice that the Button has a EventHandler defined called “btnExitApp_Clicked”.&#160; Since there is no code-behind (I deleted it) you may be expecting a compile error that says it cannot find the definition for the EventHandler.&#160; But wait, we do have the event handler defined within the &lt;x:Code&gt;….&lt;/x:Code&gt; tags.</p>
<p>The &lt;x:Code&gt;….&lt;/x:Code&gt; is a directive element defined in XAML.&#160; An x:Code directive element can contain inline programming code. The code that is defined inline can interact with the XAML on the same page.&#160; Notice that the code is inside the x:Code element and that the code must be surrounded by &lt;CDATA[...]]&gt; to escape the contents for XML, so that a XAML processor (interpreting either the XAML schema or the WPF schema) will not try to interpret the contents literally as XML.</p>
<p>That is all there really is to it.&#160; There are some limitations to using inline code, for more information you can check out the <a href="http://msdn.microsoft.com/en-us/library/aa970568.aspx" target="_blank">MSDN documentation</a>.&#160; Now, I don’t want to see this in any production code.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2010/12/14/yes-you-can-write-inline-code-in-xaml/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Visual Studio: Open in Full XAML View by Default</title>
		<link>http://elegantcode.com/2010/04/01/visual-studio-open-in-full-xaml-view-by-default/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=visual-studio-open-in-full-xaml-view-by-default</link>
		<comments>http://elegantcode.com/2010/04/01/visual-studio-open-in-full-xaml-view-by-default/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 15:49:14 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2010/04/01/visual-studio-open-in-full-xaml-view-by-default/</guid>
		<description><![CDATA[So I am using Visual Studio 2008 for developing WPF and Silverlight applications.&#160; The one thing that really annoys me is when I open a .XAML file and then Visual Studio automatically opens the file in split view mode.&#160; I am sure you are well aware of how VS 2008 support for the preview pane [...]]]></description>
			<content:encoded><![CDATA[<p>So I am using Visual Studio 2008 for developing WPF and Silverlight applications.&#160; The one thing that really annoys me is when I open a .XAML file and then Visual Studio automatically opens the file in split view mode.&#160; I am sure you are well aware of how VS 2008 support for the preview pane blows.&#160; So now I have to sit and wait for VS to render my view in the preview pane, and sometimes it can take a while, if it doesn’t just completely crash.&#160; Sometimes I take the extra time to go grab a snack and beverage of my choice.&#160; </p>
<p>So here is a hidden performance increasing jewel you might find useful.&#160; We can set the default open mode to be in full XAML view.</p>
<p>First thing you need to do is in Visual Studio go to your Tools ==&gt; Options ==&gt; Text Editor ==&gt; XAML ==&gt; Miscellaneous.&#160; There you will see an option for “Always open documents in full XAML view”.&#160; Check that box.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2010/04/image.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="xaml options for opening in full xaml view" border="0" alt="xaml options for opening in full xaml view" src="http://elegantcode.com/wp-content/uploads/2010/04/image_thumb.png" width="244" height="146" /></a> </p>
<p>Now every time you open a XAML file it will open in full XAML view and give you one less thing to gripe about.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2010/04/01/visual-studio-open-in-full-xaml-view-by-default/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A Simple WPF Loading Animation</title>
		<link>http://elegantcode.com/2009/08/21/a-simple-wpf-loading-animation/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-simple-wpf-loading-animation</link>
		<comments>http://elegantcode.com/2009/08/21/a-simple-wpf-loading-animation/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 03:47:21 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2009/08/21/a-simple-wpf-loading-animation/</guid>
		<description><![CDATA[Okay, so I needed a very simple and clean loading animation for a multi threaded application I was working on to notify the user that something was in the process of being loaded.&#160; So of course the first place I looked was Google, because I figured someone else has already written one and I could [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, so I needed a very simple and clean loading animation for a multi threaded application I was working on to notify the user that something was in the process of being loaded.&#160; So of course the first place I looked was Google, because I figured someone else has already written one and I could save myself some time by just using theirs.&#160; Well, after almost an hour searching, I found nothing.&#160; So much for being a timesaver.&#160; Now, don’t get me wrong, I found a couple of WPF animations out there, but none of them really fit what I needed.&#160; So I just decided to bite the bullet and create my own.&#160; After creating the animation I decided to share the fruits of my labor so that anyone else who is looking for the same thing I was, or something similar, wouldn’t have as much trouble as I did.</p>
<p>Here is what it looks like.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2009/08/loadingAnimation.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="loadingAnimation" border="0" alt="loadingAnimation" src="http://elegantcode.com/wp-content/uploads/2009/08/loadingAnimation_thumb.jpg" width="114" height="114" /></a> </p>
<p>Here is the source: <a href="http://brianlagunas.com/downloads/source/LoadingControl.zip">Download the Loading Animation Source</a></p>
<p>I hope it is useful to someone besides me.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2009/08/21/a-simple-wpf-loading-animation/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Debugging XAML</title>
		<link>http://elegantcode.com/2009/04/14/debugging-xaml/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=debugging-xaml</link>
		<comments>http://elegantcode.com/2009/04/14/debugging-xaml/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 01:43:01 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2009/04/14/debugging-xaml/</guid>
		<description><![CDATA[Okay, so I have been asked this question more than almost any XAML related question in the past few weeks; How do I debug XAML?&#160; The problem with XAML’s powerful binding model is that it can be difficult to debug errors in your binding paths. Lets say I have the following code snippet: &#60;StatusBar&#62; &#60;StatusBarItem&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, so I have been asked this question more than almost any XAML related question in the past few weeks; How do I debug XAML?&#160; The problem with XAML’s powerful binding model is that it can be difficult to debug errors in your binding paths.</p>
<p>Lets say I have the following code snippet:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #0000ff">&lt;</span><span style="color: #800000">StatusBar</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">   <span style="color: #0000ff">&lt;</span><span style="color: #800000">StatusBarItem</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">       <span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBlock</span> <span style="color: #ff0000">Text</span><span style="color: #0000ff">=&quot;{Binding Messssage}&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">   <span style="color: #0000ff">&lt;/</span><span style="color: #800000">StatusBarItem</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">StatusBar</span><span style="color: #0000ff">&gt;</span></pre>
</p></div>
</div>
<p>As you can see my property Message is totally misspelled.&#160; If I were to run this application nothing would ever appear in my status bar, and I would not know why.&#160; I didn’t get any compile errors, and my view renders perfectly in my designer, so what the hell is going on.&#160; You might spend hours looking at your object’s property, stepping through the property changed events, or just saying XAML is a piece of crap and I give up.&#160; Well never fear, I am about to reveal the secret to debugging your XAML.</p>
<p>Look in your Output Window!</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2009/04/outputwindow.jpg" target="_blank"><img title="OutputWindow" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="79" alt="OutputWindow" src="http://elegantcode.com/wp-content/uploads/2009/04/outputwindow-thumb.jpg" width="404" border="0" /></a> </p>
<p>Yes, the nearly always forgotten Output Window.&#160; As you can see, if you click on the image above, it tells me that I have a binding expression path error and gives the line number where the error occurred.&#160; So don’t spend hours stepping through code looking for a ghost.&#160; Just check your Output Window.</p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2009/04/14/debugging-xaml/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WPF String.Format in XAML with the StringFormat attribute</title>
		<link>http://elegantcode.com/2009/04/07/wpf-stringformat-in-xaml-with-the-stringformat-attribute/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wpf-stringformat-in-xaml-with-the-stringformat-attribute</link>
		<comments>http://elegantcode.com/2009/04/07/wpf-stringformat-in-xaml-with-the-stringformat-attribute/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 03:29:10 +0000</pubDate>
		<dc:creator>Brian Lagunas</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[stringformat]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2009/04/07/wpf-stringformat-in-xaml-with-the-stringformat-attribute/</guid>
		<description><![CDATA[So you want to format the output of information but don't want do it in code behind or write a value converter to do it. Well, good news, you don't have to. You can format your data directly in XAML. How, you may be asking? New in .NET 3.5 SP1 is the StringFormat attribute. 

Example 1: Lets say you want to format a double value into a currency: 

<TextBlock Text="{Binding Amount, StringFormat={}{0:C}}" />


Notice the “{ }” just after the StringFormat attribute? What that is doing is escaping the text after the “=” sign. You need to do this because we do not have any text directly after the “=” sign. If you don’t put the “{ }'”, strange things will happen. 

And now lets say we want to place some text in front of the currency: 

<TextBlock Text="{Binding Amount, StringFormat=Total: {0:C}}" />


Since we now have text after the “=” sign we no longer need the “{ }”. 

How about a date you ask: 

<TextBlock Text="{Binding Date, StringFormat={}{0:MM/dd/yyyy}}" />




Oh, and you want time: 

<TextBlock Text="{Binding Date, StringFormat={}{0:MM/dd/yyyy hh:mm tt}}" />


What? You want to create a tooltip comprised of more than one property of an object. Well Okay: 

<Button Content="Delete Me"> <Button.ToolTip> <ToolTip> <StackPanel Orientation="Horizontal"> <TextBlock> <TextBlock.Text> <MultiBinding StringFormat="Delete {0} {1}"> <Binding Path="FirstName" /> <Binding Path="LastName" /> </MultiBinding> </TextBlock.Text> </TextBlock> </StackPanel> </ToolTip> </Button.ToolTip></Button>


As you can see the StringFormat attribute can be a time saver, and just make life a little easier. One thing to note is that if you use the StringFormat attribute and you bind to a property that has no value, otherwise known as null, then the text that will be displayed is “{DependencyProperty.UnsetValue}".]]></description>
			<content:encoded><![CDATA[<p>So you want to format the output of information but don&#8217;t want do it in code behind or write a value converter to do it.&#160; Well, good news, you don&#8217;t have to.&#160; You can format your data directly in XAML.&#160; How, you may be asking?&#160; New in .NET 3.5 SP1 is the <strong>StringFormat</strong> attribute. </p>
<p>Example 1:&#160; Lets say you want to format a double value into a currency: </p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; height: 35px; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBlock</span> <span style="color: #ff0000">Text</span><span style="color: #0000ff">=&quot;{Binding Amount, StringFormat={}{0:C}}&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
</p></div>
</div>
<p>Notice the “{ }” just after the <strong>StringFormat</strong> attribute?&#160; What that is doing is escaping the text after the “=” sign.&#160; You need to do this because we do not have any text directly after the “=” sign.&#160; If you don’t put the “{ }&#8217;”, strange things will happen.&#160; </p>
<p>And now lets say we want to place some text in front of the currency: </p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; height: 31px; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBlock</span> <span style="color: #ff0000">Text</span><span style="color: #0000ff">=&quot;{Binding Amount, StringFormat=Total: {0:C}}&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
</p></div>
</div>
<p>Since we now have text after the “=” sign we no longer need the “{ }”.&#160; </p>
<p>How about a date you ask: </p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; height: 33px; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBlock</span> <span style="color: #ff0000">Text</span><span style="color: #0000ff">=&quot;{Binding Date, StringFormat={}{0:MM/dd/yyyy}}&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
</p></div>
</div>
<p>Oh, and you want time: </p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; height: 35px; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBlock</span> <span style="color: #ff0000">Text</span><span style="color: #0000ff">=&quot;{Binding Date, StringFormat={}{0:MM/dd/yyyy hh:mm tt}}&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
</p></div>
</div>
<p>What?&#160; You want to create a tooltip comprised of more than one property of an object.&#160; Well Okay: </p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #0000ff">&lt;</span><span style="color: #800000">Button</span> <span style="color: #ff0000">Content</span><span style="color: #0000ff">=&quot;Delete Me&quot;</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Button.ToolTip</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #0000ff">&lt;</span><span style="color: #800000">ToolTip</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">            <span style="color: #0000ff">&lt;</span><span style="color: #800000">StackPanel</span> <span style="color: #ff0000">Orientation</span><span style="color: #0000ff">=&quot;Horizontal&quot;</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">                <span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBlock</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">                    <span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBlock.Text</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">                        <span style="color: #0000ff">&lt;</span><span style="color: #800000">MultiBinding</span> <span style="color: #ff0000">StringFormat</span><span style="color: #0000ff">=&quot;Delete {0} {1}&quot;</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">                            <span style="color: #0000ff">&lt;</span><span style="color: #800000">Binding</span> <span style="color: #ff0000">Path</span><span style="color: #0000ff">=&quot;FirstName&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">                            <span style="color: #0000ff">&lt;</span><span style="color: #800000">Binding</span> <span style="color: #ff0000">Path</span><span style="color: #0000ff">=&quot;LastName&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">                        <span style="color: #0000ff">&lt;/</span><span style="color: #800000">MultiBinding</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">                    <span style="color: #0000ff">&lt;/</span><span style="color: #800000">TextBlock.Text</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">                <span style="color: #0000ff">&lt;/</span><span style="color: #800000">TextBlock</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">            <span style="color: #0000ff">&lt;/</span><span style="color: #800000">StackPanel</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">        <span style="color: #0000ff">&lt;/</span><span style="color: #800000">ToolTip</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">    <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Button.ToolTip</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Button</span><span style="color: #0000ff">&gt;</span></pre>
</p></div>
</div>
<p>As you can see the <strong>StringFormat</strong> attribute can be a time saver, and just make life a little easier.&#160; One thing to note is that if you use the <strong>StringFormat</strong> attribute and you bind to a property that has no value, otherwise known as null, then the text that will be displayed is “{DependencyProperty.UnsetValue}&quot;. </p>
]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2009/04/07/wpf-stringformat-in-xaml-with-the-stringformat-attribute/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

