<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.irritatedvowel.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>irritatedVowel.com</title><link>http://community.irritatedvowel.com/blogs/default.aspx</link><description>irritatedVowel.com</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 (Build: 60809.935)</generator><item><title>How to Resize a Silverlight 2 App and Keep the Same Aspect Ratio</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/07/04/How-to-Resize-a-Silverlight-2-App-and-Keep-the-Same-Aspect-Ratio.aspx</link><pubDate>Sat, 05 Jul 2008 03:28:50 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2576</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;A similar question just popped up on a list I’m on, so I thought I’d whip up a quick example on how to resize a Silverlight application while keeping the same aspect ratio and centering the content.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/HowtoResizeaSilverlight2AppandKeeptheSam_14A31/image.png" target="_blank"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="203" alt="image" src="http://www.irritatedvowel.com/pub/blog/HowtoResizeaSilverlight2AppandKeeptheSam_14A31/image_thumb.png" width="244" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://www.irritatedvowel.com/pub/blog/HowtoResizeaSilverlight2AppandKeeptheSam_14A31/image_3.png" target="_blank"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="203" alt="image" src="http://www.irritatedvowel.com/pub/blog/HowtoResizeaSilverlight2AppandKeeptheSam_14A31/image_thumb_3.png" width="104" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.irritatedvowel.com/pub/blog/HowtoResizeaSilverlight2AppandKeeptheSam_14A31/image_4.png" target="_blank"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="100" alt="image" src="http://www.irritatedvowel.com/pub/blog/HowtoResizeaSilverlight2AppandKeeptheSam_14A31/image_thumb_4.png" width="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The key to resizing is to use a ScaleTransform on the LayoutRoot of your main page. Here’s the important part of the xaml for the page. The key part is the “Grid.RenderTransform” section and the RenderTransformOrigin for the grid. In the latter, 0.5, 0.5 tells the engine that any render transforms should originate in the center of the grid. The former we name “PageScale” to allow us to easily manipulate its ScaleX and ScaleY properties from code.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UserControl &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;PeteBrown.SilverlightScalingExample.Page&amp;quot;
    &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot; 
    &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot; 
    &amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;    
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;LayoutRoot&amp;quot; 
          &lt;/span&gt;&lt;span style="color:red;"&gt;Background&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Cornsilk&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;ShowGridLines&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;True&amp;quot;
          &lt;/span&gt;&lt;span style="color:red;"&gt;Width&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;400&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;Height&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;300&amp;quot; 
          &lt;/span&gt;&lt;span style="color:red;"&gt;RenderTransformOrigin&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;0.5 0.5&amp;quot;&amp;gt;
        
&lt;strong&gt;        &amp;lt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&lt;strong&gt;Grid.RenderTransform&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ScaleTransform &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;PageScale&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;ScaleX&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;1&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;ScaleY&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;=&amp;quot;1&amp;quot;/&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.RenderTransform&lt;/span&gt;&lt;/strong&gt;&lt;span style="color:blue;"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;
        
…&lt;/span&gt;&lt;span style="color:blue;"&gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UserControl&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Note also in the markup that I have left the grid lines on. This helps you visualize and debug resizing behavior especially when working with complex layouts that combine true expanding grids along with transforms and combinations of other panels.&lt;/p&gt;

&lt;p&gt;Here’s the code. It is pretty straight-forward. I set the desired aspect ratio as a constant and then resize against that using the new SizeChanged event.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public partial class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Page &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;UserControl
&lt;/span&gt;{
    &lt;span style="color:green;"&gt;// this is the aspect ratio we want to maintain
    // you can specify this all sorts of ways, but the
    // easiest is to take the original size and divide
    // X by Y (4:3 or 1.333 in this case)
    &lt;/span&gt;&lt;span style="color:blue;"&gt;private const double &lt;/span&gt;_originalWidth = 400;
    &lt;span style="color:blue;"&gt;private const double &lt;/span&gt;_originalHeight = 300;
    &lt;span style="color:blue;"&gt;private const double &lt;/span&gt;_originalAspectRatio = 
        _originalWidth / _originalHeight;

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;Page()
    {
        InitializeComponent();

        &lt;span style="color:green;"&gt;// wire up the event handler. This is a great addition
        // to silverlight, as you used to have to hook into the
        // browser event yourself
        &lt;/span&gt;SizeChanged += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SizeChangedEventHandler&lt;/span&gt;(Page_SizeChanged);
    }

    &lt;span style="color:blue;"&gt;void &lt;/span&gt;Page_SizeChanged(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;SizeChangedEventArgs &lt;/span&gt;e)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(e.NewSize.Width &amp;lt; _originalWidth || 
            e.NewSize.Height &amp;lt; _originalHeight)
        {
            &lt;span style="color:green;"&gt;// don't shrink
            &lt;/span&gt;PageScale.ScaleX = 1.0;
            PageScale.ScaleY = 1.0;
        }
        &lt;span style="color:blue;"&gt;else
        &lt;/span&gt;{
            &lt;span style="color:green;"&gt;// resize keeping aspect ratio the same
            &lt;/span&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;(e.NewSize.Width / e.NewSize.Height &amp;gt; _originalAspectRatio)
            {
                &lt;span style="color:green;"&gt;// height is our constraining property
                &lt;/span&gt;PageScale.ScaleY = e.NewSize.Height / _originalHeight;
                PageScale.ScaleX = PageScale.ScaleY;
            }
            &lt;span style="color:blue;"&gt;else
            &lt;/span&gt;{
                &lt;span style="color:green;"&gt;// either width is our constraining property, or the user
                // managed to nail our aspect ratio perfectly.
                &lt;/span&gt;PageScale.ScaleX = e.NewSize.Width / _originalWidth;
                PageScale.ScaleY = PageScale.ScaleX;
            }
        }
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;In this example, I decided to restrict the user from resizing to a size smaller than the original size of the application. That is often but not always desirable. The check is easy enough to remove should you wish to allow a tiny thumbnail application.&lt;/p&gt;

&lt;p&gt;If you have bitmap assets, resizing may not be as fluid. Experiment with the largest version you can include in your xap while keeping a reasonable download size.&lt;/p&gt;

&lt;p&gt;Full &lt;a href="http://www.irritatedvowel.com/pub/blog/PeteBrown.SilverlightScalingExample.zip" target="_blank"&gt;source code available here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.irritatedvowel.com/silverlight/Scaling/PeteBrown.SilverlightScalingExampleTestPage.html" target="_blank"&gt;Running example here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2576" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Are You Using WPF as Well? Let Me Know!</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/07/01/Are-You-Using-WPF-as-Well_3F00_-Let-Me-Know_2100_.aspx</link><pubDate>Tue, 01 Jul 2008 17:46:36 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2556</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>11</slash:comments><description>&lt;p&gt;For those of you working with &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight 2&lt;/a&gt;, are you also working on &lt;a href="http://windowsclient.net" target="_blank"&gt;WPF&lt;/a&gt; projects? If so, what types of things are you building in WPF? Are you sharing source and/or team talent across the two technologies? What about readers doing only one or the other?&lt;/p&gt;  &lt;p&gt;Either way, drop me a note in the comments below. I’m interested in getting a feel for crossover between the two communities and reasons for targeting one or both technologies in order to help improve content.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2556" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Using Pub/Sub and the Observer Pattern in Silverlight 2 (Part 2 of 2) Navigation</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/30/Using-Pub_2F00_Sub-and-the-Observer-Pattern-in-Silverlight-2-_2800_Part-2-of-2_2900_-Navigation.aspx</link><pubDate>Tue, 01 Jul 2008 03:26:45 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2537</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;In the previous two parts of this article (I had planned only 2 parts total, but this ended up a three-part article), I explained how to use Pub/Sub and the EventBus for chaining service calls in &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight 2&lt;/a&gt; applications. You can access those articles here:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/26/Using-Pub_2F00_Sub-and-the-Observer-Pattern-in-Silverlight-2-_2800_Part-1-of-2_2900_-_2D00_-Async-Service-Call-Chaining.aspx" target="_blank"&gt;Part 1: Async Service Call Chaining&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/27/Using-Pub_2F00_Sub-and-the-Observer-Pattern-in-Silverlight-2-_2800_Part-1.5-of-2_2900_-More-on-Service-Call-Chaining.aspx" target="_blank"&gt;Part 2: More on Service Call Chaining&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In this part, I'll cover how I use this same pattern for UI navigation in a Silverlight application. &lt;/p&gt;  &lt;h4&gt;Problem&lt;/h4&gt;  &lt;p&gt;You have multiple &amp;quot;screens&amp;quot; in the application and you can navigate to them in a variety of ways. For example, Screen 1 could contains links to screens 2, 3 and 4 and Screen 6 could contain a link back to Screen 3. Add to that the idea that a couple of the screens screens could, say, pop up a media player overlay and you see where the code could get messy quickly.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/UsingPubSubandtheObserverPatterninSilver_11CE0/image.png" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:5px;border-right-width:0px;" height="297" alt="image" src="http://www.irritatedvowel.com/pub/blog/UsingPubSubandtheObserverPatterninSilver_11CE0/image_thumb.png" width="509" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;A Little Background&lt;/h4&gt;  &lt;p&gt;It may help visualize this a bit if I describe the UI in the application I'm building. The application has the following screens at this point:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Home Screen      &lt;ul&gt;       &lt;li&gt;Subset of Events Listing and link to Events Page &lt;/li&gt;        &lt;li&gt;Subset of Blog Listing and link to Blogs Page &lt;/li&gt;        &lt;li&gt;Subset of Media List and link to Media Page &lt;/li&gt;        &lt;li&gt;Link to play a featured video (shows media player overlay) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Events Listing Page      &lt;ul&gt;       &lt;li&gt;List of local events &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Blog Listing Page (General Page)     &lt;ul&gt;       &lt;li&gt;List of blog posts &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Media Listing Page &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Videos and screencasts &lt;/li&gt;      &lt;li&gt;Link to show Media Player overlay &lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;User Options Page&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Various options the user can set&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Media Player Overlay &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Slides out over current content and plays a video. &lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Loading Screen&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Last screen in the slider. Just contains a “loading” animation&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;The implementation of the screens is interesting. Home, Events, Blog, Media, Loading and Options are all contained in a single stack panel that slides right or left on the screen to bring the selected screen into focus. Think of it like a filmstrip, or a simple 2d carousel (but with hard stops at the end) containing screens.&lt;/p&gt;  &lt;p&gt;When the application goes live, I’ll post a link here and you’ll be able to see the animation in action. It was pretty simple to do:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UserControl &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;AppliedIS.PartnerHuddle.Screens.PageScroller&amp;quot;
    &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot; 
    &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot; 
    &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;screens&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;clr-namespace:AppliedIS.PartnerHuddle.Screens&amp;quot;
    &lt;/span&gt;&lt;span style="color:red;"&gt;Width&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;640&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;Height&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;400&amp;quot;&amp;gt;

    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UserControl.Resources&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Storyboard &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;ScrollToPageStoryboard&amp;quot;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DoubleAnimationUsingKeyFrames 
                &lt;/span&gt;&lt;span style="color:red;"&gt;BeginTime&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;00:00:00&amp;quot; 
                &lt;/span&gt;&lt;span style="color:red;"&gt;Storyboard.TargetName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;PageContainer&amp;quot; 
                &lt;/span&gt;&lt;span style="color:red;"&gt;Storyboard.TargetProperty&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;(Canvas.Left)&amp;quot;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SplineDoubleKeyFrame 
                    &lt;/span&gt;&lt;span style="color:red;"&gt;KeyTime&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;00:00:00.8000000&amp;quot; 
                    &lt;/span&gt;&lt;span style="color:red;"&gt;Value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;0&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;ScrollToPageStoryboardTargetX&amp;quot;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SplineDoubleKeyFrame.KeySpline&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;KeySpline &lt;/span&gt;&lt;span style="color:red;"&gt;ControlPoint1&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;0,0.009&amp;quot; 
                                   &lt;/span&gt;&lt;span style="color:red;"&gt;ControlPoint2&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;0,0.989&amp;quot;/&amp;gt;
                    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SplineDoubleKeyFrame.KeySpline&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SplineDoubleKeyFrame&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DoubleAnimationUsingKeyFrames&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Storyboard&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UserControl.Resources&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;

    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;LayoutRoot&amp;quot;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Canvas &lt;/span&gt;&lt;span style="color:red;"&gt;Width&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;600&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;Height&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;400&amp;quot;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel &lt;/span&gt;&lt;span style="color:red;"&gt;Orientation&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Horizontal&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;PageContainer&amp;quot; 
                        &lt;/span&gt;&lt;span style="color:red;"&gt;Canvas.Left&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;0&amp;quot;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;screens&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;HomePage &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;HomePage&amp;quot; /&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;screens&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;EventsPage &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;EventsPage&amp;quot; /&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;screens&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MediaPage &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;MediaPage&amp;quot; /&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;screens&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;GeneralPage &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;GeneralPage&amp;quot; /&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;screens&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UserSettingsPage &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;UserSettingsPage&amp;quot; /&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;screens&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DataLoadingPage &lt;/span&gt;&lt;span style="color:red;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;DataLoadingPage&amp;quot; /&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Canvas.Clip&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RectangleGeometry &lt;/span&gt;&lt;span style="color:red;"&gt;Rect&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;0 0 600 400&amp;quot; /&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Canvas.Clip&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Canvas&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;            
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UserControl&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Here’s a subset of the scroller code in the scrolling screen container/panel:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private void &lt;/span&gt;ScrollToPage(&lt;span style="color:#2b91af;"&gt;UserControl &lt;/span&gt;page)
{
    &lt;span style="color:blue;"&gt;int &lt;/span&gt;i = PageContainer.Children.IndexOf(page);

    &lt;span style="color:blue;"&gt;if &lt;/span&gt;(i &amp;lt; 0)
    {
        &lt;span style="color:blue;"&gt;throw new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Specified page is not contained in the scrollable container.&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;page&amp;quot;&lt;/span&gt;);
    }
    &lt;span style="color:blue;"&gt;else
    &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;double &lt;/span&gt;currentPosition = 
            (&lt;span style="color:blue;"&gt;double&lt;/span&gt;)PageContainer.GetValue(&lt;span style="color:#2b91af;"&gt;Canvas&lt;/span&gt;.LeftProperty);
        &lt;span style="color:blue;"&gt;double &lt;/span&gt;newPosition = i * page.Width *-1;    &lt;span style="color:green;"&gt;// ASSUMPTION: All pages are the same width


        &lt;/span&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;(ScrollToPageStoryboard.GetCurrentState() == &lt;span style="color:#2b91af;"&gt;ClockState&lt;/span&gt;.Active)
            ScrollToPageStoryboard.Stop();

        &lt;span style="color:green;"&gt;// build storyboard to scroll to that page
        &lt;/span&gt;ScrollToPageStoryboardTargetX.Value = newPosition;
        ScrollToPageStoryboard.Begin();

    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h4&gt;My Solution - A Specialized Event Bus&lt;/h4&gt;

&lt;p&gt;I don't deal with data here at all, this is solely a navigation and screen presentation pattern, so I'm not offering up a full &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller" target="_blank"&gt;MVC&lt;/a&gt; (or &lt;a href="http://en.wikipedia.org/wiki/Model_View_Presenter" target="_blank"&gt;MVP&lt;/a&gt;) solution. I have nothing against MVC, I just decided against building that type of framework for this application (and some others) I've built. Those patterns are also much more comprehensive than what I have here. That said, I certainly borrowed some concepts. &lt;/p&gt;

&lt;p&gt;The other point I'd like to make is that this solution does not attempt to solve the &amp;quot;can screen x be shown now&amp;quot; problem yet. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/UsingPubSubandtheObserverPatterninSilver_11CE0/image_3.png" target="_blank"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="522" alt="image" src="http://www.irritatedvowel.com/pub/blog/UsingPubSubandtheObserverPatterninSilver_11CE0/image_thumb_3.png" width="519" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;In the diagram, I left out the lines connecting the scrolling screen container from the screens themselves, as that would just be clutter. Those lines will become more important in the future when I add in events to indicate when the screen is actually displayed, and when we are about to nav off the screen (for validation purposes)&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:green;"&gt;// This enum needs to contain all possible nav targets for the application
&lt;/span&gt;&lt;span style="color:blue;"&gt;public enum &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NavigationScreenTarget
&lt;/span&gt;{
    LoadingScreen,
    HomePage,
    EventsPage,
    MediaPage,
    GeneralPage,
    UserOptionsPage
}

&lt;span style="color:green;"&gt;// Event arguments for the navigation events
&lt;/span&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NavigationEventArgs &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;EventArgs
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NavigationScreenTarget &lt;/span&gt;_target;
    &lt;span style="color:blue;"&gt;private bool &lt;/span&gt;_instantaneous = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;NavigationEventArgs(&lt;span style="color:#2b91af;"&gt;NavigationScreenTarget &lt;/span&gt;target, &lt;span style="color:blue;"&gt;bool &lt;/span&gt;instantaneous)
    {
        _target = target;
        _instantaneous = instantaneous;
    }

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NavigationScreenTarget &lt;/span&gt;Target
    {
        &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return &lt;/span&gt;_target; }
    }

    &lt;span style="color:blue;"&gt;public bool &lt;/span&gt;InstantaneousNavigation
    {
        &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return &lt;/span&gt;_instantaneous; }
    }

}

