<?xml-stylesheet type='text/xsl' href='http://blogs.u2u.be/rss.xsl' media='screen'?><rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0"><channel><title>U2U WPF/Silverlight Blog</title><description /><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=a01f0650-c549-4266-9f45-87e12c4a0268</guid><link>http://blogs.u2u.be/michael/post/2011/06/20/Visual-State-Manager-or-rather-Behavior-(part-3).aspx</link><category>Behavior</category><category>Silverlight</category><category>Windows Phone</category><title>Visual State Manager or rather Behavior ? (part 3)</title><description>&lt;p&gt;So far, so good. I created a little application indicating the distance to my geographically closest friend. I used Visual State Manager for making my indicator change, depending on the distance I get from the Distance-service. It takes some practice to get used to it. Now, I have two little problems with VSM:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It's a lot to write, even for having a simple control like our distance-indicator. &lt;/li&gt;

  &lt;li&gt;Changes (e.g. adding another state) always have to be done in two locations : code and XAML. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, when using Blend, you might have seen Behaviors, which you can drag and drop on top of your controls. They add some, ehm 'Behavior' to these controls. It also adds a specific assembly needed for creating these Behaviors, i.e. Microsoft.Phone.Interop. Next to a few out-of-the-box behaviors that Blend provides, you can start creating your own Behaviors. And the way of doing that, is just child's play. Simply create your own class, inheriting from Behavior&amp;lt;T&amp;gt; with T being the control for which you create a behavior. Of course, nothing stops you from using FrameworkElement here.&lt;/p&gt;

