<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.componentart.com/community/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Corey Cahill</title><subtitle type="html">My bugs are actually hidden features!</subtitle><id>http://www.componentart.com/community/blogs/corey/atom.aspx</id><link rel="alternate" type="text/html" href="http://www.componentart.com/community/blogs/corey/default.aspx" /><link rel="self" type="application/atom+xml" href="http://www.componentart.com/community/blogs/corey/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.40407.4157">Community Server</generator><updated>2009-06-22T16:51:00Z</updated><entry><title>Silverlight Chart Data-Point Markers and Mouse Events</title><link rel="alternate" type="text/html" href="/community/blogs/corey/archive/2009/11/19/silverlight-chart-data-point-markers-on-mouse-hover.aspx" /><id>/community/blogs/corey/archive/2009/11/19/silverlight-chart-data-point-markers-on-mouse-hover.aspx</id><published>2009-11-19T10:53:00Z</published><updated>2009-11-19T10:53:00Z</updated><content type="html">&lt;p&gt;When using line charts, it is often desirable to further highlight the data-point in context by superimposing a marker on top.&lt;/p&gt;
&lt;p&gt;In this post, I will illustrate how to easily display data-point markers while utilizing mouse events.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Basic Chart&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Start with your basic line chart (in this example we will use a chart with two series):&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#FF0000;"&gt;Nam e&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Chart1&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;XValue&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Month&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;ChartKind&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Line&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Width&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;600&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Height&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;400&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;HighlightDataPointOnHover&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;False&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart.DataSeries&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Series&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;YValue&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;High&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Series&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;YValue&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Low&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart.DataSeries&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;In your
code-behind, create a simple data class and set your
chart&amp;#39;s data-source:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; ChartData &lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; Month { &lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;double&lt;/span&gt; High { &lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;double&lt;/span&gt; Low { &lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Chart1_Loaded(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;    Chart1.DataSource = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData[]&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Month = &amp;quot;&lt;span style="color:#8B0000;"&gt;Jan&lt;/span&gt;&amp;quot;, High = 1451, Low = 1237 },&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Month = &amp;quot;&lt;span style="color:#8B0000;"&gt;Feb&lt;/span&gt;&amp;quot;, High = 2356, Low = 1954 },&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Month = &amp;quot;&lt;span style="color:#8B0000;"&gt;Mar&lt;/span&gt;&amp;quot;, High = 5212, Low = 4241 },&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Month = &amp;quot;&lt;span style="color:#8B0000;"&gt;Apr&lt;/span&gt;&amp;quot;, High = 4088, Low = 3956 },&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Month = &amp;quot;&lt;span style="color:#8B0000;"&gt;May&lt;/span&gt;&amp;quot;, High = 6421, Low = 5264 },&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Month = &amp;quot;&lt;span style="color:#8B0000;"&gt;Jun&lt;/span&gt;&amp;quot;, High = 4986, Low = 2999 }&lt;br /&gt;    };&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;If you compile and run your application, you should now have a chart that looks like the following:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.componentart.com/community/resized-image.ashx/__size/528x356/__key/CommunityServer.Blogs.Components.WeblogFiles/corey/0317.ss2.png" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Displaying Markers on Data-Point Mouse Events&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;To display a marker when hovering over a data-point, first define your marker style on your series:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Series&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;YValue&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;High&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;MarkerStyle&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;CircleSimple&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;MarkerVisible&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;False&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;MarkerSize&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;16&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;MarkerFill&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Red&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;MarkerStrokeThickness&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Series&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;YValue&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Low&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;MarkerStyle&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;CircleSimple&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;MarkerVisible&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;False&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;MarkerSize&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;16&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;MarkerFill&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Green&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;MarkerStrokeThickness&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Notice that we set &lt;b&gt;MarkerVisiblie=&amp;quot;False&amp;quot;&lt;/b&gt;.&lt;b&gt;&amp;nbsp; &lt;/b&gt;This is because we only want to display the markers on mouse hover.&lt;/p&gt;
&lt;p&gt;Next, we simply create event handlers for &lt;b&gt;Chart&lt;/b&gt;&amp;#39;s &lt;b&gt;MouseEnterDataPoint&lt;/b&gt; and &lt;b&gt;MouseLeaveDataPoint&lt;/b&gt; events:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Chart1_MouseEnterDataPoint(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, SelectedDataPointEventArgs e)&lt;br /&gt;{&lt;br /&gt;    DataPoint dp = e.DataPointContext.DataPoint;&lt;br /&gt;    dp.MarkerVisible = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Chart1_MouseLeaveDataPoint(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, SelectedDataPointEventArgs e)&lt;br /&gt;{&lt;br /&gt;    DataPoint dp = e.DataPointContext.DataPoint;&lt;br /&gt;    dp.MarkerVisible = &lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Now, if you compile and run your application, when you hover over a data-point, you should have a chart that looks like the following:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.componentart.com/community/resized-image.ashx/__size/524x352/__key/CommunityServer.Blogs.Components.WeblogFiles/corey/5582.ss3.png" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;You can easily define a different brush for each data-point by setting the &lt;b&gt;DataPoint.MarkerFill&lt;/b&gt; property.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Displaying Markers on Series Mouse Events&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;If we want to display markers on a whole series, we can utilize &lt;b&gt;Chart&lt;/b&gt;&amp;#39;s &lt;b&gt;MouseEnterSeries &lt;/b&gt;and &lt;b&gt;MouseLeaveSeries &lt;/b&gt;events:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Chart1_MouseEnterSeries(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, SelectedSeriesEventArgs e)&lt;br /&gt;{&lt;br /&gt;    Series series = e.Series &lt;span style="color:#0000FF;"&gt;as&lt;/span&gt; Series;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (DataPoint dp &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; series.DataPoints)&lt;br /&gt;        dp.MarkerVisible = &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Chart1_MouseLeaveSeries(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, SelectedSeriesEventArgs e)&lt;br /&gt;{&lt;br /&gt;    Series series = e.Series &lt;span style="color:#0000FF;"&gt;as&lt;/span&gt; Series;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (DataPoint dp &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; series.DataPoints)&lt;br /&gt;        dp.MarkerVisible = &lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;At this point, if you compile and run your application, you should have a chart that looks like the following when hovering over a data-point on a series:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.componentart.com/community/resized-image.ashx/__size/528x351/__key/CommunityServer.Blogs.Components.WeblogFiles/corey/1411.ss4.png" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Using Coordinate System Hover Events&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;A final method for responding to mouse hover events is by handling &lt;b&gt;Chart&lt;/b&gt;&amp;#39;s &lt;b&gt;MouseHoverOverCoordinateSystem &lt;/b&gt;event.&amp;nbsp; As might be implied by its name, the &lt;b&gt;MouseHoverOverCoordinateSystem&lt;/b&gt; event fires every time the mouse position changes over the chart&amp;#39;s coordinate system; hovering over the axis annotations has no effect.&lt;/p&gt;
&lt;p&gt;To highlight data-points on all series where the mouse position corresponds to a particular x-coordinate, you can create event handlers for both the &lt;b&gt;MouseHoverOverCoordinateSystem&lt;/b&gt; and &lt;b&gt;MouseLeave&lt;/b&gt; events as such:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#008000;"&gt;// stores current x-coordinate&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; xCoord = &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;// helper method&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; SetMarkerVisibility(&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; xCoord, &lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt; isVisible) &lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (Series series &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; Chart1.DataSeries)&lt;br /&gt;    {&lt;br /&gt;        DataPoint dp = series.GetPointAtX(xCoord);&lt;br /&gt;        dp.MarkerVisible = isVisible;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Chart1_MouseHoverOverCoordinateSystem(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, CoordinateSystemPointEventArgs e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; newCoord = (&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;)e.XCoordinate;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// call helper to hide markers&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (xCoord != &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; xCoord != newCoord) &lt;br /&gt;        SetMarkerVisibility(xCoord, &lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;); &lt;br /&gt;                        &lt;br /&gt;    xCoord = newCoord;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// call helper to show markers&lt;/span&gt;&lt;br /&gt;    SetMarkerVisibility(xCoord, &lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Chart1_MouseLeave(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, MouseEventArgs e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (xCoord != &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#008000;"&gt;// call helper to hide markers&lt;/span&gt;&lt;br /&gt;        SetMarkerVisibility(xCoord, &lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;); &lt;br /&gt;        xCoord = &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; If your x-coordinate data type is not of type &lt;b&gt;string &lt;/b&gt;(ie. &lt;b&gt;DateTime&lt;/b&gt;, &lt;b&gt;double&lt;/b&gt;, &lt;b&gt;int&lt;/b&gt;), the &lt;b&gt;CoordinateSystemPointEventArgs.XCoordinate &lt;/b&gt;property will return a continuous value that lies between the calculated minimum and maximum values of the x-axis.&amp;nbsp; In order to take advantage of the &lt;b&gt;Series.GetPointAtX()&lt;/b&gt; method, you may need to massage the value of the &lt;b&gt;XCoordinate&lt;/b&gt; property.&lt;/p&gt;
&lt;p&gt;Finally, if you compile and run your application, your chart should resemble the following when hovering over the coordinate system:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.componentart.com/community/resized-image.ashx/__size/526x355/__key/CommunityServer.Blogs.Components.WeblogFiles/corey/4048.ss5.png" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;By utilizing the mouse events provided by &lt;b&gt;Chart&lt;/b&gt;, especially in conjunction with data-point markers, you can provide added visual stimuli and context as the end-user interacts with the chart data.&amp;nbsp; Putting in a little extra effort will let you achieve fantastic results.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/community/aggbug.aspx?PostID=96187" width="1" height="1"&gt;</content><author><name>corey</name><uri>http://www.componentart.com/community/members/corey/default.aspx</uri></author><category term="Silverlight" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Silverlight/default.aspx" /><category term="DataPoint" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/DataPoint/default.aspx" /><category term="Chart" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Chart/default.aspx" /><category term="Mouse Events" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Mouse+Events/default.aspx" /><category term="Series" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Series/default.aspx" /><category term="Marker" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Marker/default.aspx" /><category term="Silverlight Chart" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Silverlight+Chart/default.aspx" /></entry><entry><title>Silverlight Chart Data-Point Selection and Highlighting</title><link rel="alternate" type="text/html" href="/community/blogs/corey/archive/2009/11/16/datapoint-selection-and-highlighting.aspx" /><id>/community/blogs/corey/archive/2009/11/16/datapoint-selection-and-highlighting.aspx</id><published>2009-11-16T21:23:00Z</published><updated>2009-11-16T21:23:00Z</updated><content type="html">&lt;p&gt;Often, when you are viewing visual data, it is necessary to highlight and select a data-point to obtain context specific information for more granular analysis.&lt;/p&gt;
&lt;p&gt;In this post, I will illustrate how to highlight and select a specific data-point with ease.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Create a Basic Chart&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;As always, start with a basic chart:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Chart1&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;XValue&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Area&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;ChartKind&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;RoundedBlock&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Width&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;600&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Height&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;400&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart.DataSeries&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Series&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;YValue&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Total&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart.DataSeries&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;In your
code-behind, create a simple data class and set your
chart&amp;#39;s data-source:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; ChartData &lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; Area { &lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;double&lt;/span&gt; Total { &lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Chart1_Loaded(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;    Chart1.DataSource = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData[]&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;North America&lt;/span&gt;&amp;quot;, Total = 451 },&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;South America&lt;/span&gt;&amp;quot;, Total = 466 },&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Europe&lt;/span&gt;&amp;quot;, Total = 732 },&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Asia/Pacific&lt;/span&gt;&amp;quot;, Total = 4088},&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Africa&lt;/span&gt;&amp;quot;, Total = 973 }&lt;br /&gt;    };&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;If you compile and run your application, you should now
have a chart that looks like the following:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.componentart.com/community/resized-image.ashx/__size/536x361/__key/CommunityServer.Blogs.Components.WeblogFiles/corey/5460.ss1.png" style="max-height:361px;max-width:536px;" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;By default, data-point highlighting (on mouse hover) is turned on.&amp;nbsp; You can toggle this by setting &lt;b&gt;Chart&lt;/b&gt;&amp;#39;s&lt;b&gt; HighlightDataPointOnHover&lt;/b&gt; property to true or false.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Selecting a Data-Point on Mouse Click&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;To visually select a data-point, create a private member of type &lt;b&gt;DataPoint&lt;/b&gt; in your &lt;b&gt;UserControl&lt;/b&gt; and add an &lt;b&gt;EventHandler &lt;/b&gt;for &lt;b&gt;Chart&lt;/b&gt;&amp;#39;s &lt;b&gt;MouseLeftButtonUpOnDataPoint &lt;/b&gt;event:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt; DataPoint activeDataPoint = &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Chart1_MouseLeftButtonUpOnDataPoint(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, SelectedDataPointEventArgs e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// cast the current data-point&lt;/span&gt;&lt;br /&gt;    DataPoint dp = e.DataPointContext.DataPoint;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// check for match&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt; isMatch = (dp == activeDataPoint);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// clear the previously selected data-point&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (activeDataPoint != &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;) &lt;br /&gt;    {&lt;br /&gt;        activeDataPoint.ClearValue(DataPoint.ColorProperty);&lt;br /&gt;        activeDataPoint = &lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// if the current data-point doesn&amp;#39;t match the previously selected data-point, &lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// highlight it; otherwise, we assume the previous data-point to be un-selected&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;if&lt;/span&gt; (!isMatch)&lt;br /&gt;    {&lt;br /&gt;        activeDataPoint = dp;&lt;br /&gt;        activeDataPoint.Color = Colors.Green;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Now, if you compile and run your application then click on a data-point, you should have a chart that looks like the following:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.componentart.com/community/resized-image.ashx/__size/524x349/__key/CommunityServer.Blogs.Components.WeblogFiles/corey/3733.ss1.png" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Clicking on a data-point that is not already highlighted will select and highlight the new data-point.&amp;nbsp; Clicking on a data-point that is already highlighted with remove the highlight.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Although it is rather trivial to implement data-point selection and highlighting, it is an extremely useful visual cue for providing data-point context.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/community/aggbug.aspx?PostID=96150" width="1" height="1"&gt;</content><author><name>corey</name><uri>http://www.componentart.com/community/members/corey/default.aspx</uri></author><category term="Silverlight" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Silverlight/default.aspx" /><category term="DataPoint" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/DataPoint/default.aspx" /><category term="Chart" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Chart/default.aspx" /><category term="Selection" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Selection/default.aspx" /><category term="Highlighting" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Highlighting/default.aspx" /><category term="Mouse Events" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Mouse+Events/default.aspx" /><category term="Silverlight Chart" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Silverlight+Chart/default.aspx" /></entry><entry><title>Creating Custom DataPoint Popups for Silverlight Chart</title><link rel="alternate" type="text/html" href="/community/blogs/corey/archive/2009/11/12/creating-custom-datapoint-popups-for-silverlight-chart.aspx" /><id>/community/blogs/corey/archive/2009/11/12/creating-custom-datapoint-popups-for-silverlight-chart.aspx</id><published>2009-11-12T22:40:00Z</published><updated>2009-11-12T22:40:00Z</updated><content type="html">&lt;p&gt;