&lt;span style="color:green;"&gt;// Navigation controller class
&lt;/span&gt;&lt;span style="color:blue;"&gt;public static class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NavigationController
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public static event &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;NavigationEventArgs&lt;/span&gt;&amp;gt; NavigateToScreen;
    &lt;span style="color:blue;"&gt;public static event &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler &lt;/span&gt;ShowMediaPlayer;
    &lt;span style="color:blue;"&gt;public static event &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler &lt;/span&gt;HideMediaPlayer;


    &lt;span style="color:green;"&gt;// This tell the target to navigate to the screen using
    // the default behavior (animated, typically)
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static void &lt;/span&gt;NotifyNavigateToScreen(&lt;span style="color:#2b91af;"&gt;NavigationScreenTarget &lt;/span&gt;target)
    {
        NotifyNavigateToScreen(target, &lt;span style="color:blue;"&gt;false&lt;/span&gt;);
    }

    &lt;span style="color:green;"&gt;// this tells the target to navigate to the screen with no
    // transition animation
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static void &lt;/span&gt;NotifyNavigateToScreen(
        &lt;span style="color:#2b91af;"&gt;NavigationScreenTarget &lt;/span&gt;target, &lt;span style="color:blue;"&gt;bool &lt;/span&gt;instaneous)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(NavigateToScreen != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
            NavigateToScreen(&lt;span style="color:blue;"&gt;null&lt;/span&gt;, 
                &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;NavigationEventArgs&lt;/span&gt;(target, instaneous));
    }


    &lt;span style="color:green;"&gt;// specialized navigation events

    &lt;/span&gt;&lt;span style="color:blue;"&gt;public static void &lt;/span&gt;NotifyShowMediaPlayer()
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(ShowMediaPlayer != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
            ShowMediaPlayer(&lt;span style="color:blue;"&gt;null&lt;/span&gt;, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;());
    }

    &lt;span style="color:blue;"&gt;public static void &lt;/span&gt;NotifyHideMediaPlayer()
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(HideMediaPlayer != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
            HideMediaPlayer(&lt;span style="color:blue;"&gt;null&lt;/span&gt;, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;());
    }


}&lt;/pre&gt;

&lt;p&gt;In this case, I called the class NavigationController. Other names like ScreenPresenter would certainly seem to fit. I haven’t come up with a reasonable name that doesn’t imply MVC/MVP, so if you come up with something, be sure to post it in the comments here.&lt;/p&gt;

&lt;p&gt;I used the word “Notify” instead of “On” for the method names as this was an instructional event, as opposed to informational. I could have gone all old windows and called it “PostXEvent” or something, but that just didn’t feel right either.&lt;/p&gt;

&lt;p&gt;I also included an example of a specialized event (NotifyShowMediaPlayer). I did that one differently from the normal navigation because it is an overlay “window”, not a real navigation target in the scrolling screen container.&lt;/p&gt;