&lt;p&gt;I keep it simple, and I create a Behavior for the Ellipse. I also create 3 properties for specifying the colors for my distance-indicator:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DistanceBehavior : Behavior&amp;lt;Ellipse&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnAttached()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnAttached();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        Ellipse ao = AssociatedObject &lt;span class="kwrd"&gt;as&lt;/span&gt; Ellipse;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        DistanceReader.DistanceChanged += (s, ea) =&amp;gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (ea.Distance&amp;gt;5)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                ao.Fill = &lt;span class="kwrd"&gt;this&lt;/span&gt;.FarColor;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (ea.Distance&amp;gt;2)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                ao.Fill = &lt;span class="kwrd"&gt;this&lt;/span&gt;.AverageColor;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                ao.Fill = &lt;span class="kwrd"&gt;this&lt;/span&gt;.CloseColor;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        };&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Brush FarColor { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Brush AverageColor { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Brush CloseColor { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Let's now use this behavior on an ellipse we add to our MainPage. We first need to add the necessary namespaces to our xaml:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;xmlns:i=&lt;span class="str"&gt;&amp;quot;clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;xmlns:my=&lt;span class="str"&gt;&amp;quot;clr-namespace:WindowsPhoneApplication1&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;(!! I'm only showing the my-namespace here for completeness. Since we already added it to App.xaml in Part 1, we don't need to add it here).&lt;/p&gt;

&lt;p&gt;Let's now add our ellipse, and give it our Behavior :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Ellipse&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;i:Interaction.Behaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;my:DistanceBehavior&lt;/span&gt; &lt;span class="attr"&gt;FarColor&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Red&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;AverageColor&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Orange&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;CloseColor&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Green&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;i:Interaction.Behaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Ellipse&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;blockquote style="margin-right: 0px" dir="ltr"&gt;
  &lt;p&gt;Test your application again, and you'll see your ellipse change in the same way as your VSM-control, but this time with less coding and (in my opinion) easier to maintain.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br/&gt;
&lt;a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="piekenpuil" data-related="u2u"&gt;Tweet&lt;/a&gt;&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Mon, 20 Jun 2011 15:59:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/06/20/Visual-State-Manager-or-rather-Behavior-(part-3).aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=a01f0650-c549-4266-9f45-87e12c4a0268</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=a01f0650-c549-4266-9f45-87e12c4a0268</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/06/20/Visual-State-Manager-or-rather-Behavior-(part-3).aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=a01f0650-c549-4266-9f45-87e12c4a0268</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=be542f30-ef68-4a8a-bf87-a1dab41d9675</guid><link>http://blogs.u2u.be/michael/post/2011/06/19/Visual-State-Manager-or-rather-Behavior-(part-2).aspx</link><category>Silverlight</category><category>Visual State Manager</category><category>Windows Phone</category><title>Visual State Manager or rather Behavior ? (part 2)</title><description>&lt;p&gt;In part 1 I set up the service and the WP7-application. The WP7-application will poll the service regularly for asking the distance to the closest friend. Let's now finish the WP7-app so we can show the distance by a little indicator. When closer than 2 (km? miles ? light-years ? You choose) the indicator will show green, less then 5 will be orange, and all the rest is red. Let's first create an indicator using Visual State Manager. In VSM we will define different states. In code we define the state our control is in, and in XAML we define how a state should look like.&lt;/p&gt;

&lt;p&gt;Let's create our control:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TemplatePart(Name=&lt;span class="str"&gt;&amp;quot;Core&amp;quot;&lt;/span&gt;,Type=&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(FrameworkElement))]&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;[TemplateVisualState(Name=&lt;span class="str"&gt;&amp;quot;Far&amp;quot;&lt;/span&gt;,GroupName=&lt;span class="str"&gt;&amp;quot;DistanceStates&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;[TemplateVisualState(Name = &lt;span class="str"&gt;&amp;quot;Close&amp;quot;&lt;/span&gt;, GroupName = &lt;span class="str"&gt;&amp;quot;DistanceStates&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;[TemplateVisualState(Name = &lt;span class="str"&gt;&amp;quot;VeryClose&amp;quot;&lt;/span&gt;, GroupName = &lt;span class="str"&gt;&amp;quot;DistanceStates&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DistanceIndicator: Button&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    Ellipse corePart;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Ellipse CorePart &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; corePart; }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        set { corePart = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnApplyTemplate()&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnApplyTemplate();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        CorePart = (Ellipse) GetTemplateChild(&lt;span class="str"&gt;&amp;quot;Core&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        VisualStateManager.GoToState(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Far&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        DistanceReader.DistanceChanged += &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;DistanceEventArgs&amp;gt;(DistanceReader_DistanceChanged);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; DistanceReader_DistanceChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, DistanceEventArgs e)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Distance&amp;gt;5)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            VisualStateManager.GoToState(&lt;span class="kwrd"&gt;this&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;Far&amp;quot;&lt;/span&gt;,&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Distance &amp;gt; 2)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;            VisualStateManager.GoToState(&lt;span class="kwrd"&gt;this&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;Close&amp;quot;&lt;/span&gt;,&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;            VisualStateManager.GoToState(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;VeryClose&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;    }         &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;The code-attributes already shows you the different states my Indicator can have : Far, Close and VeryClose (OutOfInspirationException occurred). I add the controltemplate to App.xaml, describing how my three states should look like :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ControlTemplate&lt;/span&gt; &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;u2uCtrl&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;TargetType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;my:DistanceIndicator&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Ellipse&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ellipse&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{TemplateBinding Height}&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Fill&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Yellow&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;VisualStateManager.VisualStateGroups&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;VisualStateGroup&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;DistanceStates&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Close&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColorAnimation&lt;/span&gt; &lt;span class="attr"&gt;Duration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;To&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Orange&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetProperty&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;(Shape.Fill).(SolidColorBrush.Color)&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ellipse&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;d:IsOptimized&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;VeryClose&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColorAnimation&lt;/span&gt; &lt;span class="attr"&gt;Duration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;To&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Green&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetProperty&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;(Shape.Fill).(SolidColorBrush.Color)&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ellipse&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;d:IsOptimized&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Far&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColorAnimation&lt;/span&gt; &lt;span class="attr"&gt;Duration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;To&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Red&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetProperty&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;(Shape.Fill).(SolidColorBrush.Color)&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ellipse&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;d:IsOptimized&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;VisualStateGroup&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;VisualStateManager.VisualStateGroups&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Ellipse&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ControlTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;I cheated, of course: I used blend for creating this template. Nevertheless, I add my control to my MainPage:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;my:DistanceIndicator&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;distanceIndicator1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Template&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource u2uCtrl}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;That's it. Open the WPF-application, change the slider. Run the WP7-application and there you go. Play with the slider, and the WP7-app responds visually (after some time). Nice stuff, but it get's nicer with Behavior. That's for part 3. 

&lt;br/&gt;
&lt;a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="piekenpuil" data-related="u2u"&gt;Tweet&lt;/a&gt;&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Sun, 19 Jun 2011 16:23:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/06/19/Visual-State-Manager-or-rather-Behavior-(part-2).aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=be542f30-ef68-4a8a-bf87-a1dab41d9675</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=be542f30-ef68-4a8a-bf87-a1dab41d9675</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/06/19/Visual-State-Manager-or-rather-Behavior-(part-2).aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=be542f30-ef68-4a8a-bf87-a1dab41d9675</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=4bd05dfd-4632-442b-baed-7c83141b1de0</guid><link>http://blogs.u2u.be/michael/post/2011/06/15/Visual-State-Manager-or-rather-Behavior(part-1).aspx</link><category>Silverlight</category><category>Visual State Manager</category><category>Windows Phone</category><title>Visual State Manager or rather Behavior(part 1)</title><description>&lt;p&gt;During an interesting event last week, discussing the virtues of Silverlight apps out of the browser, I was confronted with Behavior. I should probably be ashamed because I never heard of them before. Because they have a high coolness- and awesomeness-level I checked if they were also available for Windows Phone, and hooray,&amp;nbsp; they are!&lt;/p&gt;
&lt;p&gt;Now what are they about ? In WPF you can use Triggers, to react on certain "events", like this one :&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button.Triggers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;EventTrigger&lt;/span&gt; &lt;span class="attr"&gt;RoutedEvent&lt;/span&gt;&lt;span class="kwrd"&gt;="Click"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;BeginStoryboard&lt;/span&gt; &lt;span class="attr"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;="{StaticResource mySB}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;EventTrigger&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Button.Triggers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Specially useful when you're creating your own Controltemplates. Unfortunately they're not available in Silverlight (except for the Loaded-event).&amp;nbsp; When creating your own controls, and you need them to have some kind of visual feedback, we'll have to use the Visual State Manager.&lt;/p&gt;
&lt;p&gt;In my little example I have a WP7-app that regularly calls a "Distance-service" that gives the shortest distance between you and your geographically closest friend (could be something Foursquare provides). The closest distance will be shown by some small colored ellipse. Whenever the distance changes, the color changes.&lt;/p&gt;
&lt;p&gt;Let's start by the service: I have a little WCF library that I'm hosting in a WPF-app. Service looks like this:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DistanceService : IDistanceService&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; GetDistance()&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; DistanceHelper.Distance;&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Can't make them smaller than this. What about this DistanceHelper ?&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DistanceHelper&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; distance=10;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; Distance&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; distance; }&lt;/pre&gt;
&lt;pre&gt;        set { distance = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre class="alt"&gt;    }        &lt;/pre&gt;
&lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;My MainWindow only has a slider going from 0 to 10, with an eventhandler for the ValueChanged. In this eventhandler I simply set the DIstance-property from DIstanceHelper:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; distanceSlider_ValueChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedPropertyChangedEventArgs&amp;lt;&lt;span class="kwrd"&gt;double&lt;/span&gt;&amp;gt; e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;    DistanceHelper.Distance = distanceSlider.Value;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;}&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Window_Loaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;    host = &lt;span class="kwrd"&gt;new&lt;/span&gt; ServiceHost(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(DistanceServiceLib.DistanceService));&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt;    host.Open();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt;}&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Window_Unloaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt;    host.Close();            &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I also configured my WCF-service to use simple basicHttpBinding.&lt;/p&gt;
&lt;p&gt;In my WP7-app I start by creating a service reference towards my service. This will be used by a helper-class DistanceReader:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DistanceReader&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; DistanceReader()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;        DispatcherTimer timer = &lt;span class="kwrd"&gt;new&lt;/span&gt; DispatcherTimer();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;        timer.Interval = &lt;span class="kwrd"&gt;new&lt;/span&gt; TimeSpan(0, 0, 10);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;        timer.Tick += (s, ea) =&amp;gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt;            var proxy = &lt;span class="kwrd"&gt;new&lt;/span&gt; DistanceServiceRef.DistanceServiceClient();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt;            proxy.GetDistanceCompleted+=(s2,ea2)=&amp;gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt;            {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt;                DistanceReader.LastDistance = ea2.Result;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt;            };&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt;            proxy.GetDistanceAsync();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt;        };&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt;        timer.Start();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt;    &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler&amp;lt;DistanceEventArgs&amp;gt; DistanceChanged;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnDistanceChanged(DistanceEventArgs e) &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (DistanceChanged!=&lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt;            DistanceChanged(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(DistanceReader), e);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; lastDistance;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; LastDistance&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 31: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 32: &lt;/span&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; lastDistance;}&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 33: &lt;/span&gt;        set &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 34: &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 35: &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (lastDistance!=&lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 36: &lt;/span&gt;            {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 37: &lt;/span&gt;                lastDistance = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 38: &lt;/span&gt;                OnDistanceChanged(&lt;span class="kwrd"&gt;new&lt;/span&gt; DistanceEventArgs() { Distance=&lt;span class="kwrd"&gt;value&lt;/span&gt;});&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt;            }                &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt;        } &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 41: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 42: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This class calls the service (every 10 seconds) and raises an event whenever the distance changes. Now, how to show this ? Let's start by the VSM-approach.&amp;nbsp; But that is something I'll leave for part 2.&lt;/p&gt;
&lt;br/&gt;
&lt;a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="piekenpuil" data-related="u2u"&gt;Tweet&lt;/a&gt;&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Wed, 15 Jun 2011 23:15:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/06/15/Visual-State-Manager-or-rather-Behavior(part-1).aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=4bd05dfd-4632-442b-baed-7c83141b1de0</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=4bd05dfd-4632-442b-baed-7c83141b1de0</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/06/15/Visual-State-Manager-or-rather-Behavior(part-1).aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=4bd05dfd-4632-442b-baed-7c83141b1de0</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=12710d86-43f4-4a47-ad5d-de987f8c9f87</guid><link>http://blogs.u2u.be/michael/post/2011/05/01/Updating-WP7-live-tiles-without-push-notifications.aspx</link><category>Push Notifications</category><category>Silverlight</category><category>Windows Phone</category><title>Updating WP7 live tiles without push notifications</title><description>&lt;p&gt;While experimenting with push notifications for updating your live tiles, I found the ShellTileSchedule-class. It sounded interesting enough to play around with it.&lt;/p&gt;
&lt;p&gt;On MSDN I found following description for &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.shell.shelltileschedule(VS.92).aspx" target="_blank"&gt;this class&lt;/a&gt; : Creates an object which allows an application to schedule updates of its tile's background image.&amp;nbsp; The ShellTileSchedule has some properties like the recurrence and the interval. The interval is an enumeration which goes from hourly to monthly :&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=1.jpg"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="1" src="http://blogs.u2u.be/michael/image.axd?picture=1_thumb.jpg" alt="1" width="137" height="96" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another Property is the RemoteImageUri. Because of the word "Remote" I assume that the image has to be remote (that was a hard one &lt;img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://blogs.u2u.be/michael/image.axd?picture=wlEmoticon-smile.png" alt="Smile" /&gt;). So for testing this thing I first set up a website, with simply a png-image (62*62 &amp;ndash; I copied Background.png and changed it a bit with Paint). Let's set up our schedule. This has to be done in the Application_Launching:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Application_Launching(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, LaunchingEventArgs e)&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    sts = &lt;span class="kwrd"&gt;new&lt;/span&gt; ShellTileSchedule();&lt;/pre&gt;
&lt;pre&gt;    sts.Interval = UpdateInterval.&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    sts.Recurrence = UpdateRecurrence.Interval;&lt;/pre&gt;
&lt;pre class="alt"&gt;    sts.RemoteImageUri = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(String.Format(&lt;span class="str"&gt;"http://localhost:51177/Site/Tiles/1.png"&lt;/span&gt;, TileNr.ToString()));&lt;/pre&gt;
&lt;pre&gt;    sts.Start();&lt;/pre&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;After starting the application I had to wait for an hour before my tile changed. Changing the clock settings didn't do the job either, but after an hour, finally the tile changed.&lt;/p&gt;
&lt;p&gt;This could be useful for pulling tiles, instead of pushing. Get a tile every hour for showing the weather conditions in your area.&lt;/p&gt;
&lt;p&gt;Now about this "Remote"-thing. Can I use a local png-file for changing the tile this way ? My first try was to add a png-file, and than refer to it this way:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;sts.RemoteImageUri = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;"/LocalTile/5.png"&lt;/span&gt;,UriKind.Relative);&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;That was not good.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=2.jpg"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="2" src="http://blogs.u2u.be/michael/image.axd?picture=2_thumb.jpg" alt="2" width="244" height="45" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also tried it with "/TilesTest;component/LocalTile/5.png", but also no success. I needed to get the absolute path. In Silverlight I can use App.Current.Host.Source and Windows Phone is Silverlight, right. But I cannot use the Source-property here, although I can see it in my Locals-window:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=3.jpg"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="3" src="http://blogs.u2u.be/michael/image.axd?picture=3_thumb.jpg" alt="3" width="601" height="235" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;OK, another try : let's use this code:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;Uri uri = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="str"&gt;"file:///Applications//Install//27F6C4CB-1192-44AD-A970-635F12689A08//Install"&lt;/span&gt;),&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="str"&gt;"//LocalTile//5.png"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;sts.RemoteImageUri = uri;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;OK, I know it's not very useful, because every user that has this application, will also have another GUID. Still : I do it for serving science &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="http://blogs.u2u.be/michael/image.axd?picture=wlEmoticon-winkingsmile.png" alt="Winking smile" /&gt;. Result :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=4.jpg"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="4" src="http://blogs.u2u.be/michael/image.axd?picture=4_thumb.jpg" alt="4" width="244" height="47" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What happened to my GUID and stuff jQuery152010964315148992043_1315308924440 Last try, Let's simplify by using this :&lt;/p&gt;
&lt;pre class="csharpcode"&gt;Uri uri = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(
    &lt;span class="str"&gt;"file:///Applications//Install//27F6C4CB-1192-44AD-A970-635F12689A08//Install//LocalTile//5.png"&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And now I get this :&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=5.jpg"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="5" src="http://blogs.u2u.be/michael/image.axd?picture=5_thumb.jpg" alt="5" width="460" height="82" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OK, I quit. Remote indeed means Remote.&lt;/p&gt;
&lt;br/&gt;
&lt;a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="piekenpuil" data-related="u2u"&gt;Tweet&lt;/a&gt;&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Sun, 01 May 2011 09:59:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/05/01/Updating-WP7-live-tiles-without-push-notifications.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=12710d86-43f4-4a47-ad5d-de987f8c9f87</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=12710d86-43f4-4a47-ad5d-de987f8c9f87</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/05/01/Updating-WP7-live-tiles-without-push-notifications.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=12710d86-43f4-4a47-ad5d-de987f8c9f87</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=8679de70-1104-48a9-a62a-0af6fae4bc20</guid><link>http://blogs.u2u.be/michael/post/2011/04/28/Saving-an-Image-to-the-Pictures-Hub.aspx</link><category>Images</category><category>MediaLibrary</category><category>Silverlight</category><category>Windows Phone</category><category>XNA</category><title>Saving an Image to the Pictures Hub</title><description>&lt;p&gt;Something that will also be discussed during the upcoming Windows Phone course, here at U2U, is the cooperation between Silverlight for Windows Phone and XNA.&lt;/p&gt;
&lt;p&gt;At the end of my previous blog post, I was left with one more challenge: saving my modified picture to the Pictures Hub. Until shortly I thought that the only way of using the Pictures Hub was through the PhotoChooserTask or the CameraCaptureTask. Luckily I came across the MediaLibrary-class from the XNA-framework, who gives much more possibilities for accessing your pictures.&lt;/p&gt;
&lt;p&gt;To start I needed to add a reference to Microsoft.Xna.Framework. This results in an alarming message :&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb.png" alt="image" width="603" height="409" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At first I tried to do some experimenting with the MediaLibrary. Let&amp;rsquo;s start by simply getting the number of pictures I have on the emulator :&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;ml = &lt;span class="kwrd"&gt;new&lt;/span&gt; MediaLibrary();&lt;/pre&gt;
&lt;pre&gt;nrOfPics = ml.Pictures.Count;&lt;/pre&gt;
&lt;pre class="alt"&gt;MessageBox.Show(nrOfPics.ToString());&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;That works nice. The Medialibrary has several collection I can use, like Pictures, Songs, Genres,&amp;hellip;&lt;/p&gt;
&lt;p&gt;Next step : lets create a little slideshow-app for iterating through my pictures. I start out with a simple page :&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="ContentPanel"&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="12,0,12,0"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="523*"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="84*"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Image&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="image1"&lt;/span&gt; &lt;span class="attr"&gt;Stretch&lt;/span&gt;&lt;span class="kwrd"&gt;="Fill"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="grid1"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColumnDefinition&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColumnDefinition&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="&amp;amp;gt;&amp;amp;gt;"&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Column&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="btnGoForward"&lt;/span&gt; &lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="attr"&gt;Click&lt;/span&gt;&lt;span class="kwrd"&gt;="btnGoForward_Click"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="&amp;amp;lt;&amp;amp;lt;"&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="btnGoBack"&lt;/span&gt; &lt;span class="attr"&gt;Click&lt;/span&gt;&lt;span class="kwrd"&gt;="btnGoBack_Click"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The code looks like this :&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainPage : PhoneApplicationPage&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; nrOfPics;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; picNr = 0;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;    MediaLibrary ml;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;    BitmapImage img = &lt;span class="kwrd"&gt;new&lt;/span&gt; BitmapImage();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;    &lt;span class="rem"&gt;// Constructor&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; MainPage()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt;        InitializeComponent();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PhoneApplicationPage_Loaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt;        ml = &lt;span class="kwrd"&gt;new&lt;/span&gt; MediaLibrary();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt;        nrOfPics = ml.Pictures.Count;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt;        MessageBox.Show(nrOfPics.ToString());&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt;        &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt;        ShowImage();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ShowImage()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt;        img.SetSource(ml.Pictures[picNr].GetImage());&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt;        image1.Source = img;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnGoBack_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 31: &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (--picNr&amp;lt;0)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 32: &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 33: &lt;/span&gt;            picNr = nrOfPics - 1;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 34: &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 35: &lt;/span&gt;        ShowImage();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 36: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 37: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 38: &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnGoForward_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (++picNr&amp;gt;=nrOfPics)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 41: &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 42: &lt;/span&gt;            picNr = 0;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 43: &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 44: &lt;/span&gt;        ShowImage();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 45: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 46: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_1.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_1.png" alt="image" width="267" height="439" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let's now return to the application created during my previous blog post. In the "Save Img" code we opened another page that simply showed the image with copyright-message. Let's now change the loaded-event of the WrittenImage-page so we can save the image :&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;WriteableBitmap bmp = PhoneApplicationService.Current.State[&lt;span class="str"&gt;"bmp"&lt;/span&gt;] &lt;span class="kwrd"&gt;as&lt;/span&gt; WriteableBitmap;&lt;/pre&gt;
&lt;pre&gt;writtenImage.Source = bmp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;MediaLibrary ml = &lt;span class="kwrd"&gt;new&lt;/span&gt; MediaLibrary();&lt;/pre&gt;
&lt;pre class="alt"&gt;Stream stream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();&lt;/pre&gt;
&lt;pre&gt;bmp.SaveJpeg(stream, bmp.PixelWidth, bmp.PixelHeight, 0, 100);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;ml.SavePicture(&lt;span class="str"&gt;"u2uPic.jpg"&lt;/span&gt;, stream);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;MessageBox.Show(&lt;span class="str"&gt;"Picture Saved..."&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The SaveJpeg-method from WritableBitmap gives me a Stream containing the image in jpg-format. SavePicture saves the image in the MediaLibrary. However: it doesn't work ! It took me some time to find out why: It seems that the position of the stream remains at the end-position. Insert this line of code just before the SavePicture-call to make it work:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;stream.Position=0;&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;It's working !! Cool.&lt;/p&gt;
&lt;p&gt;Next step: let's deploy these two apps to my device and test. Not working ! How the hell is that possible ? Retesting in the emulator : works fine. Retesting on device: not working. Aaaaargh !! Disconnecting my device, going over to a colleague to ventilate my frustration and see that all of a sudden it is working !! Seems that for this thing to work, it needs to be disconnected from the PC.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a class="twitter-share-button" href="http://twitter.com/share" data-related="u2u" data-via="piekenpuil" data-count="vertical"&gt;Tweet&lt;/a&gt;&lt;/p&gt;
&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Thu, 28 Apr 2011 10:21:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/04/28/Saving-an-Image-to-the-Pictures-Hub.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=8679de70-1104-48a9-a62a-0af6fae4bc20</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">5</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=8679de70-1104-48a9-a62a-0af6fae4bc20</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/04/28/Saving-an-Image-to-the-Pictures-Hub.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=8679de70-1104-48a9-a62a-0af6fae4bc20</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=5df48b3b-8429-4ae8-9050-df54f1fe5852</guid><link>http://blogs.u2u.be/diederik/post/2011/12/15/Building-WPF-forms-without-GDI-decoration.aspx</link><category>WPF</category><title>Building WPF forms without GDI decoration</title><description>&lt;p&gt;This article describes a base class for WPF windows. It hides all GDI chrome, without losing functionality. WPF promises entire freedom in look-and-feel of your application. In its standard configuration, however, a WPF Window is still hosted in a classic GDI-based WinForm. Its border and header are rendered by the operating system. This takes away a lot of styling opportunities: things like a custom close button or rounded borders become impossible. On top of that, the GDI chrome eats a lot of pixels away from your application. That waste of space becomes obvious if you use custom controls like the popular Ribbon.&lt;/p&gt;
&lt;p&gt;I created the &lt;em&gt;NoGdiWindow&lt;/em&gt; base class to solve all of these problems. The following screenshots from the attached sample application show the same WPF window - with and without using the base class. If you prefer the left window, you may stop reading now &lt;img title="Smile" src="http://blogs.u2u.be/diederik/editors/tiny_mce_3_4_3_1/plugins/emotions/img/smiley-smile.gif" alt="Smile" border="0" /&gt;.&lt;/p&gt;
&lt;table style="width: 100%;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fbefore.PNG" alt="before" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fafter.PNG" alt="after" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Hiding the GDI header&lt;/h2&gt;
&lt;p&gt;Setting the WindowStyle to &lt;em&gt;System.Windows.WindowStyle.None&lt;/em&gt; removes the window header:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;this.WindowStyle = System.Windows.WindowStyle.None;&lt;/pre&gt;
&lt;p&gt;You obviously loose the icon, the title and the minimize, maximize/restore, and close buttons. These are relatively easy to recover: the &lt;em&gt;NoGdiWindow&lt;/em&gt; class contains the necessary commands and properties to rapidly create custom buttons in XAML. Here's an overview of the relevant class members:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fHeaderMembers.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Here's an example of a custom button:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Button ToolTip="Maximize" Command="{Binding ElementName=Window, Path=MaximizeCommand}" Visibility="{Binding ElementName=Window, Path=MaximizeButtonVisibility}" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;Restoring the buttons is not sufficient: the beheaded window doesn't have a region anymore by which you can drag it, or minimize/restore by double-clicking. When using &lt;em&gt;NoGdiWindow&lt;/em&gt;, all you need to do is create a region at the appropriate position and hook in&amp;nbsp;the &lt;em&gt;MouseLeftButtonDown&lt;/em&gt; event handler:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Grid MouseLeftButtonDown="Header_MouseLeftButtonDown" Background="Transparent" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="32" Margin="80 0 0 0"&amp;gt;&lt;/pre&gt;
&lt;p&gt;You may want to implement this functionality as a behavior instead of an event handler.&lt;/p&gt;
&lt;p&gt;In the following screenshot, the region is highlighted. The left margin of 80 pixels keeps the ribbon's application menu accessible:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fheader.PNG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;When you use &lt;em&gt;WindowStyle.None&lt;/em&gt; your window will overlap the task bar if it's maximized. I personally don't mind at all. If you (or our end users) have a problem with this, you find some possible workarounds &lt;a href="http://blogs.msdn.com/b/llobo/archive/2006/08/01/maximizing-window-_2800_with-windowstyle_3d00_none_2900_-considering-taskbar.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Hiding the GDI border&lt;/h2&gt;
&lt;p&gt;You can make the remaining GDI border disappear by setting the &lt;em&gt;AllowsTransparency&lt;/em&gt; property to &lt;em&gt;True&amp;nbsp;&lt;/em&gt;and your form's background to &lt;em&gt;Transparent&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;this.AllowsTransparency = true;
this.Background = new SolidColorBrush(Colors.Transparent);&lt;/pre&gt;
&lt;p&gt;This allows you to provide a rounded border around your window, or create an irregular shape. Unfortunately the native GDI border also hosts the resize handles, so you need to get these back. The &lt;em&gt;NoGdiWindow&lt;/em&gt; draws a series of rectangles on the form, with the necessary mouse down handlers. Therefor, your main panel should be a &lt;em&gt;Grid.&lt;/em&gt;&amp;nbsp;In the following screenshot these rectangles are highlighted:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fResizeHandles.PNG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;When the window is opened, it fetches its Win32 handle:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;this.hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;&lt;/pre&gt;
&lt;p&gt;When you hold the left mouse button inside one of the resize rectangles, the resize message is sent to the operating system through a &lt;a href="http://pinvoke.net/default.aspx/user32.SendMessage" target="_blank"&gt;SendMessage&lt;/a&gt; call:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;SendMessage(this.hwndSource.Handle, 0x112, (IntPtr)(61440 + direction), IntPtr.Zero);&lt;/pre&gt;
&lt;p&gt;The resize code is based on &lt;a href="http://digitalmoosetracks.com/blog/wpf-transparent-window-with-resizing" target="_blank"&gt;this article&lt;/a&gt; by Joshua. Here's an overview of the relevant class members:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fResizeMembers.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;AllowsTransparency&lt;/em&gt; is&amp;nbsp;implemented through&amp;nbsp;a technique called 'layered windows'. If you type these keywords in your &lt;span style="color: #808080;"&gt;[insert favorite search engine here]&lt;/span&gt;, you'll immediately see that there are&amp;nbsp;some issues under Windows XP. Your user interface may run without hardware acceleration on older XP releases, and it definitely ruins some WPF controls (tooltips, popups, comboboxes). There there are also issues with &lt;em&gt;WindowsFormHost&lt;/em&gt; controls, regardless of the operating system you use. &lt;em&gt;NoGdiWindow&lt;/em&gt; is aware or this, and has some defensive code around the property:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;if ((Environment.OSVersion.Version.Major &amp;gt; 5) &amp;amp; (!this.UsesWindowsFormsHost))
 {
    // Activate Transparency
  // ...
 }&lt;/pre&gt;
&lt;h2&gt;Code&lt;/h2&gt;
&lt;p&gt;Here's the sample project :&lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2011%2f12%2fU2UConsult.WPF.NoGdiWindow.zip"&gt;U2UConsult.WPF.NoGdiWindow.zip (1.31 mb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</description><pubDate>Thu, 15 Dec 2011 01:08:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2011/12/15/Building-WPF-forms-without-GDI-decoration.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=5df48b3b-8429-4ae8-9050-df54f1fe5852</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=5df48b3b-8429-4ae8-9050-df54f1fe5852</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2011/12/15/Building-WPF-forms-without-GDI-decoration.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=5df48b3b-8429-4ae8-9050-df54f1fe5852</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=154295f8-6968-4dd0-b029-b95bc95fa63b</guid><link>http://blogs.u2u.be/diederik/post/2011/04/24/Using-a-server-side-Prism-module-catalog-in-Silverlight.aspx</link><category>Silverlight</category><title>Using a server side Prism module catalog in Silverlight</title><description>&lt;p&gt;Prism 4.0, Managed Extensibility Framework, and Silverlight 4.0 provide an ideal combination to develop robust and flexible enterprise applications. This article explains&amp;nbsp;how you can&amp;nbsp;keep the Prism module catalog in such an application on the server side. In most of the &lt;a href="http://msdn.microsoft.com/en-us/library/gg430879(v=PandP.40).aspx"&gt;Prism Quickstarts&lt;/a&gt;, the module catalog is embedded in the shell:&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fcatalog_before.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The application class starts the bootstrapper:&lt;/p&gt;
&lt;div style="color: black; background: aliceblue;font-family: Courier New; font-size: 9pt; margin: 5px; padding: 5px; border-style: dashed; border-width: 1px; border-color:steelblue"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Application_Startup(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;StartupEventArgs&lt;/span&gt; e)
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;ApplicationBootstrapper&lt;/span&gt; bootstrapper = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ApplicationBootstrapper&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bootstrapper.Run();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The bootstrapper builds the catalog from the local file:&lt;/p&gt;
&lt;div style="color: black; background: aliceblue;font-family: Courier New; font-size: 9pt; margin: 5px; padding: 5px; border-style: dashed; border-width: 1px; border-color:steelblue"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IModuleCatalog&lt;/span&gt; CreateModuleCatalog()
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;ModuleCatalog&lt;/span&gt; catalog = Microsoft.Practices.Prism.Modularity.&lt;span style="color: #2b91af;"&gt;ModuleCatalog&lt;/span&gt;.CreateFromXaml(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Prism.Sample.Shell;component/Modules/ModuleCatalog.xaml"&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;UriKind&lt;/span&gt;.Relative));&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; catalog;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Unfortunately, this setup requires a rebuild and a redeploy of the shell application whenever a change in the catalog is needed (e.g. to add an extra module, or to remove a buggy module). In most -if not all- real-world scenarios it makes more sense to place the catalog in an area that allows easy modification. The following solution has the catalog in a file on the server side, but you can easily go for other storage locations, like a database table, a WCF service or a SharePoint list. Here's where the file is kept:&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fcatalog_after.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The bootstrapper gets an extra constructor that takes a stream:&lt;/p&gt;
&lt;div style="color: black; background: aliceblue;font-family: Courier New; font-size: 9pt; margin: 5px; padding: 5px; border-style: dashed; border-width: 1px; border-color:steelblue"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Stream&lt;/span&gt; stream;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; ApplicationBootstrapper(&lt;span style="color: #2b91af;"&gt;Stream&lt;/span&gt; stream)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.stream = stream;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This stream is used to build the catalog:&lt;/p&gt;
&lt;div style="color: black; background: aliceblue;font-family: Courier New; font-size: 9pt; margin: 5px; padding: 5px; border-style: dashed; border-width: 1px; border-color:steelblue"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IModuleCatalog&lt;/span&gt; CreateModuleCatalog()
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;ModuleCatalog&lt;/span&gt; catalog = Microsoft.Practices.Prism.Modularity.&lt;span style="color: #2b91af;"&gt;ModuleCatalog&lt;/span&gt;.CreateFromXaml(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.stream);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; catalog;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;On application startup, the file is read, wrapped in a stream, and handed over to the bootstrapper:&lt;/p&gt;
&lt;div style="color: black; background: aliceblue;font-family: Courier New; font-size: 9pt; margin: 5px; padding: 5px; border-style: dashed; border-width: 1px; border-color:steelblue"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Application_Startup(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;StartupEventArgs&lt;/span&gt; e)
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;WebClient&lt;/span&gt; client = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WebClient&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.OpenReadCompleted += &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Client_OpenReadCompleted;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.OpenReadAsync(&lt;span style="color: blue;"&gt;new&lt;/span&gt; System.&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;@"Modules\ModuleCatalog.xaml"&lt;/span&gt;, System.&lt;span style="color: #2b91af;"&gt;UriKind&lt;/span&gt;.Relative));&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Client_OpenReadCompleted(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;OpenReadCompletedEventArgs&lt;/span&gt; e)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;ApplicationBootstrapper&lt;/span&gt; bootstrapper = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ApplicationBootstrapper&lt;/span&gt;(e.Result);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bootstrapper.Run();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The following two projects demonstrate both approaches. The application is a small Prism-MEF-Silverlight tutorial application that I wrote a couple of months ago. Here's how it looks like:&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fapplication.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Here's the project before and after the modification (it&amp;nbsp;contains the Prism dll's, so you might need to unblock these):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Catalog in the Shell xap: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2011%2f4%2fU2UConsult.Prism.Sample.Application.1.zip"&gt;U2UConsult.Prism.Sample.Application.1.zip (1,99 mb)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Catalog on the server: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2011%2f4%2fU2UConsult.Prism.Sample.Application.2.zip"&gt;U2UConsult.Prism.Sample.Application.2.zip (1,03 mb)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enjoy !&lt;/p&gt;</description><pubDate>Sun, 24 Apr 2011 09:03:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2011/04/24/Using-a-server-side-Prism-module-catalog-in-Silverlight.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=154295f8-6968-4dd0-b029-b95bc95fa63b</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=154295f8-6968-4dd0-b029-b95bc95fa63b</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2011/04/24/Using-a-server-side-Prism-module-catalog-in-Silverlight.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=154295f8-6968-4dd0-b029-b95bc95fa63b</wfw:commentRss></item></channel></rss>