&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;One of Chart&amp;#39;s
most powerful features is the ability to define custom templates for
data-point popups.&amp;nbsp; &lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;In this post, I will cover defining a basic data-point popup, as well as attaching and displaying more complex data.&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&lt;b&gt;Start Simple&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;Start with a
simple chart:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Chart1&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;XValue&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Area&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;ChartKind&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;RoundedBlock&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Width&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;600&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Height&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;400&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart.DataSeries&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Series&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;YValue&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Total&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart.DataSeries&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Chart&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;In your
code-behind, create a simple data class and set your
chart&amp;#39;s data-source:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; ChartData&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt; Area { &lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;double&lt;/span&gt; Total { &lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Chart1_Loaded(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;    Chart1.DataSource = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData[]&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;North America&lt;/span&gt;&amp;quot;, Total = 451 },&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;South America&lt;/span&gt;&amp;quot;, Total = 466 },&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Europe&lt;/span&gt;&amp;quot;, Total = 732 },&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Asia/Pacific&lt;/span&gt;&amp;quot;, Total = 4088},&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Africa&lt;/span&gt;&amp;quot;, Total = 973 }&lt;br /&gt;    };&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;If you compile and run your application, you should now
have a chart that looks like the following:
&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&lt;img src="http://www.componentart.com/community/resized-image.ashx/__size/536x361/__key/CommunityServer.Blogs.Components.WeblogFiles/corey/5460.ss1.png" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&lt;b&gt;Define A Custom DataPointPopup&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;You can add a
custom data-point popup by first defining it as a resource:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;DataPointPopup&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#FF0000;"&gt;Key&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;CustomDataPointPopup&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;DataPointPopup.DataTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Border&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Background&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;#70000000&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;CornerRadius&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;4&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Padding&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;10&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Width&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;130&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Border&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Background&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;{Binding DataPoint.Brush}&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Opacity&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;0.6&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;CornerRadius&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;3&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Margin&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;-5 -2 -5 -2&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TextBlock&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Text&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;{Binding DataPoint.X}&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Foreground&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;White&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Left&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;FontWeight&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Bold&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TextBlock&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Text&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;{Binding DataPoint.Y}&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Foreground&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;White&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Right&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;FontWeight&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Bold&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Border&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;DataPointPopup.DataTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;DataPointPopup&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;And then binding
the &lt;b&gt;DataPointPopup&lt;/b&gt; property of your series to it:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Series&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;YValue&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Total&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;DataPointPopup&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;{StaticResource CustomDataPointPopup}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;Notice that the template binds to properties of a &lt;b&gt;DataPoint&lt;/b&gt; object.&amp;nbsp; In fact, the &lt;b&gt;DataContext &lt;/b&gt;of the popup is an instance of the &lt;b&gt;DataPointContext &lt;/b&gt;class.&amp;nbsp; As well as providing information about the current &lt;b&gt;DataPoint&lt;/b&gt;, it also provides information regarding the &lt;b&gt;Series&lt;/b&gt;, &lt;b&gt;Chart &lt;/b&gt;and more.&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;
If you compile and run your application, you should now
have a chart that looks like the following:
&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&lt;img src="http://www.componentart.com/community/resized-image.ashx/__size/535x362/__key/CommunityServer.Blogs.Components.WeblogFiles/corey/8561.ss2.png" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&lt;b&gt;Attaching And Displaying Complex Data&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;If we want to display more advanced information in the popup, we can add additional data to each &lt;b&gt;DataPoint&lt;/b&gt;
object via its &lt;b&gt;Tag&lt;/b&gt; property.&amp;nbsp;  Do this by hooking into the &lt;b&gt;Chart&lt;/b&gt;&amp;#39;s 
&lt;b&gt;DataStructureCreated&lt;/b&gt; event:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Chart1_DataStructureCreated(&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    Series series = Chart1.DataSeries[0] &lt;span style="color:#0000FF;"&gt;as&lt;/span&gt; Series;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt; (DataPoint dp &lt;span style="color:#0000FF;"&gt;in&lt;/span&gt; series.DataPoints)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;switch&lt;/span&gt; (dp.X &lt;span style="color:#0000FF;"&gt;as&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color:#0000FF;"&gt;case&lt;/span&gt; &amp;quot;&lt;span style="color:#8B0000;"&gt;North America&lt;/span&gt;&amp;quot;:&lt;br /&gt;                dp.Tag = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData[]&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Canada&lt;/span&gt;&amp;quot;, Total = 33 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Mexico&lt;/span&gt;&amp;quot;, Total = 111 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;USA&lt;/span&gt;&amp;quot;, Total = 307 }&lt;br /&gt;                };&lt;br /&gt;                &lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color:#0000FF;"&gt;case&lt;/span&gt; &amp;quot;&lt;span style="color:#8B0000;"&gt;South America&lt;/span&gt;&amp;quot;:&lt;br /&gt;                dp.Tag = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData[]&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Argentina&lt;/span&gt;&amp;quot;, Total = 40 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Brazil&lt;/span&gt;&amp;quot;, Total = 191 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Venezuela&lt;/span&gt;&amp;quot;, Total = 26 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Others&lt;/span&gt;&amp;quot;, Total = 239 },&lt;br /&gt;                };&lt;br /&gt;                &lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color:#0000FF;"&gt;case&lt;/span&gt; &amp;quot;&lt;span style="color:#8B0000;"&gt;Europe&lt;/span&gt;&amp;quot;:&lt;br /&gt;                dp.Tag = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData[]&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;France&lt;/span&gt;&amp;quot;, Total = 65 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Germany&lt;/span&gt;&amp;quot;, Total = 82 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;UK&lt;/span&gt;&amp;quot;, Total = 61 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Others&lt;/span&gt;&amp;quot;, Total = 524 }&lt;br /&gt;                };&lt;br /&gt;                &lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;   &lt;br /&gt;            &lt;span style="color:#0000FF;"&gt;case&lt;/span&gt; &amp;quot;&lt;span style="color:#8B0000;"&gt;Asia/Pacific&lt;/span&gt;&amp;quot;:&lt;br /&gt;                dp.Tag = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData[]&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;China&lt;/span&gt;&amp;quot;, Total = 1368 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Japan&lt;/span&gt;&amp;quot;, Total = 127 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;India&lt;/span&gt;&amp;quot;, Total = 1198 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Others&lt;/span&gt;&amp;quot;, Total = 1395 }&lt;br /&gt;                };&lt;br /&gt;                &lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color:#0000FF;"&gt;case&lt;/span&gt; &amp;quot;&lt;span style="color:#8B0000;"&gt;Africa&lt;/span&gt;&amp;quot;:&lt;br /&gt;                dp.Tag = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData[]&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Egypt&lt;/span&gt;&amp;quot;, Total = 77 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Morocco&lt;/span&gt;&amp;quot;, Total = 31 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;South Africa&lt;/span&gt;&amp;quot;, Total = 49 },&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; ChartData() { Area = &amp;quot;&lt;span style="color:#8B0000;"&gt;Others&lt;/span&gt;&amp;quot;, Total = 816 }&lt;br /&gt;                };&lt;br /&gt;                &lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&lt;b&gt;Note:&lt;/b&gt; &lt;b&gt;Chart.DataStructureCreated&lt;/b&gt; is the earliest possible time that you can access the chart&amp;#39;s internal data-structures.&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;Now, we can define
a more advanced &lt;b&gt;DataPointPopup&lt;/b&gt;:&lt;/p&gt;
&lt;pre class="codeblock"&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;DataPointPopup&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#FF0000;"&gt;Key&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;CustomDataPointPopup&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;DataPointPopup.DataTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Border&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Background&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;#70000000&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;CornerRadius&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;4&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Padding&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;10&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;StackPanel&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Orientation&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Vertical&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Width&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;130&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                        &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Border&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Background&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;{Binding DataPoint.Brush}&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Opacity&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;0.6&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;CornerRadius&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;3&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Margin&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;-5 -2 -5 -2&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                        &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TextBlock&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Text&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;{Binding DataPoint.X}&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Foreground&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;White&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Left&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;FontWeight&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Bold&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                        &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TextBlock&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Text&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;{Binding DataPoint.Y}&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Foreground&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;White&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Right&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;FontWeight&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Bold&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListBox&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;ItemsSource&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;{Binding DataPoint.Tag}&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Margin&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Padding&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                        &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                            &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                                &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Width&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;120&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Margin&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;10 0 0 0&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                                    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TextBlock&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Text&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;{Binding Area}&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Foreground&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;White&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Left&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                                    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TextBlock&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Text&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;{Binding Total}&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Foreground&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;White&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Right&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;FontWeight&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;Bold&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                                &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                            &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                        &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                        &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListBox.Template&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                            &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ControlTemplate&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;TargetType&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;ListBox&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                                &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                                    &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ItemsPresenter&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;Margin&lt;/span&gt;=&lt;span style="color:#0000FF;"&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                                &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                            &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                        &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListBox.Template&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListBox&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Border&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;DataPointPopup.DataTemplate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585;"&gt;ca&lt;/span&gt;:&lt;span style="color:#800000;"&gt;DataPointPopup&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;Notice that we can now bind to &lt;b&gt;DataPoint.Tag&lt;/b&gt; and use its data to further populate our custom popup. &lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;If you compile and run your application, you should now
have a chart that looks like the following:
&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&lt;img src="http://www.componentart.com/community/resized-image.ashx/__size/543x374/__key/CommunityServer.Blogs.Components.WeblogFiles/corey/1362.ss3.png" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;By defining a custom &lt;b&gt;DataPointPopup &lt;/b&gt;template and utilizing &lt;b&gt;DataPoint&lt;/b&gt;&amp;#39;s &lt;b&gt;Tag &lt;/b&gt;property, you can create a custom
popup that is able display additional information that is as complex and/or diverse as anything you can
imagine!&amp;nbsp; This is one feature that every developer should give adequate attention to!&lt;/p&gt;
&lt;p style="margin-bottom:0in;font-weight:normal;"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/community/aggbug.aspx?PostID=96065" width="1" height="1"&gt;</content><author><name>corey</name><uri>http://www.componentart.com/community/members/corey/default.aspx</uri></author><category term="Silverlight" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Silverlight/default.aspx" /><category term="DataPoint" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/DataPoint/default.aspx" /><category term="Chart" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Chart/default.aspx" /><category term="Popup" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Popup/default.aspx" /><category term="Template" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Template/default.aspx" /><category term="Silverlight Chart" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Silverlight+Chart/default.aspx" /></entry><entry><title>ComponentArt Gauges for Silverlight *Sneak Preview*</title><link rel="alternate" type="text/html" href="/community/blogs/corey/archive/2009/06/22/componentart-gauges-for-silverlight-sneak-preview.aspx" /><id>/community/blogs/corey/archive/2009/06/22/componentart-gauges-for-silverlight-sneak-preview.aspx</id><published>2009-06-22T23:51:00Z</published><updated>2009-06-22T23:51:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-weight:bold;"&gt;ComponentArt is pleased to announce a sneak preview of Gauge for&lt;/span&gt;&lt;span style="font-weight:bold;"&gt; Silverlight!&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;br /&gt;
We have been working hard to bring you a flexible, themeable and customizable gauge control that delivers the same outstanding visual quality and ease of functionality that our &lt;a href="http://aspnetajax.componentart.com/control-specific/gauge/Features/GaugeTypes/Default.aspx" title="ComponentArt Gauge for ASP.NET AJAX"&gt;ASP.NET AJAX gauges&lt;/a&gt; deliver.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Theming&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
ComponentArt Gauge for Silverlight has very robust theming capabilities that allow you to customize the visual display of your gauge in almost any way that you can possibly conceive of.&amp;nbsp; Because Gauge has its themes defined entirely in XAML (vs. programmatic design), every visual element can be tweaked and/or replaced with very little effort!&amp;nbsp; For those who like to get up and running quickly, Gauge will ship with a number of already complete themes. &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Data Binding&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Gauge for Silverlight is extremely flexible in its ability to be bound to other resources and objects.&amp;nbsp; Since almost every property supports binding, the use of custom DataContexts will make your life much easier!&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.componentart.com/blogs/corey/200906/GaugeSliderExample.html" title="Theme &amp;amp; Binding Example" target="_blank"&gt;following example&lt;/a&gt; illustrates both the theming and data binding capabilities of Gauge.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.componentart.com/blogs/corey/200906/GaugeSliderExample.html" title="Theme &amp;amp; Binding Example" target="_blank"&gt;&lt;img alt="Themes &amp;amp; Bindings" src="http://www.componentart.com/blogs/corey/200906/sliderThumb.png" title="Themes &amp;amp; Bindings" /&gt;&lt;br /&gt;
&lt;span style="font-size:10px;"&gt;Click to launch example.&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;p style="font-weight:bold;"&gt;Interactivity &amp;amp; Animations&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;Gauge for Silverlight will bring a new level of interactivity to our Gauge suite by utilizing Silverlight events, storyboard animations and its flexible architecture.&amp;nbsp; Custom and predefined animations can be used to smoothly (or wildly!) transition between states as the gauge&amp;#39;s data changes.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.componentart.com/blogs/corey/200906/GaugeAnimationExample.html" title="Animation Example" target="_blank"&gt;following example&lt;/a&gt; illustrates the use of a custom-animation to realistically transition the pointer from its old value to its new value.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.componentart.com/blogs/corey/200906/GaugeAnimationExample.html" title="Animation Example" target="_blank"&gt;&lt;img alt="Animation" src="http://www.componentart.com/blogs/corey/200906/animationThumb.png" title="Animation" /&gt;&lt;br /&gt;
&lt;span style="font-size:10px;"&gt;Click to launch example.&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;span style="font-weight:bold;"&gt;More Features To Look For&lt;/span&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete radial, linear, numeric and indicator gauge themes&lt;br /&gt;
&lt;/li&gt;

&lt;li&gt;Content area for embedded gauges, annotations and/or UI controls&lt;/li&gt;

&lt;li&gt;Interactive mouse events for gauge feedback and manipulation&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Keep an eye out for a &lt;a href="http://www.componentart.com/products/roadmap.aspx"&gt;Fall 2009 Beta&lt;/a&gt; of Gauge for Silverlight!&lt;/strong&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.componentart.com/community/aggbug.aspx?PostID=91751" width="1" height="1"&gt;</content><author><name>Corey</name><uri>http://www.componentart.com/community/members/Corey/default.aspx</uri></author><category term="Silverlight" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Silverlight/default.aspx" /><category term="Gauges" scheme="http://www.componentart.com/community/blogs/corey/archive/tags/Gauges/default.aspx" /></entry></feed>