&lt;p&gt;When this project is complete, I’ll extract the interesting bits, like this, and post an end-to-end example that uses the Navigation, EventBus, Scroller, and other bits. In the mean time, I hope these three posts have given you some ideas for how to handle navigation and async communications in your own applications.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2537" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Patterns/default.aspx">Patterns</category></item><item><title>Silverlight DevNuggets Episode 2 is Now Up</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/30/Silverlight-DevNuggets-Episode-2-is-Now-Up.aspx</link><pubDate>Tue, 01 Jul 2008 01:31:35 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2535</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/gduthie" target="_blank"&gt;Andrew Duthie&lt;/a&gt; just published my second DevNuggets episode. In this installment, titled Styling 101, I cover the basics of styling Silverlight controls. The videos are intended to be quick, short installments following a theme starting from the very basics and getting gradually more advanced.&lt;/p&gt;  &lt;p&gt;You can view the video &lt;a href="http://blogs.msdn.com/gduthie/archive/2008/06/30/new-devnugget-silverlight-styling-101.aspx" target="_blank"&gt;here&lt;/a&gt;. I hope you find it useful.&lt;/p&gt;  &lt;p&gt;For the curious, I use the following tools when building these videos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.techsmith.com/camtasia.asp" target="_blank"&gt;Camtasia 5.1&lt;/a&gt; – this is the standard for screen capture software&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/expression/products/overview.aspx?key=encoder" target="_blank"&gt;Expression Encoder 2&lt;/a&gt; – I use this and its new optimized Screen encoding settings in order to produce the best quality Silverlight video in the least amount of space. I also generate the player using one of the pre-defined templates.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://silverlight.live.com/" target="_blank"&gt;Microsoft Silverlight Streaming by Windows Live&lt;/a&gt; – This is where the video is hosted, for free even.&lt;/li&gt;    &lt;li&gt;Visual Studio 2008, &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight 2&lt;/a&gt; Beta 2&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I record and publish at 1024x768, so don’t be shy about hitting that full-screen button.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2535" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/DevNuggets/default.aspx">DevNuggets</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Webcasts/default.aspx">Webcasts</category></item><item><title>Silverlight Control Builder Contest ‘08</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/29/Silverlight-Control-Builder-Contest-_1820_08.aspx</link><pubDate>Sun, 29 Jun 2008 22:05:00 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2525</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;&lt;a href="http://gosilverlight.org/" target="_blank"&gt;&lt;img align="left" alt="image" border="0" height="150" src="http://www.irritatedvowel.com/pub/blog/SilverlightControlBuilderContest08_FE81/image.png" style="margin:5px;border-width:0px;" title="image" width="240" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;The &lt;a href="http://gosilverlight.org/Default.aspx" target="_blank"&gt;Silverlight Control Builder Contest &amp;lsquo;08&lt;/a&gt; has started! Build a compelling &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight 2&lt;/a&gt; control and win some cool stuff! This is a great contest to see what you developers in the community can kick out in Silverlight 2. &lt;/p&gt;&lt;p&gt;Even if you can&amp;rsquo;t enter the contest, head on over to the &lt;a href="http://gosilverlight.org/FAQ.aspx" target="_blank"&gt;contest FAQ&lt;/a&gt; and download a badge you can use to help promote the contest and Silverlight 2 control development.&lt;/p&gt;&lt;p&gt;I&amp;rsquo;m looking forward to seeing a lot of excellent entries. Time is limited, so step away from the lawnmower, get those creative juices flowing and submit something we&amp;rsquo;ll all want to use.&lt;/p&gt;&lt;h2&gt;Prizes&lt;/h2&gt;&lt;h3&gt;1st Place&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;h6&gt;1-Year MSDN Premimum Subscription (Not for Resale)&lt;/h6&gt;Contributed by &lt;a href="http://www.wynapse.com" target="_blank"&gt;Dave Campbell&lt;/a&gt; &lt;p&gt;Practically every piece of software that Microsoft makes, available for download for 1-year. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h6&gt;Your choice of one book from the entire O&amp;#39;Reilly catalog&lt;/h6&gt;Contributed by &lt;a href="http://oreilly.com" target="_blank"&gt;O&amp;#39;Reilly Media&lt;/a&gt; &lt;p&gt;Choose from a huge selection of books in the &lt;a href="http://oreilly.com/store/complete.html" target="_blank"&gt;O&amp;#39;Reilly catalog&lt;/a&gt;! &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;2nd Place&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;h6&gt;Microsoft Visual Studio 2008 Standard Edition&lt;/h6&gt;Contributed by &lt;a href="http://www.pagebrooks.com" target="_blank"&gt;Page Brooks&lt;/a&gt; &lt;p&gt;As a Silverlight developer, you probably already have access to this, but it never hurts to have a backup or personal copy! &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h6&gt;Your choice of one book from the entire O&amp;#39;Reilly catalog&lt;/h6&gt;Contributed by &lt;a href="http://oreilly.com" target="_blank"&gt;O&amp;#39;Reilly Media&lt;/a&gt; &lt;p&gt;You know, the books that have funny looking animals on the cover! &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;3rd Place&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;h6&gt;Essential Silverlight 2 Up-to-Date from O&amp;#39;Reilly&lt;/h6&gt;Contributed by &lt;a href="http://oreilly.com" target="_blank"&gt;O&amp;#39;Reilly Media&lt;/a&gt; &lt;p&gt;Get free PDF updates to &lt;a href="http://oreilly.com/catalog/9780596519988/" target="_blank"&gt;this book&lt;/a&gt; as they become available! &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;h6&gt;Your choice of one book from the entire O&amp;#39;Reilly catalog&lt;/h6&gt;Contributed by &lt;a href="http://oreilly.com" target="_blank"&gt;O&amp;#39;Reilly Media&lt;/a&gt; &lt;p&gt;Choose from a huge selection of books in the &lt;a href="http://oreilly.com/store/complete.html" target="_blank"&gt;O&amp;#39;Reilly catalog&lt;/a&gt;! &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Who are the organizers of this contest?&lt;/h2&gt;&lt;p&gt;This event was organized by &lt;a href="http://www.pagebrooks.com" target="_blank"&gt;Page Brooks&lt;/a&gt; and &lt;a href="http://www.wynapse.com" target="_blank"&gt;Dave Campbell&lt;/a&gt;. With additional assistance from &lt;a href="http://www.structuretoobig.com" target="_blank"&gt;Brian Hitney&lt;/a&gt;, &lt;a href="http://www.timheuer.com" target="_blank"&gt;Tim Heuer&lt;/a&gt;, &lt;a href="http://www.adamkinney.com" target="_blank"&gt;Adam Kinney&lt;/a&gt;, &lt;a href="http://adoguy.com" target="_blank"&gt;Shawn Wildermuth&lt;/a&gt;, and &lt;a href="http://www.irritatedvowel.com" target="_blank"&gt;Pete Brown&lt;/a&gt;, this event was organized in just a few short weeks. A special Thanks goes out to all of the contributors who help to make this contest possible! &lt;/p&gt;&lt;h2&gt;Judges&lt;/h2&gt;&lt;li&gt;Page Brooks (&lt;a href="http://www.pagebrooks.com" target="_blank"&gt;www.PageBrooks.com&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;Pete Brown (&lt;a href="http://www.irritatedvowel.com" target="_blank"&gt;www.irritatedVowel.com&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;Dave Campbell (&lt;a href="http://www.wynapse.com" target="_blank"&gt;www.wynapse.com&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;Shawn Wildermuth (&lt;a href="http://www.wynapse.com" target="_blank"&gt;www.wildermuthconsulting.com&lt;/a&gt;) &lt;p&gt;&lt;font size="1"&gt;&lt;em&gt;(all information above valid at the time of this writing. Nothing here alters or supersedes the official rules. Please refer to &lt;/em&gt;&lt;/font&gt;&lt;a href="http://gosilverlight.org/Rules.aspx" target="_blank"&gt;&lt;font size="1"&gt;&lt;em&gt;official rules&lt;/em&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="1"&gt;&lt;em&gt; for details)&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2525" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Technorati test post, please ignore</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/28/Technorati-test-post_2C00_-please-ignore.aspx</link><pubDate>Sat, 28 Jun 2008 05:00:00 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2464</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>0</slash:comments><description>Please ignore&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2464" width="1" height="1"&gt;</description></item><item><title>Marc Schweigert on WPF and Virtual Earth</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/27/Marc-Schweigert-on-WPF-and-Virtual-Earth.aspx</link><pubDate>Fri, 27 Jun 2008 20:06:00 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2461</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;For the &lt;a href="http://windowsclient.net" target="_blank"&gt;WPF&lt;/a&gt;/VE fans in the house, Marc Schweigert has a post and demo showing how to use the new web browser control in .NET 3.5 SP1 to host Virtual Earth. Web meets desktop.&lt;/p&gt;&lt;p&gt;Marc&amp;#39;s post is &lt;a href="http://blogs.msdn.com/devkeydet/archive/2008/06/24/wpf-and-virtual-earth-revisited.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2461" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/WPF/default.aspx">WPF</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Virtual+Earth/default.aspx">Virtual Earth</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Marc+Schweigert/default.aspx">Marc Schweigert</category></item><item><title>Using Pub/Sub and the Observer Pattern in Silverlight 2 (Part 1.5 of 2) More on Service Call Chaining</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/27/Using-Pub_2F00_Sub-and-the-Observer-Pattern-in-Silverlight-2-_2800_Part-1.5-of-2_2900_-More-on-Service-Call-Chaining.aspx</link><pubDate>Fri, 27 Jun 2008 15:05:00 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2456</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;In &lt;a href="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/26/Using-Pub_2F00_Sub-and-the-Observer-Pattern-in-Silverlight-2-_2800_Part-1-of-2_2900_-_2D00_-Async-Service-Call-Chaining.aspx" target="_blank"&gt;my previous post&lt;/a&gt;, I discussed how to chain service calls. One question I received on that was how to do the opposite: take an action after all the calls (or by extension, some logical groups of calls) have completed.&lt;/p&gt;&lt;p&gt;This is one of the challenges with working with async service calls. Rather than have a single function that makes a bunch of inline service calls one after the other, you need to fire off a bunch of calls, which will probably return out of order, and make some decision only after all have completed.&lt;/p&gt;&lt;p&gt;Making async calls is recommended for most client applications. A WPF application, for example, could fire off a bunch of calls and get a response to the user more quickly than it could if it chained the calls inline in a single function. In Silverlight 2, however, it is not only a good idea, it is a mandate due to the architecture of the network client.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;So, how do you handle making a number of service calls and then taking an action when they&amp;#39;ve all completed?&lt;/strong&gt; There are a few ways to do this, one of which (option 2 below) I&amp;#39;m using in the Silverlight 2 Beta 2 application I&amp;#39;m writing right now.&lt;/p&gt;&lt;h4&gt;Option 1: Combined Observer and Data Loading Class&lt;/h4&gt;&lt;p&gt;This is the simplest option, but doesn&amp;#39;t scale out well when working with multiple disparate data sources. The advantage here is simplicity in initial coding. In this case, the DataLoadingPublisher (which is likely but not necessarily what is both making the service calls and containing the properties which hold the data) gets all the data and then publishes an event indicating that all the data is loaded. The subscriber listens for that specific event and takes action when it catches it.&lt;/p&gt;&lt;p&gt;&lt;img alt="image" border="0" height="243" src="http://www.irritatedvowel.com/pub/blog/UsingPubSu.5of2MoreonServiceCallChaining_5D61/image.png" style="margin:5px;border:0px;" width="477" /&gt; &lt;/p&gt;&lt;p&gt;You&amp;#39;d still publish the Data1Loaded and Data2Loaded events in the event bus, but I left them out to keep the diagram uncluttered.&lt;/p&gt;&lt;p&gt;The code for this is pretty straight-forward, but I&amp;#39;m not going to include it here, as I personally feel Option 2 is the better option in almost all cases.&lt;/p&gt;&lt;h4&gt;Option 2: Use Dedicated Observer Class&lt;/h4&gt;&lt;p&gt;This option injects another class into the mix, but provides the ability to have a loosely-coupled observer outside the data sources. This option is good if you have multiple sources of data coming from multiple interfaces to the outside world.&lt;/p&gt;&lt;p&gt;As before, the Event Bus is our common publish/subscribe location.&lt;/p&gt;&lt;p&gt;The various publishers publish DataXLoaded events as shown in the previous post. The Data Watcher listens for those events and keeps track internally of which data has been loaded and which hasn&amp;#39;t. Once it identifies that all data has been loaded, it publishes its own AllDataLoaded event, which other classes (pages etc.) can subscribe to.&lt;/p&gt;&lt;p&gt;&lt;img alt="image" border="0" height="309" src="http://www.irritatedvowel.com/pub/blog/UsingPubSu.5of2MoreonServiceCallChaining_5D61/image_3.png" style="margin:5px;border:0px;" width="467" /&gt; &lt;/p&gt;&lt;p&gt;Here&amp;#39;s what the code might look like:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DataWatcher
&lt;/span&gt;{

    &lt;span style="color:blue;"&gt;public static &lt;/span&gt;DataWatcher()
    {
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.ConfigurationLoaded += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(SomeDataLoaded);
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.EventPageContentLoaded += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(SomeDataLoaded);
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.GeneralPageContentLoaded += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(SomeDataLoaded);
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.MediaPageContentLoaded += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(SomeDataLoaded);
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.UserInformationLoaded += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(SomeDataLoaded);
    }

    &lt;span style="color:blue;"&gt;static void &lt;/span&gt;SomeDataLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ApplicationData&lt;/span&gt;.Current.Configuration != &lt;span style="color:blue;"&gt;null &lt;/span&gt;&amp;amp;&amp;amp;
            &lt;span style="color:#2b91af;"&gt;ApplicationData&lt;/span&gt;.Current.EventPageContent != &lt;span style="color:blue;"&gt;null &lt;/span&gt;&amp;amp;&amp;amp;
            &lt;span style="color:#2b91af;"&gt;ApplicationData&lt;/span&gt;.Current.GeneralPageContent != &lt;span style="color:blue;"&gt;null &lt;/span&gt;&amp;amp;&amp;amp;
            &lt;span style="color:#2b91af;"&gt;ApplicationData&lt;/span&gt;.Current.MediaPageContent != &lt;span style="color:blue;"&gt;null &lt;/span&gt;&amp;amp;&amp;amp;
            &lt;span style="color:#2b91af;"&gt;ApplicationData&lt;/span&gt;.Current.UserInformation != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
        {
            OnAllDataLoaded(&lt;span style="color:#2b91af;"&gt;ApplicationData&lt;/span&gt;.Current, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;());
        }

    }&lt;/pre&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;    private static void &lt;/span&gt;OnAllDataLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.OnAllDataLoaded(sender, e);
    }&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;pre class="code"&gt;}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;I&amp;#39;m not using dedicated flags in this case; I&amp;#39;m using the fact that data values are null to indicate loaded/not loaded state. As that is not always practical, here&amp;#39;s another approach that uses dedicated&amp;nbsp;flag variables to indicate progress. This is a more robust as it doesn&amp;#39;t require knowledge of the internal operations of the ApplicationData class, but instead relies only on its notification events.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DataWatcher
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;private static bool &lt;/span&gt;_configurationLoaded = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;
    &lt;span style="color:blue;"&gt;private static bool &lt;/span&gt;_eventPageContentLoaded = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;
    &lt;span style="color:blue;"&gt;private static bool &lt;/span&gt;_generalPageContentLoaded = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;
    &lt;span style="color:blue;"&gt;private static bool &lt;/span&gt;_mediaPageContentLoaded = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;
    &lt;span style="color:blue;"&gt;private static bool &lt;/span&gt;_userInformationLoaded = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;

    &lt;span style="color:blue;"&gt;public static &lt;/span&gt;DataWatcher()
    {
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.ConfigurationLoaded += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(EventBus_ConfigurationLoaded);
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.EventPageContentLoaded += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(EventBus_EventPageContentLoaded);
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.GeneralPageContentLoaded += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(EventBus_GeneralPageContentLoaded);
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.MediaPageContentLoaded += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(EventBus_MediaPageContentLoaded);
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.UserInformationLoaded += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(EventBus_UserInformationLoaded);
    }

    &lt;span style="color:blue;"&gt;#region &lt;/span&gt;Event Subscriptions

    &lt;span style="color:blue;"&gt;static void &lt;/span&gt;EventBus_UserInformationLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        _userInformationLoaded = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;
        CheckForAllDataLoaded();
    }

    &lt;span style="color:blue;"&gt;static void &lt;/span&gt;EventBus_MediaPageContentLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        _mediaPageContentLoaded = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;
        CheckForAllDataLoaded();
    }

    &lt;span style="color:blue;"&gt;static void &lt;/span&gt;EventBus_GeneralPageContentLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        _generalPageContentLoaded = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;
        CheckForAllDataLoaded();
    }

    &lt;span style="color:blue;"&gt;static void &lt;/span&gt;EventBus_EventPageContentLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        _eventPageContentLoaded = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;
        CheckForAllDataLoaded();
    }

    &lt;span style="color:blue;"&gt;static void &lt;/span&gt;EventBus_ConfigurationLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        _configurationLoaded = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;
        CheckForAllDataLoaded();
    }

    &lt;span style="color:blue;"&gt;#endregion

    #region &lt;/span&gt;Checks for All Data Loaded

    &lt;span style="color:blue;"&gt;private static void &lt;/span&gt;CheckForAllDataLoaded()
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(_configurationLoaded &amp;amp;&amp;amp;
            _eventPageContentLoaded &amp;amp;&amp;amp;
            _generalPageContentLoaded &amp;amp;&amp;amp;
            _mediaPageContentLoaded &amp;amp;&amp;amp;
            _userInformationLoaded)
        {
            OnAllDataLoaded(&lt;span style="color:#2b91af;"&gt;Application&lt;/span&gt;.Current, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;());
        }
    }

    &lt;span style="color:blue;"&gt;private static void &lt;/span&gt;OnAllDataLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.OnAllDataLoaded(sender, e);
    }

    &lt;span style="color:blue;"&gt;#endregion

&lt;/span&gt;}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;While this works well, what this doesn&amp;#39;t do is allow for later clearing and updates to the data. To support that in the previous example, the ApplicationData class would simply null out all existing data and start reloading. The check for null would work as it should, but would require cooperation from the ApplicationData class - coupling we probably shouldn&amp;#39;t have.&lt;/p&gt;&lt;p&gt;Instead, in this new example, the ApplicationData class could publish a DataCleared event when it clears its data in order to reload, and the DataWatcher would subscribe to that and set the flags appropriately. If the ApplicationData class simply overwrites the data and never provides any indication that the checks need to be reset, the model breaks. That is the one bit of cooperation that this still requires, and is reasonable IMHO.&lt;/p&gt;&lt;p&gt;You can extend this example to include classes of data or groups of data which should be loaded as a whole, and notify based on that. Instead of AllDataLoaded, you might have UserDataLoaded and AllPageDataLoaded etc.&lt;/p&gt;&lt;p&gt;The async service model presents some challenges in Silverlight, but the advantages are numerous, and the patterns you follow to work with it are pretty well-understood.&lt;/p&gt;&lt;p&gt;I hope this helps you out with your current and future Silverlight projects. Look for another post soon on using the patterns in these two posts to handle UI navigation.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2456" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Business+Applications/default.aspx">Business Applications</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight+Business+Applications/default.aspx">Silverlight Business Applications</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Patterns/default.aspx">Patterns</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Async/default.aspx">Async</category></item><item><title>Using Pub/Sub and the Observer Pattern in Silverlight 2 (Part 1 of 2) - Async Service Call Chaining</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/26/Using-Pub_2F00_Sub-and-the-Observer-Pattern-in-Silverlight-2-_2800_Part-1-of-2_2900_-_2D00_-Async-Service-Call-Chaining.aspx</link><pubDate>Fri, 27 Jun 2008 01:41:00 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2449</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>8</slash:comments><description>&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/Publish/subscribe" target="_blank"&gt;Publish and Subscribe&lt;/a&gt; pattern (which uses the &lt;a href="http://en.wikipedia.org/wiki/Observer_pattern" target="_blank"&gt;Observer Pattern&lt;/a&gt; in .NET - more info &lt;a href="http://msdn.microsoft.com/en-us/library/ms954621.aspx" target="_blank"&gt;here&lt;/a&gt;) is one of those patterns we use all the time while thinking nothing of it. In .NET, we get the concrete implementation via events and delegates.&lt;/p&gt;&lt;p&gt;By abstracting it out just a little and applying &lt;strong&gt;concepts&lt;/strong&gt; from other bus patterns, we gain a ton of flexibility and can use it for more specialized messaging than button click events. In &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight&lt;/a&gt; applications, in the client code, I tend to use it for two things:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Providing a means by which different parts of the application can notify each other of changes without requiring tight coupling&lt;/li&gt;&lt;li&gt;Providing a centralized mechanism for controlling navigation. This is really a variation on the first, but I break it out as I usually do when implementing. I&amp;#39;ll post about this topic in the follow-up post&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The first one is usually handled by a class named EventBus or similar. (EventBus is a well-known name used by technologies in the java world, &lt;a href="http://msdn.microsoft.com/en-us/library/aa972199.aspx" target="_blank"&gt;biztalk&lt;/a&gt; etc., so I recommend that. I was encouraged to see a colleague at another firm used the same name in an application we did for a demo, so it&amp;#39;s likely a pretty common name and pattern.) &lt;/p&gt;&lt;p&gt;&lt;img alt="image" border="0" height="195" src="http://www.irritatedvowel.com/pub/blog/UsingPubSubandtheObserverPatterninSilver_12CC4/image.png" style="margin:5px;border:0px;" width="348" /&gt; &lt;/p&gt;&lt;p&gt;Here&amp;#39;s a simple example from my current project. This part is used for notifying various parts of the application that data has been loaded from async calls to web services:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventBus
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public static event &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler &lt;/span&gt;ConfigurationLoaded;
    &lt;span style="color:blue;"&gt;public static event &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler &lt;/span&gt;MediaPageContentLoaded;
    &lt;span style="color:blue;"&gt;public static event &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler &lt;/span&gt;EventPageContentLoaded;
    &lt;span style="color:blue;"&gt;public static event &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler &lt;/span&gt;GeneralPageContentLoaded;
    &lt;span style="color:blue;"&gt;public static event &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler &lt;/span&gt;UserInformationLoaded;

    &lt;span style="color:blue;"&gt;#region &lt;/span&gt;Event Raising

    &lt;span style="color:blue;"&gt;public static void &lt;/span&gt;OnConfigurationLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(ConfigurationLoaded != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
            ConfigurationLoaded(sender, e);
    }

    &lt;span style="color:blue;"&gt;public static void &lt;/span&gt;OnUserInformationLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(UserInformationLoaded != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
            UserInformationLoaded(sender, e);
    }

    &lt;span style="color:blue;"&gt;public static void &lt;/span&gt;OnMediaPageContentLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(MediaPageContentLoaded != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
            MediaPageContentLoaded(sender, e);
    }

    &lt;span style="color:blue;"&gt;public static void &lt;/span&gt;OnEventPageContentLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(EventPageContentLoaded != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
            EventPageContentLoaded(sender, e);
    }

    &lt;span style="color:blue;"&gt;public static void &lt;/span&gt;OnGeneralPageContentLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(GeneralPageContentLoaded != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
            GeneralPageContentLoaded(sender, e);
    }

    &lt;span style="color:blue;"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;...
&lt;/span&gt;}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;I store all the loaded data in a singleton ApplicationData class which serves both as the local data cache and the interface to the data web service. Here&amp;#39;s the code in that class:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public void &lt;/span&gt;LoadUserInformation(&lt;span style="color:blue;"&gt;string &lt;/span&gt;platformSpecificSessionKey)
{
    &lt;span style="color:#2b91af;"&gt;ConfigurationServiceClient &lt;/span&gt;client = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ConfigurationServiceClient&lt;/span&gt;();
    client.GetUserInformationCompleted += 
        &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;GetUserInformationCompletedEventArgs&lt;/span&gt;&amp;gt;(client_GetUserInformationCompleted);
    client.GetUserInformationAsync(platformSpecificSessionKey);
}

&lt;span style="color:blue;"&gt;void &lt;/span&gt;client_GetUserInformationCompleted(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;GetUserInformationCompletedEventArgs &lt;/span&gt;e)
{
    _userInformation = e.Result;

    ((&lt;span style="color:#2b91af;"&gt;ConfigurationServiceClient&lt;/span&gt;)sender).CloseAsync();

    &lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.OnUserInformationLoaded(&lt;span style="color:blue;"&gt;this&lt;/span&gt;, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;());
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;(In woodworking magazines, they often write &amp;quot;safety guards removed for clarity&amp;quot; in articles where someone is doing something dangerous. I&amp;#39;ll say the same here, just don&amp;#39;t call me on it :) &lt;strong&gt;&amp;quot;Exception Handling Removed for Clarity&amp;quot;)&lt;/strong&gt; &lt;p&gt;If you&amp;#39;re struggling with a way to chain your async service calls and want to do the right thing by not using WaitOne or otherwise blocking the UI thread, this is one way that can help you out. Have your client-side service interface class be both a publisher and a subscriber and chain your web service calls via event handlers. You could, of course, just chain inside the same functions, but that gets ugly once you have more than a couple levels.&lt;/p&gt;&lt;p&gt;Here&amp;#39;s the code that chains the remaining data calls that are dependent on the call to load the user information. The three calls in here all need the information from the user data web service before they can proceed.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;EventBus&lt;/span&gt;.UserInformationLoaded += &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(EventBus_UserInformationLoaded);&lt;/pre&gt;&lt;pre class="code"&gt;...&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;void &lt;/span&gt;EventBus_UserInformationLoaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
{
    &lt;span style="color:green;"&gt;// we can only get the other information once we have the user
    // information available

    &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ApplicationData&lt;/span&gt;.Current.LoadEventsPageData();
    &lt;span style="color:#2b91af;"&gt;ApplicationData&lt;/span&gt;.Current.LoadMediaPageData();
    &lt;span style="color:#2b91af;"&gt;ApplicationData&lt;/span&gt;.Current.LoadGeneralPageData();
}&lt;/pre&gt;&lt;p&gt;Note that I don&amp;#39;t use this architecture for everything - just information the rest of the application is interested in. I also make sure to translate the events into something meaningful before publishing. For example, the rest of the application is probably not interested in the click event of the &amp;quot;ApplyOptions&amp;quot; button, but it very likely is interested in an OptionsChanged event.&lt;/p&gt;&lt;p&gt;Now, there are lots of other things you may want to notify the rest of the application about. One is the example above where options are changed by the user and you need to do something like change screen colors or font size. Another is when you want to navigate from one page to another.&lt;strong&gt; I&amp;#39;ll cover using this pattern for navigation in the next post&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;One last note: this is by no means specific to Silverlight. I&amp;#39;ve used this on Windows Forms and other client technologies in the past. It just happens that Silverlight is my newest toy :)&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2449" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Business+Applications/default.aspx">Business Applications</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight+Business+Applications/default.aspx">Silverlight Business Applications</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Patterns/default.aspx">Patterns</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Async/default.aspx">Async</category></item><item><title>Software Development Meme - Pete's Response</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/26/Software-Development-Meme-_2D00_-Pete_2700_s-Response.aspx</link><pubDate>Thu, 26 Jun 2008 21:20:41 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2448</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;Fellow Silverlight enthusiast (and great author) &lt;a href="http://cornucopia30.blogspot.com/2008/06/personal-software-development-meme.html" target="_blank"&gt;Chad Campbell called me out on this&lt;/a&gt;, so now it's my turn :)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How old were you when you first started programming? &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;That was either 6th grade or 7th grade, so I was around 12. I often question the people who tell you they were hacking systems at the age of 6, but who knows? :)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How did you get started in programming?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The first time I ever wrote any BASIC statements I was using a DEC Robin. Digital had a computer bus that toured various schools and parked in the playground for a day. The math classes would then take their students out to the bus and let them poke around with the computers.&lt;/p&gt;  &lt;p&gt;In 7th grade I wrote a BASIC program on the CP/M Robin. All the program did was draw a rocket ship and &amp;quot;launch&amp;quot; it up the screen by printing out a bunch of blank lines. With the display set to smooth scrolling, it was convincing to me anyway.&lt;/p&gt;  &lt;p&gt;The computer room had Commodore VIC-20 computers as well, but the huge letters on those just looked cumbersome to me. Soon, the school received a shipment of Commodore 64s, and I was hooked. I used to stay in for recess and stay after school until the room closed.&lt;/p&gt;  &lt;p&gt;It wasn't until highschool that I got a computer of my own - a Commodore 128 with all the trimmings.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What was your first language?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I wrote a couple programs in MBasic on the Robin, and then a ton in Commodore 64 basic. I didn't get into Pascal at all until highschool, and into C/C++ until college..&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What was the first real program you wrote?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Real is hard to define here. I'll take it to mean something rather functionally complete. I wrote some D&amp;amp;D helpers - programs that rolled dice - on the Commodore. My friend at the time also wrote some of those (a very popular &amp;quot;killer app&amp;quot; of the day :) )I also wrote a boatload of games and utilities that were somewhere between 10% and 75% complete. Of course, I did also write the &amp;quot;Would you like to play a game?&amp;quot; WarGames emulator.&lt;/p&gt;  &lt;p&gt;The first &amp;quot;real&amp;quot; program, meaning I got paid for it and it worked and provided some business value is down below under professional gig.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What languages have you used since you started programming?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Learned and did Academic Projects: COBOL, x86 assembly, VAX Pascal, Apple II Pascal, MSIL, VAX DCL&lt;/p&gt;  &lt;p&gt;Used to Actually do Something: Basic (Visual Basic, VBScript, QBasic), C, C++, C#, Delphi (Pascal), PowerBuilder, XBase (dBase, FoxPro), Gupta SQLWindows (I forget the language there), and probably a bunch I've forgotten about.&lt;/p&gt;  &lt;p&gt;Still use: C# and once in a blue moon I do something in VB.NET, but that is rare.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What was your first professional programming gig?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When I was in college, I worked part-time at the Medical Bureau of Economics in Worcester, MA. My job was to do data entry, which I found boring but it paid well - and I was a decent typist. It didn't take me long to realize that the unix app we were all using on those terminals was written in basic and that I could list/modify the source code if I wanted (I limited myself to just looking). What tipped me off was a syntax error I got while using it one day.&lt;/p&gt;  &lt;p&gt;Anyway, shortly afterwards I was moved downstairs because the new director saw that I was working on a CS degree and she realized I was as close to an IT person as that place had. That company had close to 100 employees, but the only IT was one person who used to come in and wire new terminals to the unix server, and replace faulty boards. No programming support at all.&lt;/p&gt;  &lt;p&gt;Besides all the other admin stuff I did, I wrote my first business application: a DOS database and windowed UI in C++. I wasn't aware of dBase or anything at that point in time, but I knew about bTrees and I knew C++. Using the big blue box Borland C++, and some information from some books, I wrote a database to track payments for one of their hospitals. I wrote later versions of it in dBase and even later upgraded that to FoxPro.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;If you knew then what you know now, would you have started programming?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Absolutely. While it has had its ups and downs, I can't think of any other career that would provide me the combination of things I need to keep me happy.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;If there is one thing you learned along the way that you would tell new developers, what would it be?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;User Experience is king, raw functionality is often secondary and great architecture a distant third. Users know this when they see it, but don't get it when gathering requirements. IT departments rarely get this. As the UI/UX bar goes up, professional design firms are going to eat the lunch of those who don't. Remember, a user isn't going to see the great SOA backend you built, and more often than not, they won't care. Build something that scales to the requirements, works well, and is both easy and a pleasure to build.&lt;/p&gt;  &lt;p&gt;Show the users progress early and show it often. A prototype UI is often one of the easiest way to walk through requirements and functionality.&lt;/p&gt;  &lt;p&gt;Note I'm not suggesting that pretty front ends with crappy back ends is a good pattern. We can certainly argue the general points here, but if you find yourself really disagreeing with this point, you might find that you're going to get run over in the RIA/rich revolution going on.&lt;/p&gt;  &lt;p&gt;Oh, and one other point: Spelling and Grammar &lt;strong&gt;do &lt;/strong&gt;Count :)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What&amp;#8217;s the most fun you&amp;#8217;ve ever had &amp;#8230; programming?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;That's hard to say. I've had lots of different kinds of fun, and I've had some real drudge work too. Staying up 20 hours a day coding that first Silverlight 1.1 alpha application was actually a ton of fun. So was doing my first sprite graphics on the C64. I've had lots of fun over time, but the most fun tends to be the little side projects I get to do in emerging/new technology.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Who are you calling out?&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://timheuer.com/blog/" target="_blank"&gt;Tim Heuer&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.franksworld.com/blog/" target="_blank"&gt;Frank LaVigne&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/gduthie/" target="_blank"&gt;Andrew Duthie&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.adoguy.com/" target="_blank"&gt;Shawn Wildermuth&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2448" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/User+Experience+_2800_UX_2900_/default.aspx">User Experience (UX)</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Hobbies/default.aspx">Hobbies</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/General/default.aspx">General</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Technology/default.aspx">Technology</category></item><item><title>How to Retrieve and Process an RSS Feed in Silverlight 2</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/20/How-to-Retrieve-and-Process-an-RSS-Feed-in-Silverlight-2.aspx</link><pubDate>Fri, 20 Jun 2008 16:21:18 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2434</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;For the Facebook &lt;a href="http://silverlight.net" target="_blank"&gt;Silverlight&lt;/a&gt; 2 Beta 2 application I'm writing, I need to be able to process a number of RSS feeds. In Silverlight 2 Beta 2, processing RSS is, well, really simple :)&lt;/p&gt;  &lt;p&gt;Here's a class and associated event and exception classes I wrote to handle downloading the feed, and loading it into the RSS objects:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;#region &lt;/span&gt;Support Classes (exception, eventargs)

&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedException &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;Exception
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public &lt;/span&gt;FeedException()
        : &lt;span style="color:blue;"&gt;base&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Exception retrieving or processing feed.&amp;quot;&lt;/span&gt;)
    {
    }

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;FeedException(&lt;span style="color:blue;"&gt;string &lt;/span&gt;message)
        : &lt;span style="color:blue;"&gt;base&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Exception retrieving or processing feed. &amp;quot; &lt;/span&gt;+ message)
    {
    }

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;FeedException(&lt;span style="color:blue;"&gt;string &lt;/span&gt;message, &lt;span style="color:#2b91af;"&gt;Exception &lt;/span&gt;innerException)
        : &lt;span style="color:blue;"&gt;base&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Exception retrieving or processing feed. &amp;quot; &lt;/span&gt;+ message, 
                innerException)
    {
    }

}

&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedRetrievedEventArgs &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;EventArgs
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SyndicationFeed &lt;/span&gt;_feed;

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;FeedRetrievedEventArgs(&lt;span style="color:#2b91af;"&gt;SyndicationFeed &lt;/span&gt;feed)
    {
        _feed = feed;
    }

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SyndicationFeed &lt;/span&gt;Feed
    {
        &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return &lt;/span&gt;_feed; }
    }

}

&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedErrorEventArgs &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;EventArgs
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Exception &lt;/span&gt;_exception;

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;FeedErrorEventArgs(&lt;span style="color:#2b91af;"&gt;Exception &lt;/span&gt;exception)
    {
        _exception = exception;
    }

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Exception &lt;/span&gt;Error
    {
        &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return &lt;/span&gt;_exception; }
    }

}

&lt;span style="color:blue;"&gt;#endregion

public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RssFeedGrabber
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public event &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FeedRetrievedEventArgs&lt;/span&gt;&amp;gt; FeedRetrieved;
    &lt;span style="color:blue;"&gt;public event &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FeedErrorEventArgs&lt;/span&gt;&amp;gt; FeedError;

    &lt;span style="color:blue;"&gt;private const string &lt;/span&gt;_nullResultErrorMessage = 
        &lt;span style="color:#a31515;"&gt;&amp;quot;The returned stream was null. &amp;quot;&lt;/span&gt;+
        &lt;span style="color:#a31515;"&gt;&amp;quot;The site may not have a valid client access policy in place.&amp;quot;&lt;/span&gt;;
    &lt;span style="color:blue;"&gt;private const string &lt;/span&gt;_parseErrorMessage = 
        &lt;span style="color:#a31515;"&gt;&amp;quot;Unable to parse feed.&amp;quot;&lt;/span&gt;;

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Makes an async call to return the feed data
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&amp;quot;url&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;URL of the feed&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;public void &lt;/span&gt;RetrieveFeedAsync(&lt;span style="color:#2b91af;"&gt;Uri &lt;/span&gt;url)
    {
        &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;();

        client.OpenReadCompleted +=
            &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;OpenReadCompletedEventHandler&lt;/span&gt;(client_OpenReadCompleted);

        client.Encoding = System.Text.&lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.UTF8;
        client.OpenReadAsync(url);
    }


    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Event handler called when the WebClient returns the data from the call
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;private 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;span style="color:green;"&gt;// process the feed

        &lt;/span&gt;&lt;span style="color:blue;"&gt;if &lt;/span&gt;(e.Error == &lt;span style="color:blue;"&gt;null &lt;/span&gt;&amp;amp;&amp;amp; e.Result != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
        {
            &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;XmlReader &lt;/span&gt;reader = &lt;span style="color:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(e.Result))
            {
                &lt;span style="color:blue;"&gt;try
                &lt;/span&gt;{
                    &lt;span style="color:#2b91af;"&gt;SyndicationFeed &lt;/span&gt;feed = &lt;span style="color:#2b91af;"&gt;SyndicationFeed&lt;/span&gt;.Load(reader);

                    &lt;span style="color:#2b91af;"&gt;FeedRetrievedEventArgs &lt;/span&gt;args = 
                        &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedRetrievedEventArgs&lt;/span&gt;(feed);

                    OnFeedRetrieved(args);
                }
                &lt;span style="color:blue;"&gt;catch &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Exception &lt;/span&gt;ex)
                {
                    &lt;span style="color:green;"&gt;// the loader couldn't load the feed
                    &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedErrorEventArgs &lt;/span&gt;args = 
                        &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedErrorEventArgs&lt;/span&gt;(
                            &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedException&lt;/span&gt;(_parseErrorMessage, ex));
                    OnFeedError(args);
                }
            }
        }
        &lt;span style="color:blue;"&gt;else
        &lt;/span&gt;{
            &lt;span style="color:blue;"&gt;if &lt;/span&gt;(e.Error != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
            {
                &lt;span style="color:green;"&gt;// there was an error returned from the call
                &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedErrorEventArgs &lt;/span&gt;args = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedErrorEventArgs&lt;/span&gt;(e.Error);
                OnFeedError(args);
            }
            &lt;span style="color:blue;"&gt;else
            &lt;/span&gt;{
                &lt;span style="color:green;"&gt;// an empty stream. You get this silent failure when there 
                // is no crossdomain file in place (at least in beta2)
                &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedErrorEventArgs &lt;/span&gt;args = 
                    &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedErrorEventArgs&lt;/span&gt;(
                        &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;FeedException&lt;/span&gt;(_nullResultErrorMessage));
                OnFeedError(args);
            }
        }
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Internal method used to raise the feed event
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;protected void &lt;/span&gt;OnFeedRetrieved(&lt;span style="color:#2b91af;"&gt;FeedRetrievedEventArgs &lt;/span&gt;args)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(FeedRetrieved != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
            FeedRetrieved(&lt;span style="color:blue;"&gt;this&lt;/span&gt;, args);
    }

    &lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color:green;"&gt;Internal method used to raise the error event
    &lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
    &lt;/span&gt;&lt;span style="color:blue;"&gt;protected void &lt;/span&gt;OnFeedError(&lt;span style="color:#2b91af;"&gt;FeedErrorEventArgs &lt;/span&gt;args)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(FeedError != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
            FeedError(&lt;span style="color:blue;"&gt;this&lt;/span&gt;, args);
    }

}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;The class simply makes an async web call to retrieve the feed, then raises an event with the parsed feed. If you extend the feed formatter classes, you'll want to modify this code to use the appropriate one. If I end up extending anything, I'll write (and post) a templated version of this class.&lt;/p&gt;

&lt;p&gt;Make sure you add a reference to System.ServiceModel.Syndication as well as add the appropriate using statement:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;System.ServiceModel.Syndication;&lt;/pre&gt;

&lt;p&gt;Keep in mind that the site hosting the rss feed will need to have an appropriate cross domain file in place, or you'll need to use a workaround like the ones described in &lt;a href="http://timheuer.com/blog/archive/2008/06/03/use-silverlight-with-any-feed-without-cross-domain-files.aspx" target="_blank"&gt;Tim Heuer's blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To use this class, simply call it from your code like this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;void &lt;/span&gt;Page_Loaded(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;RoutedEventArgs &lt;/span&gt;e)
{
    &lt;span style="color:#2b91af;"&gt;RssFeedGrabber &lt;/span&gt;grabber = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;RssFeedGrabber&lt;/span&gt;();

    grabber.FeedRetrieved += 
        &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FeedRetrievedEventArgs&lt;/span&gt;&amp;gt;(grabber_FeedRetrieved);
    grabber.FeedError += 
        &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FeedErrorEventArgs&lt;/span&gt;&amp;gt;(grabber_FeedError);

    grabber.RetrieveFeedAsync(
        &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;&amp;quot;http://feeds.feedburner.com/PeteBrown&amp;quot;&lt;/span&gt;));
}

&lt;span style="color:blue;"&gt;void &lt;/span&gt;grabber_FeedError(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;FeedErrorEventArgs &lt;/span&gt;e)
{
    &lt;span style="color:green;"&gt;// there was an error with the feed. display appropriate
    // message or take action here
&lt;/span&gt;}

&lt;span style="color:blue;"&gt;void &lt;/span&gt;grabber_FeedRetrieved(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;FeedRetrievedEventArgs &lt;/span&gt;e)
{
    &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;SyndicationItem &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;e.Feed.Items)
    {
        System.Diagnostics.&lt;span style="color:#2b91af;"&gt;Debug&lt;/span&gt;.WriteLine(item.Title.Text);
    }
}&lt;/pre&gt;

&lt;p&gt;(as an aside, I don't usually break up my code lines as seen above, unless the lines are extremely long; I broke them up just so they fit in this post.)&lt;/p&gt;

&lt;p&gt;Let me know if you have any questions or run into any issues, or if you've come up with an even simpler/cooler/more functional version of this class.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2434" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Silverlight 2 and Yahoo Pipes</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/19/Silverlight-2-and-Yahoo-Pipes.aspx</link><pubDate>Thu, 19 Jun 2008 21:00:24 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2428</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Sometimes I hear about something for the first time and figure I must live under a rock. I make a point of keeping up on a number of new things, but it's hard to keep track of all the cool services and technologies available to you these days.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://timheuer.com/blog/" target="_blank"&gt;Tim Heuer&lt;/a&gt; just today turned me on to &lt;a href="http://pipes.yahoo.com/pipes/" target="_blank"&gt;Yahoo Pipes&lt;/a&gt; when I asked about proxying some services to provide feed content to a &lt;a href="http://silverlight.net/" target="_blank"&gt;Silverlight&lt;/a&gt; &lt;a href="http://www.facebook.com/people/Pete_Brown/668349932" target="_blank"&gt;FaceBook&lt;/a&gt; app I'm developing for &lt;a href="http://blogs.msdn.com/johnm/" target="_blank"&gt;John McClelland&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/chabrook/" target="_blank"&gt;Chad Brooks&lt;/a&gt; through &lt;a href="http://www.appliedis.com" target="_blank"&gt;Applied Information Sciences&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;MSDN doesn't yet have a ClientAccessPolicy.xml in place, so my only options to pull from blogs there are to proxy via my own local service - which will make scaling harder - or look to a third party.&lt;/p&gt;  &lt;p&gt;Well, Yahoo Pipes is a lot more than a proxy. It lets you aggregate various feeds (and services and POX and more) filter, extract key bits of information etc. Not to mention it is one very cool ajax application.&lt;/p&gt;  &lt;p&gt;Below is a screenshot of a pipe I designed to pull some event feed information from various developer evangelist blogs, and the awesome &lt;a href="http://www.communitymegaphone.com/" target="_blank"&gt;Community Megaphone&lt;/a&gt; site that &lt;a href="http://blogs.msdn.com/gduthie/" target="_blank"&gt;Andrew Duthie&lt;/a&gt; set up.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/Silverlight2andYahooPipes_EBAD/image.png" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="323" alt="image" src="http://www.irritatedvowel.com/pub/blog/Silverlight2andYahooPipes_EBAD/image_thumb.png" width="504" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You drag and drop the various components (sources, filters etc.) on to the design surface, and then connect them together. You can see in the above list, I have three blogs for testing feed pulls and event filters. To the right, I have Andrew's Community Megaphone. I don't need to filter that one for event information because that site only includes events.&lt;/p&gt;  &lt;p&gt;For the Microsoft folks in the audience, John, Chad and I will be presenting about this application at TechReady 7 in July/August in Washington State. &lt;/p&gt;  &lt;p&gt;Whether pipes makes it into the final product depends on how well it works for the various scenarios I have. However, it's very promising so far.&lt;/p&gt;  &lt;p&gt;Look for more blog posts as I complete more interesting bits of this application. So far, it is shaping up to be one very cool mashup of a bunch of great technologies. &lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2428" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Microsoft+DPE/default.aspx">Microsoft DPE</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Mashup/default.aspx">Mashup</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Yahoo+Pipes/default.aspx">Yahoo Pipes</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Facebook/default.aspx">Facebook</category></item><item><title>Nerdware: My Home Network, Rack Servers, CNC Machine</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/16/Nerdware_3A00_-My-Home-Network_2C00_-Rack-Servers_2C00_-CNC-Machine.aspx</link><pubDate>Mon, 16 Jun 2008 20:34:51 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2407</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I like to mess around with computers. Every primary computer I've owned since my first 486 has been built by me (my previous computers, a 286 and a Commodore 128 were purchased). I also run a moderately complex network at my house which I realize I have never fully described anywhere. So, thought I'd tell you about it here.&lt;/p&gt;  &lt;h4&gt;Why&lt;/h4&gt;  &lt;p&gt;My first server was a linux box I had in our last apartment. It was running a commercial distribution that was optimized as a firewall. Back then, that was pretty necessary on a cable internet connection. (we were the first internet install the installer had ever performed, so that was a treat too - not to mention that the cable company was new to this whole broadband thing) I later replaced that with a linksys router+firewall that didn't take up so much room.&lt;/p&gt;  &lt;p&gt;I like to tinker. Plus, the idea of having a rack of servers in my basement just did it for me. Originally, I started hosting my own server because my main site was going way over the quota of my ISP, and was about to cost me a ton of money. Either that, or I'd have to remove a good chunk of the &lt;a href="http://www.irritatedvowel.com/Wallpaper/Default.aspx" target="_blank"&gt;desktop backgrounds&lt;/a&gt; I had made freely available. Since we had moved to a house with enough room for me and my computers, I repurposed an old PC as a web server and used Speakeasy DSL. That grew to include a file server and a mail server. Eventually, I got tired of having loose servers standing around, and wanted to put them all in a rack.&lt;/p&gt;  &lt;h4&gt;Wiring&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image.png" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px 10px 5px 5px;border-left:0px;border-bottom:0px;" height="369" alt="image" src="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_thumb.png" width="220" align="left" border="0" /&gt;&lt;/a&gt;When I first moved here in 2001, I went through and &lt;a href="http://www.irritatedvowel.com/HomeImprovement/StructuredWiring.aspx" target="_blank"&gt;wired the whole house with CAT5e and coax&lt;/a&gt;. Fiber required special tools and skills and CAT6 wasn't as available back then. Our house was built in 1979 and cable added later. The cable was split in a million places. In addition, the phone wiring, while professionally done and all home-run to the outside of the house, couldn't keep up with DSL and actually had a fair amount of noise on the line during regular conversations. The problem mainly had to do with proximity to electrical wiring and lighting added later by the previous homeowner.&lt;/p&gt;  &lt;p&gt;The runs (three cat5e and two coax to all plates; at least one per room) all terminate in a panel in the basement utility room. Those provide network, phone and tv as appropriate. (We only have one TV and we keep that in the basement TV room as we don't like TVs in bedrooms or family rooms, but I wired it because all rooms originally had cable and I didn't want to downgrade anything should we sell in the future). You can see that the majority of the coax cables just hang loose in the cabinet. I only connected the one that is in use as any other coax cables (even terminated as all ours are) can contribute to noise in the system. While the effect would likely be minimal, I left them disconnected anyway.&lt;/p&gt;  &lt;p&gt;I didn't want to do wireless as I knew I'd run servers and I just like wired connections better for their performance, reliability and security. However, since I also like to work on the deck sometimes and also need to provide access to my wife's laptop, I installed a Netgear wireless access point upstairs. The signal from the ActionTec router in the basement was too weak and unreliable upstairs and out on the deck due to the interference in the utility room.&lt;/p&gt;  &lt;p&gt;I really need to clean up the wiring in this room, as I added a bunch of things after the fact, but here's a photo to show what it looks like now. Professional installers may want to avert their eyes. :)&lt;/p&gt;  &lt;h4&gt;Internet Access&lt;/h4&gt;  &lt;p&gt;I used to use Speakeasy and found their service and offerings both to be excellent. My favorite thing about Speakeasy was that they treated you like you knew what you were doing.&lt;/p&gt;  &lt;p&gt;That said, I eventually moved from Speakeasy to Verizon FIOS. The copper running to my house wasn't adequate for any higher DSL speeds, so I had to go with fiber or cable. &lt;/p&gt;  &lt;p&gt;The FIOS install was far from painless, as I have the &amp;quot;business&amp;quot; FIOS at my house. As a side note: why are developers and technical people always left out? So many things (laptops, pcs, internet access, operating systems, etc.) are often categorized as &amp;quot;business&amp;quot; or &amp;quot;consumer&amp;quot;. However, the &amp;quot;business&amp;quot; one is usually the one with more features like, oh, static IPs, that certainly are not used only by businesses.&lt;/p&gt;  &lt;p&gt;You can &lt;a href="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2007/04/12/Verizon-FIOS-Install.aspx" target="_blank"&gt;read about the FIOS install here&lt;/a&gt; and &lt;a href="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2007/04/13/FIOS-Upgrade-Complete-_2800_well_2C00_-mostly_2900_.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;Servers and Server Rack&lt;/h4&gt;  &lt;p&gt;A while back, I bid on and won an &lt;a href="http://www.apcc.com/resource/include/techspec_index.cfm?base_sku=AR2100BLK" target="_blank"&gt;APC server rack&lt;/a&gt; on ebay. Shipping on those things is pretty crazy, so I waited until I could find one that was relatively local (this one was north of Baltimore, close to White Marsh, as I recall). My father in law and I took his pickup truck up there and loaded it in the back.&lt;/p&gt;  &lt;p&gt;After that, I purchased a couple used IBM x345 dual Xeon servers from eBay, and outfitted them with new drives, RAID controllers, and upgraded memory. Those are nice 24x7 server-class machines at a cheap price. Sure, the processors are way outdated, but they do just fine as web and database servers for me.&lt;/p&gt;  &lt;p&gt;Finally, since all those machines took some real juice, I had to install a window rattler air conditioner in the window, and run a dedicated 20amp circuit over to the rack. Luckily the electrical panel, the rack and the wiring panel are all in the same room, so that wasn't a big deal at all.&lt;/p&gt;  &lt;p&gt;I also converted a couple of my other stand-alone &amp;quot;servers&amp;quot; (repurposed desktop PCs) into rackmount servers. They run the mail server, the domain controller and the VOIP server. &lt;/p&gt;  &lt;p&gt;I ended up retiring the VOIP server (it's still there, just switched off) as VOIP inside the house just wasn't practical. It was difficult for my wife to use, as you can't do things like just pick up any old extension to join a call, and the server itself had some issues that made it go down sometimes. The real deal-killer, though, was the inability to get rid of the echo on the line. The &lt;a href="http://www.3cx.com/" target="_blank"&gt;3CX&lt;/a&gt; folks (makers of the Windows-based IP PBX) said it wasn't them, and the &lt;a href="http://www.grandstream.com/ata.html" target="_blank"&gt;GrandStream&lt;/a&gt; folks (makers of the HandyTone 503), despite trying hard, couldn't get rid of it either.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_3.png" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="396" alt="image" src="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_thumb_3.png" width="500" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The rack has the servers I mentioned, a 24 port 100mbps switch (will probably upgrade it to gigabit some day, but I haven't hit any real limit yet with 100mbps), a KVM and rackmount console display (also an ebay item) and several stand-alone old battery backup / UPSs that need to be replaced.&lt;/p&gt;  &lt;p&gt;Due to how the rack is positioned in the room, it's hard to get a photo, but these photos show a bit of it at a time. In the first, you can see the wonderful AC on the left. The piece of masonite (hardboard) leaning against the rack on the right is a simple attempt at a baffle to keep the cool air in front of the servers.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_4.png" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px 2px 5px 0px;border-left:0px;border-bottom:0px;" height="213" alt="image" src="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_thumb_4.png" width="165" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_5.png" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px 2px;border-left:0px;border-bottom:0px;" height="213" alt="image" src="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_thumb_5.png" width="165" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_6.png" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px 2px;border-left:0px;border-bottom:0px;" height="213" alt="image" src="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_thumb_6.png" width="165" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;CNC&lt;/h4&gt;  &lt;p&gt;The basement utility room / workshop also includes my CNC control computer, the CNC controller box, and the CNC-converted Sherline mill. You can read more about those on my site &lt;a href="http://www.irritatedvowel.com/Railroad/Workshop/SherlineCNC.aspx" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://www.irritatedvowel.com/Railroad/Workshop/CNCAndCasting.aspx" target="_blank"&gt;here&lt;/a&gt;. You can also see me making a part for the mill, using the mill, on my page &lt;a href="http://www.irritatedvowel.com/Railroad/Workshop/RotaryTable.aspx" target="_blank"&gt;here&lt;/a&gt;. Sadly, I haven't had any time to work with that since my son was born and we started our renovation, but I'll return to it someday. It's really amazing and thoroughly gratifying to see your ideas make it from the digital world to the physical world.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/Railroad/Workshop/RotaryTable.aspx" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px 2px;border-left:0px;border-bottom:0px;" height="185" alt="image" src="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_7.png" width="240" border="0" /&gt;&lt;a href="http://www.irritatedvowel.com/Railroad/Workshop/SherlineCNC.aspx" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px 2px;border-left:0px;border-bottom:0px;" height="185" alt="image" src="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_8.png" width="240" border="0" /&gt;&lt;/a&gt;&lt;/a&gt; &lt;a href="http://www.irritatedvowel.com/Railroad/Workshop/CNCAndCasting.aspx" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px 2px;border-left:0px;border-bottom:0px;" height="183" alt="image" src="http://www.irritatedvowel.com/pub/blog/MyHomeNetwork_B661/image_9.png" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;When I was working with that, I would do all my designs on my main PC, and then copy the resulting set of CNC instructions to a share on my server. From there, I'd go into the utility room and load the instructions up on the machine and queue up the material. Sure, I could remote desktop, but I'd still have to load the material and zero out the bits before running the program anyway :)&lt;/p&gt;  &lt;h4&gt;Future Direction&lt;/h4&gt;  &lt;p&gt;So, that's my home network - for now. When I redo the entry way in the house, I might install a network camera there. Plus, there's always the media center PC when we eventually go that route, and the kitchen PC (when it's back on after the remodel). Finally, when my kids are old enough, I'm sure the consoles of the day will end up on our network.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2407" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Hobbies/default.aspx">Hobbies</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/General/default.aspx">General</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/FIOS/default.aspx">FIOS</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Digital+Home/default.aspx">Digital Home</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Technology/default.aspx">Technology</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/CNC/default.aspx">CNC</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Network/default.aspx">Network</category></item><item><title>Space Shuttle is Huge!</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/16/Space-Shuttle-is-Huge_2100_.aspx</link><pubDate>Mon, 16 Jun 2008 15:07:31 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2400</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;The three of us (me, Melissa and Ben) all went to the National &lt;a href="http://www.nasm.si.edu/visit/floorplans/uhcmap.cfm" target="_blank"&gt;Air and Space Museum - Udvar-Hazy Center&lt;/a&gt; in Chantilly, VA (not the one in DC) this weekend. This is where the Smithsonian keeps all the really big things like the Concorde, the Enola Gay, and the Space Shuttle Enterprise.&lt;/p&gt;  &lt;p&gt;It turned out to be less exciting for Ben than we thought (he's really into airplanes and spaceships, but only when they're moving and making lots of noise, it turns out), but we did all get to see something really cool - the space shuttle.&lt;/p&gt;  &lt;p&gt;Let me say that the shuttle is much bigger than I ever thought it was. I mean, &lt;a href="http://commons.wikimedia.org/wiki/Image:Space_Shuttle_Enterprise_747_takeoff.ogg" target="_blank"&gt;I knew it was pretty big&lt;/a&gt;, but I didn't quite grok just how ginormous this thing is.&lt;/p&gt;  &lt;p&gt;It's pretty dark inside, so this is a terrible photo. However, it really does show the size compared to the people at the table right under the tail.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/SpaceShuttleisHuge_9C73/image.png" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="670" alt="image" src="http://www.irritatedvowel.com/pub/blog/SpaceShuttleisHuge_9C73/image_thumb.png" width="508" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The other thing I found interesting was just how small the Lockheed Martin SR-71 blackbird is. I built a model of that when in highschool and always pictured it as this huge plane. Instead, it's pretty low and sleek, sized much more like a fighter jet than the giant plane it looks to be when scaled down.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2400" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/General/default.aspx">General</category></item><item><title>Visual Studio 2008 and Silverlight 2 Beta 2 - Supported Versions</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/16/Visual-Studio-2008-and-Silverlight-2-Beta-2-_2D00_-Supported-Versions.aspx</link><pubDate>Mon, 16 Jun 2008 14:04:21 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2398</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>14</slash:comments><description>&lt;p&gt;In response to a question at last Friday's Silverlight TechFest event, I said that I believed Beta 2 was supported even on Visual Studio Express.&lt;/p&gt;  &lt;p&gt;I was incorrect. XNA supports Visual Studio Express (and I had been reading about XNA the night before), but Silverlight requires at least Visual Studio Standard. Standard is pretty reasonably priced at well under $300, but it isn't free.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;For now&lt;/strong&gt;, if you want to experiment with Silverlight, I suggest any of the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Purchase Visual Studio Standard or better&lt;/li&gt;    &lt;li&gt;Download and use the 90 day trial of Visual Studio Standard or Professional&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In addition, I recommend that you use the free Expression Blend 2.5 June preview. You don't get a code editor (which is necessary for any real work), but Blend can open and compile Silverlight sample applications that you download. Combined with the purchased or trial version of Visual Studio, you get a well-rounded design and development environment.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/06/06/silverlight-2-beta2-released.aspx" target="_blank"&gt;Scott Guthrie&lt;/a&gt; had the following to say regarding the eventual tooling support for Silverlight (emphasis mine):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&amp;quot;Today's VS Tools for Silverlight download requires VS 2008 Standard or higher, and doesn't work with the free VS express editions.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;quot;Visual Web Developer 2008 Express SP1, though, will enable support for class library and web application projects.&amp;#160; Once the final SP1 release occurs this summer we'll update the VS Tools for Silverlight download to work with it as well - &lt;strong&gt;which will provide you with free VS tool support for Silverlight development.&lt;/strong&gt;&amp;quot;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So there will be a free developer solution for Silverlight in the future. Given that Scott said SP1 will be out this summer, the free 90 day eval version &lt;strong&gt;should&lt;/strong&gt; bridge most or all of that gap. Hope that helps clear up any confusion.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2398" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Events/default.aspx">Events</category></item><item><title>Silverlight DevNuggets Expisode 1 Up and Ready for Viewing</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/12/Silverlight-DevNuggets-Expisode-1-Up-and-Ready-for-Viewing.aspx</link><pubDate>Thu, 12 Jun 2008 20:09:02 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2388</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/gduthie/archive/2008/06/12/new-devnugget-silverlight-controls-and-composition.aspx" target="_blank"&gt;Silverlight DevNuggets #1&lt;/a&gt; is up on Andrew Duthie's blog. Starting out simple, I put together a short screencast covering the concept of a content control in Silverlight 2.&lt;/p&gt;  &lt;p&gt;The idea behind DevNuggets is to present very short videos on digestible topics. I expect to put a couple others out this summer to round out the series and cover some other interesting Silverlight 2 UI topics.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2388" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Silverlight TechFest on Friday - WCF, Astoria and More!</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/11/Silverlight-TechFest-on-Friday-_2D00_-WCF_2C00_-Astoria-and-More_2100_.aspx</link><pubDate>Wed, 11 Jun 2008 21:00:52 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2377</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;&lt;a href="http://www.appliedis.com" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="96" alt="AIS" src="http://www.irritatedvowel.com/pub/blog/SilverlightTechFestonFridayWCFAstoriaand_EF43/image.png" width="240" align="right" border="0" /&gt;&lt;/a&gt;At the Silverlight TechFest on Friday, I'll cover the following topics in my afternoon session on Connecting Silverlight:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Silverlight 2 Beta 2 Networking Overview&lt;/li&gt;    &lt;li&gt;WCF&lt;/li&gt;    &lt;li&gt;Sockets and/or WCF Duplex Communications&lt;/li&gt;    &lt;li&gt;ADO.NET Data Services (Astoria) and how I used it and the ADO.NET Entity Framework&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I'll also cover background info like binding, dependency properties, some LINQ and so on.&lt;/p&gt;  &lt;p&gt;In the afternoon, we'll have a panel discussion and open Q&amp;amp;A, so this is a great opportunity for you to ask whatever you want about Silverlight 2.&lt;/p&gt;  &lt;p&gt;Registration is currently full, but if you show up, no one will turn you away. Just make sure you register/waitlist via the link on &lt;a href="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/05/09/Silverlight-2-TechFest-Coming-to-Reston-_2D00_-Learn-Cool-Stuff-and-Win-an-XBOX-360.aspx" target="_blank"&gt;my post here&lt;/a&gt; (link also has the agenda, location etc.).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/SilverlightTechFestonFridayWCFAstoriaand_EF43/image_3.png" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="258" alt="image" src="http://www.irritatedvowel.com/pub/blog/SilverlightTechFestonFridayWCFAstoriaand_EF43/image_thumb.png" width="404" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;(hey, it's a Microsoft presentation, so you knew there had to be a cloud in there somewhere!)&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2377" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Events/default.aspx">Events</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Dr+Z/default.aspx">Dr Z</category></item><item><title>Problems Uploading Videos to Windows Live Silverlight Streaming when Beta 2 Installed?</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/11/Problems-Uploading-Videos-to-Windows-Live-Silverlight-Streaming-when-Beta-2-Installed_3F00_.aspx</link><pubDate>Wed, 11 Jun 2008 13:45:44 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2372</guid><dc:creator>Pete.Brown</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;If you have Silverlight 2 Beta 2 Installed and enabled, you will not be able to upload videos to Silverlight streaming. That's because the upload component is written in Silverlight 2 Beta 1 and has not yet been upgraded to Beta 2. The problem manifests itself as a disabled Browse button on the &amp;quot;Upload Videos&amp;quot; page.&lt;/p&gt;  &lt;p&gt;I was trying to upload some videos for the &lt;a href="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/05/09/Silverlight-2-TechFest-Coming-to-Reston-_2D00_-Learn-Cool-Stuff-and-Win-an-XBOX-360.aspx" target="_blank"&gt;Silverlight TechFest&lt;/a&gt; this Friday and kept running into this issue. I figured out the solution by digging around in the JS and seeing that the field gets enabled only when the upload component init/create is successful. I also saw that there's a down-level uploader available.&lt;/p&gt;  &lt;p&gt;The workaround is to disable Silverlight (temporarily!) in IE, by going into Tools-&amp;gt; Manage Add-ons -&amp;gt; Enable or Disable Add-ons&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/ProblemsUploadingVideostoWindowsLiveSilv_8947/image.png" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="178" alt="image" src="http://www.irritatedvowel.com/pub/blog/ProblemsUploadingVideostoWindowsLiveSilv_8947/image_thumb.png" width="314" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In the drop-down, select &amp;quot;Add-ons that have been used by Internet Explorer&amp;quot;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/ProblemsUploadingVideostoWindowsLiveSilv_8947/image_3.png" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="106" alt="image" src="http://www.irritatedvowel.com/pub/blog/ProblemsUploadingVideostoWindowsLiveSilv_8947/image_thumb_3.png" width="359" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;and disable Silverlight:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.irritatedvowel.com/pub/blog/ProblemsUploadingVideostoWindowsLiveSilv_8947/image_4.png" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;margin:5px;border-left:0px;border-bottom:0px;" height="363" alt="image" src="http://www.irritatedvowel.com/pub/blog/ProblemsUploadingVideostoWindowsLiveSilv_8947/image_thumb_4.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Then restart IE. When you've completed your uploads, remember to enable Silverlight.&lt;/p&gt;  &lt;p&gt;The nag screens in Live get annoying, but this is a temporary solution just until they update to Beta 2.&lt;/p&gt;&lt;img src="http://community.irritatedvowel.com/aggbug.aspx?PostID=2372" width="1" height="1"&gt;</description><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/tags/Silverlight+Streaming/default.aspx">Silverlight Streaming</category></item><item><title>RIA Job Openings on the Rise</title><link>http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/06/09/RIA-Job-Openings-on-the-Rise.aspx</link><pubDate>Mon, 09 Jun 2008 23:25:25 GMT</pubDate><guid isPermaLink="false">cacdcc58-34f3-4df0-8221-29ec23b1c1c3:2358<