<?xml-stylesheet type='text/xsl' href='http://blogs.u2u.be/rss.xsl' media='screen'?><rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0"><channel><title>U2U all posts</title><description /><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=28518348-04ce-4419-adae-9726d04ec8da</guid><link>http://blogs.u2u.be/diederik/post/2012/01/21/Building-C-custom-controls-in-WinRT-Metro.aspx</link><title>Building C# custom controls in WinRT Metro</title><description>&lt;p&gt;This article describes how to build custom WinRT Metro controls in C# and XAML, with the Developer Preview version of Visual Studio 11. WPF, Silverlight, and WinRT Metro have two ways to roll your own controls: custom controls, and user controls. User controls are composite controls that are created by dragging and dropping other controls onto a XAML surface. They are nothing more than content controls that are optimized for design-time use. User controls are typically for sharing within an application, but not with other applications. Custom controls on the other hand, are created by defining a class that derives -directly or indirectly- from Control, together with a definition of a default style. Custom controls are typically hosted in control libraries, and shared between multiple applications. Custom controls are much more flexible in terms of reuse, styling, templating, and theming.&lt;/p&gt;
&lt;p&gt;For this article I created a simplified version of the Slider control. It's called SimpleSlider. It has a &lt;em&gt;Minimum&lt;/em&gt;, &lt;em&gt;Maximum&lt;/em&gt;, and &lt;em&gt;Value&lt;/em&gt; property. Visually it only&amp;nbsp;consists of&amp;nbsp;a moving part -the thumb- and a colored rectangle of which the width is bound to the &lt;em&gt;Value&lt;/em&gt; property:&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px;" src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f1%2fSliderStyle.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;I first created a project in .NET 4.0 WPF with Visual Studio 10. Then I tried to implement the same functionality in a .NET 4.5 Metro-style app. Here are screenshots of both versions:&lt;/p&gt;
&lt;table style="width: 100%;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img style="width: 90%; border: 0px;" src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f1%2fwpf_customcontrol.png" alt="" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img style="width: 60%; border: 0px;" src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f1%2fmetro_customcontrol.png" alt="" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Creation of the control&lt;/h2&gt;
&lt;p&gt;For WPF there is a WPF Custom Control Library project template. It creates a custom control derived from the most common base class: Control. You might want to change that into a more appropriate class, like ItemsControl or Selector. &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.rangebase.aspx" target="_blank"&gt;RangeBase&lt;/a&gt;&amp;nbsp;would have been the ideal base class for a Slider, but I wanted to build everything from scratch, so I kept the default.&lt;/p&gt;
&lt;p&gt;The Visual Studio template assigns the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.defaultstylekeyproperty.aspx" target="_blank"&gt;DefaultStyleKey&lt;/a&gt; dependency property through an &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.overridemetadata.aspx" target="_blank"&gt;OverrideMetaData&lt;/a&gt; call in a static constructor. It also creates a Themes folder with a generic.xaml with an (almost) empty default control template for the new user control. The project's assembly information gets a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.themeinfoattribute.aspx" target="_blank"&gt;ThemeInfo&lt;/a&gt; attribute that contains the locations where that default style will be searched when the control needs to be displayed.&lt;/p&gt;
&lt;p&gt;That's how it goes in Silverlight and WPF. For Metro style apps there is NO such project template - there's not even a class template for a custom control. The reason is that things like DefaultStyleKey, ThemeInfo and generic.xaml are not supported (yet?). So you have to create the SimpleSlider class and its generic.xaml manually. To inject the style file into the application, add it as a resource dictionary in app.xaml:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Application.Resources&amp;gt;
    &amp;lt;ResourceDictionary&amp;gt;
        &amp;lt;ResourceDictionary.MergedDictionaries&amp;gt;
            &amp;lt;ResourceDictionary Source="Generic.xaml" /&amp;gt;
        &amp;lt;/ResourceDictionary.MergedDictionaries&amp;gt;
    &amp;lt;/ResourceDictionary&amp;gt;
&amp;lt;/Application.Resources&amp;gt;&lt;/pre&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;Adding Bindable Properties&lt;/h2&gt;
&lt;p&gt;By deriving from Control, a custom control inherits a set of useful dependency properties. These are properties to which the user of the control can databind: things like Background, FontSize, and Template. You can add custom dependency properties yourself - Visual Studio has a code snippet for that: &lt;em&gt;propdp&lt;/em&gt;. It generates the &lt;a href="http://msdn.microsoft.com/en-us/library/ms597502.aspx" target="_blank"&gt;dependency property registration&lt;/a&gt; for you:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register("Value", "Object", typeof(SimpleSlider).FullName, new PropertyMetadata(0.0, OnValueChanged));
        
public double Value
{
    get { return (double)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}&lt;/pre&gt;
&lt;p&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.propertymetadata.aspx" target="_blank"&gt;PropertyMetadata&lt;/a&gt; allows you to define the default value and the method that should be called when the property's value is changed. When the Value property of the SimpleSlider is changed, we're going to redraw it:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;private static void OnValueChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
    var customSlider = (SimpleSlider)dependencyObject;
    customSlider.UpdateControls();
}&lt;/pre&gt;
&lt;p&gt;Contrary to WPF and Silverlight, the Register method takes strings instead of types. This is just temporary: Microsoft will &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/4fed80a8-1343-41ca-8c27-b20a00689f65" target="_blank"&gt;regain compatibility&lt;/a&gt; with Silverlight and WPF in the upcoming beta of WinRT.&lt;/p&gt;
&lt;p&gt;In the Developer Preview you need to specify 'Object' as the property type to make the bindings work, but that's also just a temporary bug.&lt;/p&gt;
&lt;h2&gt;Styling&lt;/h2&gt;
&lt;p&gt;Defining the default style for your custom control is not different from current technologies. You just define a style with the corresponding target type in a resource dictionary. Here's the full definition of the default style for the simple slider:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Style TargetType="ctrl:SimpleSlider"&amp;gt;
    &amp;lt;Setter Property="Template"&amp;gt;
        &amp;lt;Setter.Value&amp;gt;
            &amp;lt;ControlTemplate TargetType="ctrl:SimpleSlider"&amp;gt;
                &amp;lt;Grid&amp;gt;
                    &amp;lt;Border Height="8"
                            VerticalAlignment="Stretch"
                            Background="LightGray" /&amp;gt;
                    &amp;lt;Canvas Margin="0"
                            MinHeight="8"&amp;gt;
                        &amp;lt;Rectangle x:Name="PART_Rectangle"
                                    Height="8"
                                    Fill="Yellow" /&amp;gt;
                        &amp;lt;Thumb x:Name="PART_Thumb"
                                Width="8"
                                Height="8" /&amp;gt;
                    &amp;lt;/Canvas&amp;gt;
                &amp;lt;/Grid&amp;gt;
            &amp;lt;/ControlTemplate&amp;gt;
        &amp;lt;/Setter.Value&amp;gt;
    &amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;&lt;/pre&gt;
&lt;p&gt;I would suggest to NOT use TemplateBinding in a style definition, since this doesn't seem to work yet. The following code, where I replaced the Border in the template by a Rectangle with its Width bound to the actual width of the control, does not work in the Developer Preview:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Rectangle Height="8"
           Width="{TemplateBinding ActualWidth}"
           VerticalAlignment="Stretch"
           Fill="LightGray" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;If you're looking for inspiration about styles: all the default styles for WPF and Silverlight controls are on MSDN. You can find the full style for the WPF Slider &lt;a href="http://msdn.microsoft.com/en-us/library/ms753256.aspx" target="_blank"&gt;here&lt;/a&gt;. The WinRT Metro styles are not published yet, but if you open the &lt;a href="http://code.msdn.microsoft.com/windowsapps/Basic-Controls-29318599" target="_blank"&gt;Basic Controls Sample&lt;/a&gt;, you'll find a light_generic.xaml file that has all the information. You'll immediately see why my control is called 'Simple' Slider...&lt;/p&gt;
&lt;h2&gt;Templating&lt;/h2&gt;
&lt;p&gt;The user of your custom control should be able to decide for 200% on how your control should look like in his application. But of course he needs to respect some basic requirements: a slider will always have a moveable part (the Thumb) and an indication of its Value (the Rectangle). The required elements in a style are by convention named with a 'PART_' prefix. The code behind file also exposes these elements' name and type through a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.templatepartattribute.aspx" target="_blank"&gt;TemplatePart&lt;/a&gt; attribute:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;[TemplatePart(Name = ThumbPartName, Type = typeof(Thumb))]
[TemplatePart(Name = RectanglePartName, Type = typeof(Rectangle))]
public class SimpleSlider : Control
{
    private const string ThumbPartName = "PART_Thumb";
    private const string RectanglePartName = "PART_Rectangle";

    // ...
}&lt;/pre&gt;
&lt;p&gt;This indicates to potential control re-stylers that the code-behind relies on these parts. So if you override the default style, you should make sure that it contains elements with the expected name and type.&lt;/p&gt;
&lt;p&gt;The style -default or custom- is typically applied in the OnApplyTemplateCore method, that's Metro's version of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onapplytemplate.aspx" target="_blank"&gt;OnApplyTemplate&lt;/a&gt; method that we know from Silverlight and WPF. As a developer of custom controls, you should wrap the template part manipulation in defensive code. After all, you never know what template you will be dealing with at run-time. Use &lt;em&gt;GetTemplateChild&lt;/em&gt; to find the template part you're interested in, since WPF's &lt;em&gt;Template.Find&lt;/em&gt; does not exist in Silverlight and Metro:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;protected override void OnApplyTemplateCore()
{
    base.OnApplyTemplateCore();

    this.thumb = this.GetTemplateChild(ThumbPartName) as Thumb;
    if (this.thumb != null)
    {
        this.thumb.DragDelta += this.Thumb_DragDelta;
    }
    
    // ...
}&lt;/pre&gt;
&lt;p&gt;All changes to a dependency property fire the &lt;em&gt;INotifyPropertyChanged&lt;/em&gt; event. Unfortunately, in the Developer Preview something goes wrong in the central binding mechanism when the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding.elementname.aspx" target="_blank"&gt;ElementName&lt;/a&gt; property is used. The following code displays the initial slider value correctly in a textblock. But when the thumb is moved, the textbox just disappears:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;TextBlock Text="{Binding Path=Value, ElementName=SimpleSlider}" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;If you bring a viewmodel in the equation and use it as datacontext for slider and textbox, then everything works as expected. This looks like overkill, but as a die-hard MVVM developer I can live with that. Here's the -working- code for the value binding of the pacman-shaped slider:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;TextBlock Text="{Binding SliderValue}" /&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Overriding a style&lt;/h2&gt;
&lt;p&gt;To override the default style, you just need to provide a new one, e.g. through XAML:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ctrl:SimpleSlider.Style&amp;gt;
    &amp;lt;Style TargetType="ctrl:SimpleSlider"&amp;gt;
        &amp;lt;Setter Property="Template"&amp;gt;
            &amp;lt;Setter.Value&amp;gt;
                &amp;lt;ControlTemplate TargetType="ctrl:SimpleSlider"&amp;gt;
                    &amp;lt;!-- Your template here --&amp;gt;
                    &amp;lt;!-- ... --&amp;gt;
                &amp;lt;/ControlTemplate&amp;gt;
            &amp;lt;/Setter.Value&amp;gt;
        &amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/ctrl:SimpleSlider.Style&amp;gt;&lt;/pre&gt;
&lt;p&gt;Just make sure you use the required template parts.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;There are a couple of glitches in the Developer Preview, but in general the WinRT Metro framework already has most of the foundations to build reusable custom control libraries. In a couple of weeks there will be a new release: not a true&amp;nbsp;beta release, but a so-called&amp;nbsp;&amp;nbsp;'consumer preview'.&amp;nbsp;I can't wait to get my hands on it...&lt;/p&gt;
&lt;h2&gt;Code&lt;/h2&gt;
&lt;p&gt;Here's the full code, the WinRT version was built with the Visual Studio 11 Developer Preview:&lt;br /&gt;WPF: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2012%2f1%2fU2UConsult.WPF.SimpleSlider.zip"&gt;U2UConsult.WPF.SimpleSlider.zip (24,81 kb)&lt;/a&gt; &lt;br /&gt;WinRT: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2012%2f1%2fU2UConsult.WinRT.SimpleSlider.zip"&gt;U2UConsult.WinRT.SimpleSlider.zip (34,84 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;h2&gt;Afterthought&lt;/h2&gt;
&lt;p&gt;I realize&amp;nbsp;that it was&amp;nbsp;unfair to compare WinRT Metro directly to WPF. The WinRT Metro mechanisms are much closer to Silverlight than they are to WPF. WinRT Metro currently feels like a stripped-down version of Silverlight (which itself is a stripped-down version of WPF). At first, I found that a bit strange. After all, the WinRT runtime is not restrained by footprint size: it doesn't have to be smaller than the Flash plugin. It's also not constrained by browser and operating system compatibility: it doesn't have to run in Opera on a Windows Server 2000, nor in Safari on a Mac. On the other hand, WinRT is targeted to run on cheap (well, hopefully) tablets powered by &lt;a href="http://en.wikipedia.org/wiki/ARM_architecture" target="_blank"&gt;ARM processors&lt;/a&gt;, the 32-bit cores that drive smartphones, MP3-players, and the Nintendo DS. That counts as&amp;nbsp;a constraint.&lt;/p&gt;</description><pubDate>Sat, 21 Jan 2012 21:08:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2012/01/21/Building-C-custom-controls-in-WinRT-Metro.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=28518348-04ce-4419-adae-9726d04ec8da</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=28518348-04ce-4419-adae-9726d04ec8da</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2012/01/21/Building-C-custom-controls-in-WinRT-Metro.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=28518348-04ce-4419-adae-9726d04ec8da</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=24c915f7-f450-46b1-8494-bd98f74b3022</guid><link>http://blogs.u2u.be/diederik/post/2012/01/03/Hello-ObservableVector-goodbye-ObservableCollection.aspx</link><category>Metro</category><category>WinRT</category><title>Hello ObservableVector, goodbye ObservableCollection</title><description>&lt;p&gt;WinRT, the new Windows 8 runtime for Metro applications,&amp;nbsp;introduces a new interface for collection change notification. &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/br226052.aspx" target="_blank"&gt;IObservableVector&amp;lt;T&amp;gt;&lt;/a&gt; replaces ye olde &lt;em&gt;INotifyCollectionChanged&lt;/em&gt;. The &lt;em&gt;ObservableCollection&lt;/em&gt; class still exists, you can continue to use it. Unfortunately its collection change events are ignored by the WinRT framework. I can assure you that this will give cross-platform developers a serious headache - or worse. Don't say I didn't warn you:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f1%2fObservableCollectionWinRT.gif" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;IObservableVector&amp;lt;T&amp;gt;&lt;/em&gt; interface is defined, but the framework does not contain an implementation yet. There's no built-in collection that raises the new &lt;em&gt;VectorChanged&lt;/em&gt; events. The fresh&amp;nbsp;&lt;a href="http://cocoon.codeplex.com/" target="_blank"&gt;cocoon&lt;/a&gt; framework on CodePlex contains an implementation of &lt;em&gt;ObservableVector&amp;lt;T&amp;gt;&lt;/em&gt;. Unsurprisingly it's a light-weight wrapper around an &lt;em&gt;IList&amp;lt;T&amp;gt;&lt;/em&gt;. The class is described &lt;a href="http://andyonwpf.blogspot.com/2011/12/observablevector-as-replacement-for.html" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here's my own version of the class - I just adapted it to my property change notification mechanism:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;namespace Mvvm
{
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml.Data;

    /// &amp;lt;summary&amp;gt;
    /// IObservableVector&amp;lt;T&amp;gt; implementation.
    /// &amp;lt;/summary&amp;gt;
    public class ObservableVector&amp;lt;T&amp;gt; : Collection&amp;lt;T&amp;gt;, INotifyPropertyChanged, IObservableVector&amp;lt;T&amp;gt;
    {
        // *** Events ***

        public event PropertyChangedEventHandler PropertyChanged;
        public event VectorChangedEventHandler&amp;lt;T&amp;gt; VectorChanged;

        // *** Constructors ***

        public ObservableVector()
            : base()
        {}

        public ObservableVector(IList&amp;lt;T&amp;gt; list)
            : base(list)
        {}

        // *** Protected Methods ***   

        protected override void ClearItems()
        {
            base.ClearItems();
            this.PropertyChanged.Raise(this, o =&amp;gt; o.Count);
            this.PropertyChanged.Raise(this, o =&amp;gt; o.Items);
            this.OnVectorChanged(CollectionChange.Reset, 0);
        }

        protected override void InsertItem(int index, T item)
        {
            base.InsertItem(index, item);
            this.PropertyChanged.Raise(this, o =&amp;gt; o.Count);
            this.PropertyChanged.Raise(this, o =&amp;gt; o.Items);
            this.OnVectorChanged(CollectionChange.ItemInserted, (uint)index);
        }

        protected override void RemoveItem(int index)
        {
            base.RemoveItem(index);
            this.PropertyChanged.Raise(this, o =&amp;gt; o.Count);
            this.PropertyChanged.Raise(this, o =&amp;gt; o.Items);
            this.OnVectorChanged(CollectionChange.ItemRemoved, (uint)index);
        }

        protected override void SetItem(int index, T item)
        {
            base.SetItem(index, item);
            this.PropertyChanged.Raise(this, o =&amp;gt; o.Items);
            this.OnVectorChanged(CollectionChange.ItemChanged, (uint)index);
        }

        // *** Event Handlers ***

        protected void OnVectorChanged(CollectionChange collectionChange, uint index)
        {
           this.OnVectorChanged(new VectorChangedEventArgs(collectionChange, index));
        }

        protected virtual void OnVectorChanged(IVectorChangedEventArgs e)
        {
            if (this.VectorChanged != null)
                this.VectorChanged(this, e);
        }

        // *** Private Sub-classes ***

        private class VectorChangedEventArgs : IVectorChangedEventArgs
        {
            // *** Fields ***

            private readonly CollectionChange collectionChange;
            private readonly uint index;

            // *** Constructors ***

            public VectorChangedEventArgs(CollectionChange collectionChange, uint index)
            {
                this.collectionChange = collectionChange;
                this.index = index;
            }

            // *** Properties ***

            public CollectionChange CollectionChange
            {
                get
                {
                    return this.collectionChange;
                }
            }

            public uint Index
            {
                get
                {
                    return this.index;
                }
            }
        }
    }
}&lt;/pre&gt;
&lt;p&gt;I consider this&amp;nbsp;temporary code - I assume that next versions of WinRT will have a native version of &lt;em&gt;ObservableVector&amp;lt;T&amp;gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I built a small sample application around to demonstrate the usage of the class in a MVVM application: all the work is done through data and command bindings.&amp;nbsp;The app just&amp;nbsp;manages two collections of Dragons: 'All Dragons' and 'Favorites'. The selected Dragon in each&amp;nbsp;ListBox can be&amp;nbsp;moved to the other collection by clicking the buttons in the middle.&amp;nbsp;Here's how&amp;nbsp;the app&amp;nbsp;looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f1%2fScreenshot.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;By the way, in the current version of WinRT -Developer Preview- the collection changed events are only handled if T is &lt;em&gt;object&lt;/em&gt;, so you have to define the collection as follows:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public ObservableVector&amp;lt;object&amp;gt; Dragons { get; set; }&lt;/pre&gt;
&lt;p&gt;For any other type -like &lt;em&gt;ObservableVector&amp;lt;string&amp;gt;&lt;/em&gt; or &lt;em&gt;ObservableVector&amp;lt;Dragon&amp;gt;&lt;/em&gt;- the change events will be simply ignored by the binding mechanism. That's another headache&lt;img title="Undecided" src="http://blogs.u2u.be/diederik/editors/tiny_mce_3_4_3_1/plugins/emotions/img/smiley-undecided.gif" alt="Undecided" border="0" /&gt;.&lt;/p&gt;
&lt;p&gt;You use the class exactly the same way as good old &lt;em&gt;ObservableCollection&lt;/em&gt;, e.g. as &lt;em&gt;ItemsSource&lt;/em&gt; to a an &lt;em&gt;ItemControl&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ListBox DataContext="{Binding}"
         ItemsSource="{Binding Dragons}"
         SelectedItem="{Binding SelectedDragon, Mode=TwoWay}" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;Here's the full source code, it's built with Visual Studio 11 Developer Preview: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2012%2f1%2fU2UConsult.WinRT.ObservableVector.Sample.zip"&gt;U2UConsult.WinRT.ObservableVector.Sample.zip (47,83 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</description><pubDate>Tue, 03 Jan 2012 06:12:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2012/01/03/Hello-ObservableVector-goodbye-ObservableCollection.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=24c915f7-f450-46b1-8494-bd98f74b3022</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=24c915f7-f450-46b1-8494-bd98f74b3022</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2012/01/03/Hello-ObservableVector-goodbye-ObservableCollection.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=24c915f7-f450-46b1-8494-bd98f74b3022</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=60034cb6-61bc-48b1-a20a-4bce09895f27</guid><link>http://blogs.u2u.be/diederik/post/2011/12/27/Databinding-to-an-enumeration-in-WinRT.aspx</link><category>Metro</category><category>WinRT</category><title>Databinding to an enumeration in WinRT</title><description>&lt;p&gt;This article demonstrates how to databind a radiobutton to an enumeration element, in a WinRT Metro application. The MVVM viewmodel has a property of an enumeration type, which is bound to the &lt;em&gt;IsChecked&lt;/em&gt; property of&amp;nbsp;some&amp;nbsp;radiobuttons. A value converter compares the value from the viewmodel with an enumeration element that is provided as parameter to the converter. The &lt;em&gt;Convert&lt;/em&gt; method returns true if both match, the &lt;em&gt;ConvertBack&lt;/em&gt; method updates the bound value when the radiobutton is clicked or tapped.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Here's a screenshot of the attached sample application. The radiobuttons are bound to the &lt;em&gt;CarColor&lt;/em&gt; property -an enumeration- of the viewmodel. The &lt;em&gt;Vote&lt;/em&gt;-button updates that same property through a command:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fEnumtoBooleanSample.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;The converter is much more complex than the WPF version from &lt;a href="http://blogs.u2u.be/diederik/post/2011/12/24/Databinding-to-an-enumeration-in-WPF.aspx" target="_blank"&gt;my previous article&lt;/a&gt;, it's even more complex than its corresponding Silverlight version that you can find &lt;a href="http://www.codeproject.com/KB/silverlight/BindingRadioButtons.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here's a list of reasons why the implementation was not so straightforward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The&lt;em&gt; x:Static&lt;/em&gt; markup extension is not allowed in a Metro application,&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Binding.DoNothing&lt;/em&gt; does not exist in WinRT, and&lt;/li&gt;
&lt;li&gt;unlike in WPF or Silverlight, the converter receives the enumeration value as an integer instead of a string.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I observed all of this, my first reaction was AARGH!!! Don't worry: it was not a call of anger and frustration. In the noble Antwerp language&amp;nbsp;&lt;em&gt;aerg&lt;/em&gt; just means 'this is bad'. Non-believers:&amp;nbsp;just follow &lt;a href="http://www.antwerps.be/woord/1" target="_blank"&gt;this link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As a result,&amp;nbsp;the converter is much more complex than expected. It reconstructs the enumeration parameter from the binding expression by string parsing and reflection. Here's how it looks like:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;namespace U2UConsult.WinRT.Converters
{
    using System;
    using System.Globalization;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Data;

    /// &amp;lt;summary&amp;gt;
    /// Converts an enum to a boolean.
    /// &amp;lt;/summary&amp;gt;
    public class EnumToBooleanConverter : IValueConverter
    {
        /// &amp;lt;summary&amp;gt;
        /// Compares the bound value with an enum param. Returns true when they match.
        /// &amp;lt;/summary&amp;gt;
        public object Convert(object value, string typeName, object parameter, string language)
        {
            try
            {
                string parm = parameter.ToString();
                int lastDot = parm.LastIndexOf(".");
                string enumName = parm.Substring(0, lastDot);
                string enumValue = parm.Substring(lastDot + 1);

                Type t = Type.GetType(enumName);
                string s = Enum.GetName(t, value);
                object b = Enum.Parse(t, enumValue);
                return b.ToString() == s;
            }
            catch (Exception)
            {
                return false;
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Converts the boolean back into an enum.
        /// &amp;lt;/summary&amp;gt;
        public object ConvertBack(object value, string typeName, object parameter, string language)
        {
            try
            {
                string parm = parameter.ToString();
                int lastDot = parm.LastIndexOf(".");
                string enumName = parm.Substring(0, lastDot);
                string enumValue = parm.Substring(lastDot + 1);

                Type t = Type.GetType(enumName);
                object b = Enum.Parse(t, enumValue);

                return b;
            }
            catch (Exception)
            {
                return DependencyProperty.UnsetValue;
            }
        }
    }
}&lt;/pre&gt;
&lt;p&gt;In your application, all you need to do is create an enumeration:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public enum CarColor
{
    Yellow,
    Red,
    Pink,
    Black
}&lt;/pre&gt;
&lt;p&gt;In the viewmodel, create a property of the enumeration type:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;private CarColor carColor = CarColor.Black;

public event PropertyChangedEventHandler PropertyChanged;

public CarColor CarColor
{
    get { return carColor; }
    set {
        this.carColor = value;
        this.PropertyChanged.Raise(this, (o) =&amp;gt; o.CarColor);
    }
}&lt;/pre&gt;
&lt;p&gt;The propertychanged notification makes sure that the radiobutton follows all modifications of the property.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;In the view, define the converter instance as a resource in XAML:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;UserControl.Resources&amp;gt;
    &amp;lt;cv:EnumToBooleanConverter x:Key="EnumToBooleanConverter" /&amp;gt;
&amp;lt;/UserControl.Resources&amp;gt;&lt;/pre&gt;
&lt;p&gt;Bind the viewmodel's &lt;em&gt;CarColor&amp;nbsp;&lt;/em&gt;property to the &lt;em&gt;Ischecked&lt;/em&gt; property of each radioButton. The enumeration value is provided as parameter to the converter with its fully qualified name. Also, you have to set the binding mode to &lt;em&gt;TwoWay&lt;/em&gt;, and make sure that every radiobutton has its own &lt;em&gt;GroupName&lt;/em&gt;. This is because we can't use &lt;em&gt;Binding.DoNothing&lt;/em&gt; in the &lt;em&gt;IValueConverter.ConvertBack&lt;/em&gt; Method. We always have to return the parameter, or&lt;em&gt; DependencyProperty.UnsetValue&lt;/em&gt;. Both (re-)trigger all radiobuttons in the same group and that's not what we want; more info &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.convertback(v=VS.110).aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here's the full binding syntax in XAML:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;RadioButton Content="Giallo Modena"
                GroupName="Yellow"
                IsChecked="{Binding CarColor, Mode=TwoWay, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=U2UConsult.WinRT.DataBindingToEnum.ViewModels.CarColor.Yellow}" /&amp;gt;
&amp;lt;RadioButton Content="Rosso Corsa"
                GroupName="Red"
                IsChecked="{Binding CarColor, Mode=TwoWay, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=U2UConsult.WinRT.DataBindingToEnum.ViewModels.CarColor.Red}" /&amp;gt;
&amp;lt;RadioButton Content="Rosa Insapora"
                GroupName="Pink"
                IsChecked="{Binding CarColor, Mode=TwoWay, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=U2UConsult.WinRT.DataBindingToEnum.ViewModels.CarColor.Pink}" /&amp;gt;
&amp;lt;RadioButton Content="Matte Nero"
                GroupName="Black"
                IsChecked="{Binding CarColor, Mode=TwoWay, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=U2UConsult.WinRT.DataBindingToEnum.ViewModels.CarColor.Black}" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;This solution is more error-prone and definitely slower than the WPF version, but it does the job. That's the good news. I also have bad news: the pink Ferrari photo is NOT photoshopped, &lt;em&gt;aerg&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, here's the full source code. It was developed with Visual Studio 11 Developer Preview: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2011%2f12%2fU2UConsult.WinRT.DataBindingToEnum.zip"&gt;U2UConsult.WinRT.DataBindingToEnum.zip (364,11 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</description><pubDate>Tue, 27 Dec 2011 00:04:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2011/12/27/Databinding-to-an-enumeration-in-WinRT.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=60034cb6-61bc-48b1-a20a-4bce09895f27</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=60034cb6-61bc-48b1-a20a-4bce09895f27</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2011/12/27/Databinding-to-an-enumeration-in-WinRT.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=60034cb6-61bc-48b1-a20a-4bce09895f27</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=6b3b6500-6678-4b7c-9847-b94968a755de</guid><link>http://blogs.u2u.be/diederik/post/2011/12/24/Databinding-to-an-enumeration-in-WPF.aspx</link><title>Databinding to an enumeration in WPF</title><description>&lt;p&gt;This article demonstrates how to databind a radiobutton to an enumeration element, in a WPF application. The MVVM viewmodel has a property of an enumeration type, which is bound to the &lt;em&gt;IsChecked&lt;/em&gt; property of the radiobutton. A value converter compares the value from the viewmodel with an enumeration element that is provided as parameter to the converter. The &lt;em&gt;Convert&lt;/em&gt; method returns true if both match, the &lt;em&gt;ConvertBack&lt;/em&gt; method updates the bound value if there's no match.&lt;/p&gt;
&lt;p&gt;Here's a screenshot of the attached sample application. The radiobuttons are bound to the &lt;em&gt;Reindeer&lt;/em&gt; property -an enumeration- of the viewmodel. The &lt;em&gt;Vote&lt;/em&gt;-button updates that same property through a command:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fReindeer.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Here's the converter:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;namespace U2UConsult.WPF.Converters
{
    using System;
    using System.Globalization;
    using System.Windows.Data;

    /// &amp;lt;summary&amp;gt;
    /// Converts an enum to a boolean.
    /// &amp;lt;/summary&amp;gt;
    public class EnumToBooleanConverter : IValueConverter
    {
        /// &amp;lt;summary&amp;gt;
        /// Compares the bound value with an enum param. Returns true when they match.
        /// &amp;lt;/summary&amp;gt;
        public object Convert(object value, Type targetType, object param, CultureInfo culture)
        {
            return value.Equals(param);
        }

        /// &amp;lt;summary&amp;gt;
        /// Updates the bound value if it's different from the parameter.
        /// &amp;lt;/summary&amp;gt;
        public object ConvertBack(object value, Type targetType, object param, CultureInfo culture)
        {
            return (bool)value ? param : Binding.DoNothing;
        }
    }
}&lt;/pre&gt;
&lt;p&gt;In your application, all you need to do is create an enumeration:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public enum Reindeer
{
    Donner,
    Blitzen,
    Rudolph,
    SantasLittleHelper
}&lt;/pre&gt;
&lt;p&gt;In the viewmodel, create a property of the enumeration type:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;private Reindeer reindeer;
        
public event PropertyChangedEventHandler PropertyChanged;

public Reindeer Reindeer
{
    get { return reindeer; }
    set {
        reindeer = value;
        this.PropertyChanged.Raise(this, o =&amp;gt; o.Reindeer);
    }
}&lt;/pre&gt;
&lt;p&gt;The propertychanged notification makes sure that the radiobutton follows all modifications of the property.&lt;/p&gt;
&lt;p&gt;In the view, define&amp;nbsp;the converter instance as a resource in XAML:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Window.Resources&amp;gt;
  &amp;lt;cv:EnumToBooleanConverter x:Key="EnumToBooleanConverter" /&amp;gt;
&amp;lt;/Window.Resources&amp;gt;&lt;/pre&gt;
&lt;p&gt;Bind the viewmodel's property to the &lt;em&gt;Ischecked&lt;/em&gt; property of&amp;nbsp;each radioButton. The enumeration value is provided as parameter to the converter. Don't use the string representation of the element's value, but use the &lt;em&gt;x:Static&lt;/em&gt; markup extension:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;RadioButton Content="Donner"
             IsChecked="{Binding Reindeer, 
                        Converter={StaticResource EnumToBooleanConverter}, 
                        ConverterParameter={x:Static vm:Reindeer.Donner}}" /&amp;gt;
&amp;lt;RadioButton Content="Blitzen"
             IsChecked="{Binding Reindeer, 
                        Converter={StaticResource EnumToBooleanConverter}, 
                        ConverterParameter={x:Static vm:Reindeer.Blitzen}}" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;There you go!&lt;/p&gt;
&lt;p&gt;Here's the WPF project: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2011%2f12%2fU2UConsult.WPF.DataBindingToEnum.zip"&gt;U2UConsult.WPF.DataBindingToEnum.zip (41,39 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</description><pubDate>Sat, 24 Dec 2011 17:41:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2011/12/24/Databinding-to-an-enumeration-in-WPF.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=6b3b6500-6678-4b7c-9847-b94968a755de</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=6b3b6500-6678-4b7c-9847-b94968a755de</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2011/12/24/Databinding-to-an-enumeration-in-WPF.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=6b3b6500-6678-4b7c-9847-b94968a755de</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=5df48b3b-8429-4ae8-9050-df54f1fe5852</guid><link>http://blogs.u2u.be/diederik/post/2011/12/15/Building-WPF-forms-without-GDI-decoration.aspx</link><category>WPF</category><title>Building WPF forms without GDI decoration</title><description>&lt;p&gt;This article describes a base class for WPF windows. It hides all GDI chrome, without losing functionality. WPF promises entire freedom in look-and-feel of your application. In its standard configuration, however, a WPF Window is still hosted in a classic GDI-based WinForm. Its border and header are rendered by the operating system. This takes away a lot of styling opportunities: things like a custom close button or rounded borders become impossible. On top of that, the GDI chrome eats a lot of pixels away from your application. That waste of space becomes obvious if you use custom controls like the popular Ribbon.&lt;/p&gt;
&lt;p&gt;I created the &lt;em&gt;NoGdiWindow&lt;/em&gt; base class to solve all of these problems. The following screenshots from the attached sample application show the same WPF window - with and without using the base class. If you prefer the left window, you may stop reading now &lt;img title="Smile" src="http://blogs.u2u.be/diederik/editors/tiny_mce_3_4_3_1/plugins/emotions/img/smiley-smile.gif" alt="Smile" border="0" /&gt;.&lt;/p&gt;
&lt;table style="width: 100%;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fbefore.PNG" alt="before" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fafter.PNG" alt="after" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Hiding the GDI header&lt;/h2&gt;
&lt;p&gt;Setting the WindowStyle to &lt;em&gt;System.Windows.WindowStyle.None&lt;/em&gt; removes the window header:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;this.WindowStyle = System.Windows.WindowStyle.None;&lt;/pre&gt;
&lt;p&gt;You obviously loose the icon, the title and the minimize, maximize/restore, and close buttons. These are relatively easy to recover: the &lt;em&gt;NoGdiWindow&lt;/em&gt; class contains the necessary commands and properties to rapidly create custom buttons in XAML. Here's an overview of the relevant class members:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fHeaderMembers.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Here's an example of a custom button:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Button ToolTip="Maximize" Command="{Binding ElementName=Window, Path=MaximizeCommand}" Visibility="{Binding ElementName=Window, Path=MaximizeButtonVisibility}" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;Restoring the buttons is not sufficient: the beheaded window doesn't have a region anymore by which you can drag it, or minimize/restore by double-clicking. When using &lt;em&gt;NoGdiWindow&lt;/em&gt;, all you need to do is create a region at the appropriate position and hook in&amp;nbsp;the &lt;em&gt;MouseLeftButtonDown&lt;/em&gt; event handler:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Grid MouseLeftButtonDown="Header_MouseLeftButtonDown" Background="Transparent" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="32" Margin="80 0 0 0"&amp;gt;&lt;/pre&gt;
&lt;p&gt;You may want to implement this functionality as a behavior instead of an event handler.&lt;/p&gt;
&lt;p&gt;In the following screenshot, the region is highlighted. The left margin of 80 pixels keeps the ribbon's application menu accessible:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fheader.PNG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;When you use &lt;em&gt;WindowStyle.None&lt;/em&gt; your window will overlap the task bar if it's maximized. I personally don't mind at all. If you (or our end users) have a problem with this, you find some possible workarounds &lt;a href="http://blogs.msdn.com/b/llobo/archive/2006/08/01/maximizing-window-_2800_with-windowstyle_3d00_none_2900_-considering-taskbar.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Hiding the GDI border&lt;/h2&gt;
&lt;p&gt;You can make the remaining GDI border disappear by setting the &lt;em&gt;AllowsTransparency&lt;/em&gt; property to &lt;em&gt;True&amp;nbsp;&lt;/em&gt;and your form's background to &lt;em&gt;Transparent&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;this.AllowsTransparency = true;
this.Background = new SolidColorBrush(Colors.Transparent);&lt;/pre&gt;
&lt;p&gt;This allows you to provide a rounded border around your window, or create an irregular shape. Unfortunately the native GDI border also hosts the resize handles, so you need to get these back. The &lt;em&gt;NoGdiWindow&lt;/em&gt; draws a series of rectangles on the form, with the necessary mouse down handlers. Therefor, your main panel should be a &lt;em&gt;Grid.&lt;/em&gt;&amp;nbsp;In the following screenshot these rectangles are highlighted:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fResizeHandles.PNG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;When the window is opened, it fetches its Win32 handle:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;this.hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;&lt;/pre&gt;
&lt;p&gt;When you hold the left mouse button inside one of the resize rectangles, the resize message is sent to the operating system through a &lt;a href="http://pinvoke.net/default.aspx/user32.SendMessage" target="_blank"&gt;SendMessage&lt;/a&gt; call:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;SendMessage(this.hwndSource.Handle, 0x112, (IntPtr)(61440 + direction), IntPtr.Zero);&lt;/pre&gt;
&lt;p&gt;The resize code is based on &lt;a href="http://digitalmoosetracks.com/blog/wpf-transparent-window-with-resizing" target="_blank"&gt;this article&lt;/a&gt; by Joshua. Here's an overview of the relevant class members:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f12%2fResizeMembers.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;AllowsTransparency&lt;/em&gt; is&amp;nbsp;implemented through&amp;nbsp;a technique called 'layered windows'. If you type these keywords in your &lt;span style="color: #808080;"&gt;[insert favorite search engine here]&lt;/span&gt;, you'll immediately see that there are&amp;nbsp;some issues under Windows XP. Your user interface may run without hardware acceleration on older XP releases, and it definitely ruins some WPF controls (tooltips, popups, comboboxes). There there are also issues with &lt;em&gt;WindowsFormHost&lt;/em&gt; controls, regardless of the operating system you use. &lt;em&gt;NoGdiWindow&lt;/em&gt; is aware or this, and has some defensive code around the property:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;if ((Environment.OSVersion.Version.Major &amp;gt; 5) &amp;amp; (!this.UsesWindowsFormsHost))
 {
    // Activate Transparency
  // ...
 }&lt;/pre&gt;
&lt;h2&gt;Code&lt;/h2&gt;
&lt;p&gt;Here's the sample project :&lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2011%2f12%2fU2UConsult.WPF.NoGdiWindow.zip"&gt;U2UConsult.WPF.NoGdiWindow.zip (1.31 mb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</description><pubDate>Thu, 15 Dec 2011 01:08:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2011/12/15/Building-WPF-forms-without-GDI-decoration.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=5df48b3b-8429-4ae8-9050-df54f1fe5852</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=5df48b3b-8429-4ae8-9050-df54f1fe5852</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2011/12/15/Building-WPF-forms-without-GDI-decoration.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=5df48b3b-8429-4ae8-9050-df54f1fe5852</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=2a35da71-b547-4f3e-a027-b6f3239a8492</guid><link>http://blogs.u2u.be/diederik/post/2011/11/14/null.aspx</link><category>Metro</category><category>WinRT</category><title>A BooleanToVisibilityConverter for WinRT </title><description>&lt;p&gt;This article describes a reversible boolean-to-visibility valueconverter for WinRT and Metro.&lt;/p&gt;
&lt;p&gt;Silverlight and WPF share lots of common ground, but Silverlight is restricted by the (lack of) complexity in its host, and certainly by the size of its footprint. As a result, Silverlight is missing some essential functionality: there's quite a lot of classes that we need to manually add to&amp;nbsp;each and every project. WinRT and its Metro GUI are&amp;nbsp;hardly restricted by footprint size, but they're still&amp;nbsp;a lot closer&amp;nbsp;to Silverlight than to the -ok, somewhat bloated- WPF.&lt;/p&gt;
&lt;p&gt;As a result, WinRT is also missing some of that essential functionality. One example is the lack of a BooleanToVisibilityConverter. Any application that applies the MVVM pattern definitely has some places where&amp;nbsp;boolean properties of a viewmodel determine whether or not parts of the GUI will be displayed. This is typically done through a valueconverter that translates&amp;nbsp;boolean&amp;nbsp;values into a&amp;nbsp;Visibility. WPF has such a converter, but these ten lines of code seem to be too heavy for Silverlight and WinRT &lt;img title="Undecided" src="http://blogs.u2u.be/diederik/editors/tiny_mce_3_4_3_1/plugins/emotions/img/smiley-undecided.gif" alt="Undecided" border="0" /&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, here's my version of a reversible converter for WinRT and Metro. It's based on Kent Boogaart's &lt;a href="http://kentb.blogspot.com/2011/02/booleantovisibilityconverter.html" target="_blank"&gt;mother of all BooleanToVisibility converters&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;namespace Mvvm
{
    using System;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Data;

    /// &amp;lt;summary&amp;gt;
    /// Converts a Boolean into a Visibility.
    /// &amp;lt;/summary&amp;gt;
    public class BooleanToVisibilityConverter : IValueConverter
    {
        /// &amp;lt;summary&amp;gt;
        /// If set to True, conversion is reversed: True will become Collapsed.
        /// &amp;lt;/summary&amp;gt;
        public bool IsReversed { get; set; }

        public object Convert(object value, string typeName, object parameter, string language)
        {
            var val = System.Convert.ToBoolean(value);
            if (this.IsReversed) 
            {
                val = !val;
            }

            if (val) 
            {
                return Visibility.Visible; 
            }

            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, string typeName, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }
}&lt;/pre&gt;
&lt;p&gt;You probably&amp;nbsp;need one of each (True-to-Visible and False-to-Visible), and use these converters in a lot of different places.&amp;nbsp;So it'a good idea to define the following&amp;nbsp;application level resources, in App.xaml:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Application xmlns="..."
             xmlns:x="..."
             xmlns:mvvm="using:Mvvm"
             x:Class="..."&amp;gt;
    &amp;lt;Application.Resources&amp;gt;
        &amp;lt;mvvm:BooleanToVisibilityConverter x:Key="TrueToVisibleConverter" /&amp;gt;
        &amp;lt;mvvm:BooleanToVisibilityConverter x:Key="FalseToVisibleConverter" IsReversed="True" /&amp;gt;
    &amp;lt;/Application.Resources&amp;gt;
&amp;lt;/Application&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;Your viewmodels just need to define a boolean property, and notify its&amp;nbsp;changes (see &lt;a href="http://blogs.u2u.be/diederik/post/2011/10/27/A-core-MVVM-framework-for-WinRT.aspx"&gt;my previous article&lt;/a&gt;&amp;nbsp;for the change notification methods):&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public bool IsDay
{
    get { return isDay; }
    set
    {
        isDay = value;
        this.PropertyChanged.Raise(this, o =&amp;gt; o.IsDay);
    }
}&lt;/pre&gt;
&lt;p&gt;Now the views can easily bind to the property and let the converters do&amp;nbsp;their stuff:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Image Source="/Images/Day.jpg"
        Visibility="{Binding IsDay, Converter={StaticResource TrueToVisibleConverter}}" /&amp;gt;

&amp;lt;Image Source="/Images/Night.jpg"
        Visibility="{Binding IsDay, Converter={StaticResource FalseToVisibleConverter}}" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;Here are some screenshots from the attached sample project:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f11%2fDay.png" alt="" width="50%" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f11%2fNight.png" alt="" width="50%" /&gt;&lt;/p&gt;
&lt;p&gt;And here's the whole code: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2011%2f11%2fU2UConsult.WinRT.Boolean2Visibility.zip"&gt;U2UConsult.WinRT.Boolean2Visibility.zip (311.89 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</description><pubDate>Mon, 14 Nov 2011 18:09:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2011/11/14/null.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=2a35da71-b547-4f3e-a027-b6f3239a8492</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=2a35da71-b547-4f3e-a027-b6f3239a8492</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2011/11/14/null.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=2a35da71-b547-4f3e-a027-b6f3239a8492</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=4fb43b0b-daa8-4e53-b90b-db0e3a65c88d</guid><link>http://blogs.u2u.be/diederik/post/2011/10/27/A-core-MVVM-framework-for-WinRT.aspx</link><category>Metro</category><category>WinRT</category><title>A core MVVM framework for WinRT</title><description>&lt;p&gt;This article presents a core MVVM framework for building Metro applications on the WinRT runtime.&lt;/p&gt;
&lt;p&gt;With the WinRT runtime, Microsoft launched its fourth XAML-based platform - after WPf, Silverlight, and the Windows Phone. It's the fourth time they strongly advice development teams all over the world to get the maximum out of the power of XAML bindings, hence use the MVVM pattern in their applications. Strangely enough it's also the fourth time that they ship a runtime without the basic support for that same pattern. So it's up to the developers community to fill the gap.&lt;/p&gt;
&lt;p&gt;The gap will be filled rapidly. While Microsoft Patterns &amp;amp; Practice's Prism team is &lt;a href="http://compositewpf.codeplex.com/discussions/261609"&gt;still hesitating&lt;/a&gt;, Laurent Bugnion with his &lt;a href="http://mvvmlight.codeplex.com/"&gt;MVVM Light Toolkit&amp;nbsp;&lt;/a&gt; and Rob Eisenberg with &lt;a href="http://caliburnmicro.codeplex.com/"&gt;Caliburn Micro&lt;/a&gt; are definitely going for a WinRT version of their popular frameworks. But we're not going to sit and wait for these frameworks, are we? We want to start developing MVVM applications (in Metro-speak they're called 'apps') here and now.&lt;/p&gt;
&lt;p&gt;In my ever humble opinion, the following three are the core requirements for using MVVM in an application :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Raising the PropertyChanged event should be easy and typesafe.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defining a bindable command in a ViewModel should be easy and typesafe.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Messaging between components should be easy and typesafe, and not create memory leaks.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I gleaned a core MVVM-framework with just three files - one for each requirement:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f10%2fframework.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The namespace is Mvvm, so you can start each source code file with 'using Mvvm;'. Your manager will be impressed.&lt;img title="Wink" src="http://blogs.u2u.be/diederik/editors/tiny_mce_3_4_3_1/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /&gt;&lt;/p&gt;
&lt;h1&gt;Change Notification&lt;/h1&gt;
&lt;p&gt;&lt;br /&gt;Most frameworks provide a base class that implements INotifyPropertyChanged. I'm a bit reluctant to use a scarse resource like inheritance- for such a triviality like just raising a standard event. Extension methods are much more flexible:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;namespace Mvvm
{
    using System;
    using System.Collections.Generic;
    using System.Linq.Expressions;
    using Windows.UI.Xaml.Data;

    /// &amp;lt;summary&amp;gt;
    /// Generic extension methods used by the framework.
    /// &amp;lt;/summary&amp;gt;
    public static class ExtensionMethods
    {
        /// &amp;lt;summary&amp;gt;
        /// Raises the PropertyChanged event.
        /// &amp;lt;/summary&amp;gt;
        public static void Raise&amp;lt;T, P&amp;gt;(this PropertyChangedEventHandler pc, T source, Expression&amp;lt;Func&amp;lt;T, P&amp;gt;&amp;gt; pe)
        {
            if (pc != null)
            {
                pc.Invoke(source,
                    new PropertyChangedEventArgs(((MemberExpression)pe.Body).Member.Name));
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Raises the PropertyChanged event for all properties.
        /// &amp;lt;/summary&amp;gt;
        public static void RaiseAll&amp;lt;T&amp;gt;(this PropertyChangedEventHandler pc, T source)
        {
            if (pc != null)
            {
                pc.Invoke(source, new PropertyChangedEventArgs(string.Empty));
            }
        }
    }
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Here's how a typical property looks like in a viewmodel or a model that implements INotifyPropertyChanged. Broadcasting a property value change&amp;nbsp;is easy, &amp;agrave;nd you get Intellisense support:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;private string message

public string Message
{
    get { return this.message; }
    set
    {
        this.message = value;
        this.PropertyChanged.Raise(this, o =&amp;gt; o.Message);
    }
}&lt;/pre&gt;
&lt;p&gt;It also&amp;nbsp;definitely makes a good candidate for a code snippet...&lt;/p&gt;
&lt;h1&gt;Command binding&lt;/h1&gt;
&lt;p&gt;&lt;br /&gt;Most frameworks have an implementation of ICommand to be used specifically in viewmodels. Microsoft's RoutedCommand makes no sense there. Caliburn uses a radically different paradigm based on triggers and actions - the result is the same but it's further away from MVVM. The ICommand implementations in Prism and MVVM Light Toolkit have a constructor with just delegates for the Executed and CanExecute members. I prefer the RelayCommand implementation of the MVVM Light Toolkit, but I also prefer to call it DelegateCommand (sorry, Laurent) - the Prism terminology.&lt;/p&gt;
&lt;p&gt;It's easy to use and it comes with a generic version:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;namespace Mvvm
{
    using System;
    using System.Diagnostics;
    using System.Diagnostics.CodeAnalysis;

    using Windows.UI.Xaml.Input;
    using EventHandler = Windows.UI.Xaml.EventHandler;

    public class DelegateCommand : ICommand
    {
        private readonly Action _execute;

        private readonly Func&amp;lt;bool&amp;gt; _canExecute;

        /// &amp;lt;summary&amp;gt;
        /// Initializes a new instance of the DelegateCommand class that 
        /// can always execute.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="execute"&amp;gt;The execution logic.&amp;lt;/param&amp;gt;
        /// &amp;lt;exception cref="ArgumentNullException"&amp;gt;If the execute argument is null.&amp;lt;/exception&amp;gt;
        public DelegateCommand(Action execute)
            : this(execute, null)
        {
        }

        /// &amp;lt;summary&amp;gt;
        /// Initializes a new instance of the DelegateCommand class.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="execute"&amp;gt;The execution logic.&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="canExecute"&amp;gt;The execution status logic.&amp;lt;/param&amp;gt;
        /// &amp;lt;exception cref="ArgumentNullException"&amp;gt;If the execute argument is null.&amp;lt;/exception&amp;gt;
        public DelegateCommand(Action execute, Func&amp;lt;bool&amp;gt; canExecute)
        {
            if (execute == null)
            {
                throw new ArgumentNullException("execute");
            }

            _execute = execute;
            _canExecute = canExecute;
        }

        /// &amp;lt;summary&amp;gt;
        /// Occurs when changes occur that affect whether the command should execute.
        /// &amp;lt;/summary&amp;gt;
        public event EventHandler CanExecuteChanged;

        /// &amp;lt;summary&amp;gt;
        /// Raises the &amp;lt;see cref="CanExecuteChanged" /&amp;gt; event.
        /// &amp;lt;/summary&amp;gt;
        [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate",
            Justification = "This cannot be an event")]
        public void RaiseCanExecuteChanged()
        {
            var handler = CanExecuteChanged;
            if (handler != null)
            {
                handler(this, EventArgs.Empty);
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Defines the method that determines whether the command can execute in its current state.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="parameter"&amp;gt;This parameter will always be ignored.&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;true if this command can be executed; otherwise, false.&amp;lt;/returns&amp;gt;
        [DebuggerStepThrough]
        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute();
        }

        /// &amp;lt;summary&amp;gt;
        /// Defines the method to be called when the command is invoked. 
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="parameter"&amp;gt;This parameter will always be ignored.&amp;lt;/param&amp;gt;
        public void Execute(object parameter)
        {
            if (CanExecute(parameter))
            {
                _execute();
            }
        }
    }
}&lt;/pre&gt;
&lt;p&gt;Here's how to use the DelegateCommand. The ViewModel defines a command by providing just delegates, and provides implementations:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public ICommand UpdateTextCommand
{
    get
    {
        return new DelegateCommand(this.UpdateTextCommand_Executed);
    }
}

private void UpdateTextCommand_Executed()
{
    // Command Logic
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The View can bind to that command in XAML, no code-behind is needed:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Button Content="Update Text" Command="{Binding UpdateTextCommand}" /&amp;gt;&lt;/pre&gt;
&lt;h1&gt;Event Aggregation&lt;/h1&gt;
&lt;p&gt;&lt;br /&gt;In an application that consists of different loosely-coupled components that need to publish and subscribe to events, it's not a good idea to rely on regular .NET events. More info can be found &lt;a href="http://blogs.u2u.be/diederik/post/2011/01/15/Using-the-Prism-40-Event-Aggregator.aspx"&gt;here&lt;/a&gt;. A so-called event aggregator is a much better solution. Prism's event aggregator may be the most powerful on the market, but the one from Caliburn Micro is easier to extract out of its framework. I just added the singleton pattern because I don't want to introduce an Inversion-of-Control container and bootstrappers in my three-file-framework.&lt;/p&gt;
&lt;p&gt;Here's the full code of the Event Aggregator:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;namespace Mvvm
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;

    /// &amp;lt;summary&amp;gt;
    ///   A marker interface for classes that subscribe to messages.
    /// &amp;lt;/summary&amp;gt;
    public interface IHandle { }

    /// &amp;lt;summary&amp;gt;
    ///   Denotes a class which can handle a particular type of message.
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;typeparam name = "TMessage"&amp;gt;The type of message to handle.&amp;lt;/typeparam&amp;gt;
    public interface IHandle&amp;lt;TMessage&amp;gt; : IHandle
    {
        /// &amp;lt;summary&amp;gt;
        ///   Handles the message.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name = "message"&amp;gt;The message.&amp;lt;/param&amp;gt;
        void Handle(TMessage message);
    }

    /// &amp;lt;summary&amp;gt;
    ///   Enables loosely-coupled publication of and subscription to events.
    /// &amp;lt;/summary&amp;gt;
    public interface IEventAggregator
    {
        /// &amp;lt;summary&amp;gt;
        ///   Gets or sets the default publication thread marshaller.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        ///   The default publication thread marshaller.
        /// &amp;lt;/value&amp;gt;
        Action&amp;lt;System.Action&amp;gt; PublicationThreadMarshaller { get; set; }

        /// &amp;lt;summary&amp;gt;
        ///   Subscribes an instance to all events declared through implementations of &amp;lt;see cref = "IHandle{T}" /&amp;gt;
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name = "instance"&amp;gt;The instance to subscribe for event publication.&amp;lt;/param&amp;gt;
        void Subscribe(object instance);

        /// &amp;lt;summary&amp;gt;
        ///   Unsubscribes the instance from all events.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name = "instance"&amp;gt;The instance to unsubscribe.&amp;lt;/param&amp;gt;
        void Unsubscribe(object instance);

        /// &amp;lt;summary&amp;gt;
        ///   Publishes a message.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name = "message"&amp;gt;The message instance.&amp;lt;/param&amp;gt;
        /// &amp;lt;remarks&amp;gt;
        ///   Uses the default thread marshaller during publication.
        /// &amp;lt;/remarks&amp;gt;
        void Publish(object message);

        /// &amp;lt;summary&amp;gt;
        ///   Publishes a message.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name = "message"&amp;gt;The message instance.&amp;lt;/param&amp;gt;
        /// &amp;lt;param name = "marshal"&amp;gt;Allows the publisher to provide a custom thread marshaller for the message publication.&amp;lt;/param&amp;gt;
        void Publish(object message, Action&amp;lt;System.Action&amp;gt; marshal);
    }

    /// &amp;lt;summary&amp;gt;
    ///   Enables loosely-coupled publication of and subscription to events.
    /// &amp;lt;/summary&amp;gt;
    public class EventAggregator : IEventAggregator
    {
        /// &amp;lt;summary&amp;gt;
        ///   The default thread marshaller used for publication;
        /// &amp;lt;/summary&amp;gt;
        public static Action&amp;lt;System.Action&amp;gt; DefaultPublicationThreadMarshaller = action =&amp;gt; action();

        private static IEventAggregator instance;
        
        readonly List&amp;lt;Handler&amp;gt; handlers = new List&amp;lt;Handler&amp;gt;();

        /// &amp;lt;summary&amp;gt;
        ///   Initializes a new instance of the &amp;lt;see cref = "EventAggregator" /&amp;gt; class.
        /// &amp;lt;/summary&amp;gt;
        public EventAggregator()
        {
            PublicationThreadMarshaller = DefaultPublicationThreadMarshaller;
        }

        /// &amp;lt;summary&amp;gt;
        /// Gets the singleton instance.
        /// &amp;lt;/summary&amp;gt;
        public static IEventAggregator Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new EventAggregator();
                }
                return instance;
            }
        }

        /// &amp;lt;summary&amp;gt;
        ///   Gets or sets the default publication thread marshaller.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;value&amp;gt;
        ///   The default publication thread marshaller.
        /// &amp;lt;/value&amp;gt;
        public Action&amp;lt;System.Action&amp;gt; PublicationThreadMarshaller { get; set; }

        /// &amp;lt;summary&amp;gt;
        ///   Subscribes an instance to all events declared through implementations of &amp;lt;see cref = "IHandle{T}" /&amp;gt;
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name = "instance"&amp;gt;The instance to subscribe for event publication.&amp;lt;/param&amp;gt;
        public virtual void Subscribe(object instance)
        {
            lock (handlers)
            {
                if (handlers.Any(x =&amp;gt; x.Matches(instance)))
                    return;

                handlers.Add(new Handler(instance));
            }
        }

        /// &amp;lt;summary&amp;gt;
        ///   Unsubscribes the instance from all events.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name = "instance"&amp;gt;The instance to unsubscribe.&amp;lt;/param&amp;gt;
        public virtual void Unsubscribe(object instance)
        {
            lock (handlers)
            {
                var found = handlers.FirstOrDefault(x =&amp;gt; x.Matches(instance));

                if (found != null)
                    handlers.Remove(found);
            }
        }

        /// &amp;lt;summary&amp;gt;
        ///   Publishes a message.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name = "message"&amp;gt;The message instance.&amp;lt;/param&amp;gt;
        /// &amp;lt;remarks&amp;gt;
        ///   Does not marshall the the publication to any special thread by default.
        /// &amp;lt;/remarks&amp;gt;
        public virtual void Publish(object message)
        {
            Publish(message, PublicationThreadMarshaller);
        }

        /// &amp;lt;summary&amp;gt;
        ///   Publishes a message.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name = "message"&amp;gt;The message instance.&amp;lt;/param&amp;gt;
        /// &amp;lt;param name = "marshal"&amp;gt;Allows the publisher to provide a custom thread marshaller for the message publication.&amp;lt;/param&amp;gt;
        public virtual void Publish(object message, Action&amp;lt;System.Action&amp;gt; marshal)
        {
            Handler[] toNotify;
            lock (handlers)
                toNotify = handlers.ToArray();

            marshal(() =&amp;gt;
            {
                var messageType = message.GetType();

                var dead = toNotify
                    .Where(handler =&amp;gt; !handler.Handle(messageType, message))
                    .ToList();

                if (dead.Any())
                {
                    lock (handlers)
                    {
                        dead.Apply(x =&amp;gt; handlers.Remove(x));
                    }
                }
            });
        }

        protected class Handler
        {
            readonly WeakReference reference;
            readonly Dictionary&amp;lt;TypeInfo, MethodInfo&amp;gt; supportedHandlers = new Dictionary&amp;lt;TypeInfo, MethodInfo&amp;gt;();

            public Handler(object handler)
            {
                reference = new WeakReference(handler);

                var handlerInfo = typeof(IHandle).GetTypeInfo();
                var interfaces = handler.GetType().GetTypeInfo().ImplementedInterfaces
                    .Where(x =&amp;gt; handlerInfo.IsAssignableFrom(x.GetTypeInfo()) &amp;amp;&amp;amp; x.IsGenericType);

                foreach (var @interface in interfaces)
                {
                    var type = @interface.GenericTypeArguments[0];
                    var method = @interface.GetTypeInfo().DeclaredMethods.First(x =&amp;gt; x.Name == "Handle");
                    supportedHandlers[type.GetTypeInfo()] = method;
                }
            }

            public bool Matches(object instance)
            {
                return reference.Target == instance;
            }

            public bool Handle(Type messageType, object message)
            {
                var target = reference.Target;
                if (target == null)
                    return false;

                var typeInfo = messageType.GetTypeInfo();

                foreach (var pair in supportedHandlers)
                {
                    if (pair.Key.IsAssignableFrom(typeInfo))
                    {
                        pair.Value.Invoke(target, new[] { message });
                        return true;
                    }
                }

                return true;
            }
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// Generic extension methods used by the framework.
    /// &amp;lt;/summary&amp;gt;
    public static class EventAggregatorExtensionMethods
    {
        /// &amp;lt;summary&amp;gt;
        /// Applies the action to each element in the list.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;typeparam name="T"&amp;gt;The enumerable item's type.&amp;lt;/typeparam&amp;gt;
        /// &amp;lt;param name="enumerable"&amp;gt;The elements to enumerate.&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="action"&amp;gt;The action to apply to each item in the list.&amp;lt;/param&amp;gt;
        public static void Apply&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; enumerable, Action&amp;lt;T&amp;gt; action)
        {
            foreach (var item in enumerable)
                action(item);
        }
    }
}&lt;/pre&gt;
&lt;p&gt;Here's how to use it. Please note that&amp;nbsp;I'm just passing messages of type String, you might want to define your own event payload classes. A publisher just needs to get a reference to the central even handler, and publish its message:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;EventAggregator.Instance.Publish(this.Message);&lt;/pre&gt;
&lt;p&gt;The subscriber registers himself to the same event aggregator. He specifies the type of message he's interested in by implementing the IHandle&amp;lt;T&amp;gt; interface:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;class SubscriberViewModel : INotifyPropertyChanged, IHandle&amp;lt;string&amp;gt;
{ 
    public SubscriberViewModel()
    {
        // Subscribe
        EventAggregator.Instance.Subscribe(this);
    }

    public void Handle(string message)
    {
        // Event handling comes here
    }
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;Publisher and subscriber never have a reference to each other, while the event aggregator uses weak references. This results in a memory-leak free pattern.&lt;/p&gt;
&lt;h1&gt;Sample&lt;/h1&gt;
&lt;p&gt;&lt;br /&gt;I built a small and simple application (oops, I did it again: app) to test drive the framework. Here's how it looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f10%2fScreenShot.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;On the left side of the screen, there's a text balloon and a button. These belong to the publisher. Clicking the button updates the Message property and&amp;nbsp;via the change notification&amp;nbsp;extension methods also the GUI. It sends the new value as message through the event aggregator.&amp;nbsp; The text balloon in the middle belongs to a subscriber that is instantiated using a view-first approach: the view instantiates its viewmodel. Typically this is done by defining its data context in XAML - but that does not seem to work yet, so I needed some code behind. The text balloon on the right belongs to another subscriber. This one is instantiated using the viewmodel-first approach. When the datacontext of a control is set to a viewmodel, the control decides what template to load. This is typically done with typed data templates in WPF, or with a value converter in Silverlight. Since typed data templates are not available in Metro,&amp;nbsp;I used the Silverlight approach. [Note: The IValueConverter interface in Metro is different from its predecessors.] Both subscribers receive the message through the event aggregator subscription, and use the change notification extensions methods it to update their own Message property, populating the text balloon.&lt;/p&gt;
&lt;h1&gt;Source Code&lt;/h1&gt;
&lt;p&gt;&lt;br /&gt;Here's the full source code. It requires VS 2011 Developer Preview: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2011%2f10%2fU2UConsult.WinRT.MVVM.zip"&gt;U2UConsult.WinRT.MVVM.zip (205,86 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Thu, 27 Oct 2011 05:53:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2011/10/27/A-core-MVVM-framework-for-WinRT.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=4fb43b0b-daa8-4e53-b90b-db0e3a65c88d</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=4fb43b0b-daa8-4e53-b90b-db0e3a65c88d</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2011/10/27/A-core-MVVM-framework-for-WinRT.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=4fb43b0b-daa8-4e53-b90b-db0e3a65c88d</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=864a7a15-8e45-4c16-8c64-0dc4a8363401</guid><link>http://blogs.u2u.be/michael/post/2011/10/14/File-IO-in-Windows-8.aspx</link><category>Windows 8</category><category>XAML</category><category>Metro</category><title>File IO in Windows 8</title><description>&lt;p&gt;Let’s leave Windows Phone for a moment, and let’s have a look at Windows 8. Recently the U2U-team was present at the Microsoft Build-convention in Anaheim, California, where Microsoft unveiled Windows 8. Now, what we saw is still just a preview, but it clearly shows the direction in which Windows is evolving. Have a look at this video, to see Windows 8 in action : &lt;/p&gt; &lt;iframe height="360" src="http://www.youtube.com/embed/p92QfWOw88I?rel=0" frameborder="0" width="640" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The “new style” applications Windows 8 offers are “Metro”-applications (yes, like in Windows Phone Metro style), and these can be made using Xaml and managed code, or even using HTML5 + Javascript. Metro-apps will have to be installed through a marketplace, and are kind of sandboxed (Comparable to Silverlight, but different ;-)&amp;#160; ). One of the effects of this sandboxing is that your options for working with files are limited. You cannot just access any folder on your machine ! Unfortunately you’re also unable to use Isolated Storage. So what can you use ? Let’s start by writing info into the “Local Folder”.&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;Windows.Storage.ApplicationData appData = Windows.Storage.ApplicationData.Current;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;StorageFile file = await appData.LocalFolder.CreateFileAsync(&lt;span class="str"&gt;&amp;quot;EmployeeList.u2u&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;Windows.Storage.Streams.IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;No ordinary File here, but a StorageFile which I have to open to write in. The IRandomAccessStream I get back gives me the possibility to create an input- (for reading) or output-stream (for writing).&lt;/p&gt;

  &lt;pre class="csharpcode"&gt;IOutputStream output = stream.GetOutputStreamAt(0);&lt;/pre&gt;
  &lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;And then I got stuck. The IOutputStream gives me a WriteAsync-function, but it ask me for an IBuffer-object. How to write data ? Luckily there’s already some MSDN-documentation available. That tells me to use a DataWriter which takes the IOutputStream as a constructor-argument.&lt;/p&gt;

  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;DataWriter writer = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataWriter(output);&lt;/pre&gt;

    &lt;pre&gt;writer.WriteString(&lt;span class="str"&gt;&amp;quot;HERE GOES DATA&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;output.FlushAsync();&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;
  &lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;Not there yet ! The code I wrote starts fro; the assumption that File IO is much like the “ordinary” file IO: flush the stream and done. In Metro we have to ”commit” the data in the writer, and I have to start the flushing, so this is the working code :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;DataWriter writer = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataWriter(output);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;writer.WriteString(&lt;span class="str"&gt;&amp;quot;HERE GOES DATA&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;await writer.StoreAsync();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;output.FlushAsync().Start();    &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;statusTxt.Text = &lt;span class="str"&gt;&amp;quot;File Saved&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;They could have made it simpler &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.u2u.be/michael/image.axd?picture=wlEmoticon-smile_1.png" /&gt;. 

  &lt;br /&gt;By localfolder I assumed the bin/debug-folder. Nothing there. It seems my file is located in C:\Users\michael\AppData\Local\Packages\d64899f1-9800-470a-9cb3-fa89210f4941_qs0a8q7rnpy8j\LocalState.&lt;/p&gt;

&lt;p&gt;How about reading the file ? Well, simply reverse your writing-logic (writer becomes reader, output becomes input, store becomes load, …)&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;Windows.Storage.ApplicationData appData = Windows.Storage.ApplicationData.Current;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;var file = await appData.LocalFolder.GetFileAsync(&lt;span class="str"&gt;&amp;quot;EmployeeList.u2u&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;Windows.Storage.Streams.IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;IInputStream input = stream.GetInputStreamAt(0);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;DataReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataReader(input);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;var size = stream.Size;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;await reader.LoadAsync((&lt;span class="kwrd"&gt;uint&lt;/span&gt;)size);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;var data = reader.ReadString((&lt;span class="kwrd"&gt;uint&lt;/span&gt;)size);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;There you go! &lt;/p&gt;

&lt;p&gt;What about other folders than the “local” ? The KnownFolders=clqss gives me access to following locations :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Documents Library &lt;/li&gt;

  &lt;li&gt;Home Group &lt;/li&gt;

  &lt;li&gt;Media Server Devices (DLNA – Digital Living Network Alliance Devices, sounds interesting) &lt;/li&gt;

  &lt;li&gt;MusicLibrary &lt;/li&gt;

  &lt;li&gt;Pictures Library &lt;/li&gt;

  &lt;li&gt;Removable Devices &lt;/li&gt;

  &lt;li&gt;Videos Library &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s change the first 2 lines of my writing-code for using the documents library :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;StorageFolder doclib = Windows.Storage.KnownFolders.DocumentsLibrary;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;StorageFile file = await doclib.CreateFileAsync(&lt;span class="str"&gt;&amp;quot;EmployeeList.u2u&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;As soon as you start running your code, it will fail on the first line (no exception though, simply stops). That’s because you explicitly have to give the app the capability to access the Document library. Double-clicking on Package.appxmanifest allows you to do that : &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_15.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px 0px 0px 5px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_15.png" width="568" height="438" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Still: this time your app will stop on the second line. You also need to associate your app with the u2u-fileextension. This is also done in the appxmanifest-file in the declarations-tab where we add a filetype association declaration :&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_16.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px 0px 0px 5px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_16.png" width="473" height="475" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;There you go: the app works and saves my u2u-file in the doclibrary.&lt;/p&gt;

&lt;a href="https://twitter.com/share" class="twitter-share-button" data-count="horizontal" data-via="PiekenPuil"&gt;Tweet&lt;/a&gt;&lt;script type="text/javascript" src="//platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Fri, 14 Oct 2011 02:56:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/10/14/File-IO-in-Windows-8.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=864a7a15-8e45-4c16-8c64-0dc4a8363401</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=864a7a15-8e45-4c16-8c64-0dc4a8363401</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/10/14/File-IO-in-Windows-8.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=864a7a15-8e45-4c16-8c64-0dc4a8363401</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/u2u/post.aspx?id=b2fa6260-5d14-41c7-a56d-a738e33b2afc</guid><link>http://blogs.u2u.be/u2u/post/2011/10/06/Metro-Style-Applications-and-MVVM.aspx</link><category>Metro Style</category><title>Metro Style Applications and MVVM</title><description>&lt;p&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;When working with windows 8 on a tablet, you quickly notice the different ways a user can interact with your application. Your application can control the full screen, both in landscape or portrait, or can share the screen with an other application. Basically, there are four modes your application will need to support:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;Landscape&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;Portrait&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;Filled, i.e. when shared with an other application and our application receives the most space.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;Snapped, i.e. when shared with an other application and your application receives only a small amount of space to the side.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;There are several ways to achieve this. One way is to switch the visibility of several controls on and off in code. You can also use the VisualStateManager to achieve the same thing. But what if you want completely different views for different modes? The answer is MVVM.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;The first thing that we need to take care of is the fact that each ViewModel has up to four views that it can use to display its content. In order to do so I added a class ViewModel which has a property for each of the views:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;class ViewModel : INotifyPropertyChanged
{
    public DataTemplate LandscapeView { get; set; }
    public DataTemplate PortraitView { get; set; }
    public DataTemplate FilledView { get; set; }
    public DataTemplate SnappedView { get; set; }
}

public event PropertyChangedEventHandler PropertyChanged;

public void RaisePropertyChanged(string propertyName)
{
  if (PropertyChanged != null)
  {
    PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }
}&amp;nbsp;&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 4pt 0cm 0pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;Once&amp;nbsp;we know that every ViewModel has these properties,&amp;nbsp;we can set up our skeleton in MainPage.xaml&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;UserControl x:Class="SheetReader.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="768" d:DesignWidth="1366" Loaded="Page_Loaded" Unloaded="Page_Unloaded"&amp;gt;
  &amp;lt;Grid x:Name="LayoutRoot" Style="{StaticResource LayoutRootGridStyle}"&amp;gt;
    &amp;lt;ContentControl x:Name="MainContent" Content="{Binding}" /&amp;gt;
  &amp;lt;/Grid&amp;gt;
&amp;lt;/UserControl&amp;gt;&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 4pt 0cm 0pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;MainPage.xaml just contains a ContentControl bound to its DataContext, which is of type ViewModel. In the MainPage.xaml.cs file we can write the following code to switch between views:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;private void SetCurrentView()
{
  var orientation = DisplayProperties.CurrentOrientation;
  if (orientation == DisplayOrientations.Portrait ||
      orientation == DisplayOrientations.PortraitFlipped)
    MainContent.ContentTemplate = CurrentViewModel.PortraitView;
  else
  {
    var layout = ApplicationLayout.Value;
    if (layout == ApplicationLayoutState.Filled)
      MainContent.ContentTemplate = CurrentViewModel.FilledView;
    else if (layout == ApplicationLayoutState.Snapped)
      MainContent.ContentTemplate = CurrentViewModel.SnappedView;
    else
      MainContent.ContentTemplate = CurrentViewModel.LandscapeView;
  }
}&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 4pt 0cm 0pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;So by checking some of the properties, we can decide which View we want to use by setting the ContentTemplate property of the ContentControl we added in MainPage.xaml. &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;We should call this piece of code every time this page loads, changes orientation or has to change it&amp;rsquo;s layout when sharing the screen.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;private void Page_Loaded(object sender, RoutedEventArgs e)
{
  DisplayProperties.OrientationChanged += s =&amp;gt; SetCurrentView();
  ApplicationLayout.GetForCurrentView().LayoutChanged +=
                                                (s,e) =&amp;gt; SetCurrentView();
  SetCurrentView();
}&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 4pt 0cm 0pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;Then all we have to do is set the DataContext to some ViewModel:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public MainPage()
{
  InitializeComponent();
  this.DataContext = new SimpleViewModel();
}&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 4pt 0cm 0pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;So now we have a skeleton that shows the right View for our ViewModel, according to the mode your application might be in.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;All we have to do now is, creating ViewModels and wiring up their Views. We can specify our Views in App.xaml:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Application.Resources&amp;gt;
    &amp;lt;DataTemplate x:Key="SimpleLandscapeView"&amp;gt;
        ...
    &amp;lt;/DataTemplate&amp;gt;
    &amp;lt;DataTemplate x:Key="SimplePortraitView"&amp;gt;
        ...
    &amp;lt;/DataTemplate&amp;gt;
    &amp;lt;DataTemplate x:Key="SimpleFilledView"&amp;gt;
        ...
    &amp;lt;/DataTemplate&amp;gt;
    &amp;lt;DataTemplate x:Key="SimpleSnappedView"&amp;gt;
        ...
    &amp;lt;/DataTemplate&amp;gt;
&amp;lt;/Application.Resources&amp;gt;&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 4pt 0cm 0pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;For example we can bind to fewer properties in the SnappedView, than in the LandscapeView, or we can organize our data in a different way when the device is in Portrait mode.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 4pt 0cm 0pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 4pt 0cm 0pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;Once we are done with this, we can retrieve them in our ViewModel by setting the properties as follows:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public SimpleViewModel()
{
  ...

  this.LandscapeView = (DataTemplate)App.Current.Resources["SimpleLandscapeView"];
  this.PortraitView = (DataTemplate)App.Current.Resources["SimplePortraitView"];
  this.FilledView = (DataTemplate)App.Current.Resources["SimpleFilledView"];
  this.SnappedView = (DataTemplate)App.Current.Resources["SimpleSnappedView"];
}&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 4pt 0cm 0pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: Calibri;"&gt;Here is a example of a really simple ViewModel which has an Image property and a Text property, notice how the Snapped view doesn&amp;rsquo;t bind to the image.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 4pt 0cm 0pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div class="MsoNormal" style="margin: 4pt 0cm 0pt;"&gt;&amp;nbsp;LandscapeView:&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/u2u/image.axd?picture=2011%2f10%2fLandscape.png" alt="" width="648" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PortraitView:&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/u2u/image.axd?picture=2011%2f10%2fPortrait.png" alt="" height="648" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FilledView&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/u2u/image.axd?picture=2011%2f10%2fFilled.png" alt="" width="648" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SnappedView&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/u2u/image.axd?picture=2011%2f10%2fSnapped.png" alt="" width="648" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: black; line-height: 115%; font-family: 'Calibri','sans-serif'; font-size: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: JA; mso-bidi-language: AR-SA;" lang="EN-US"&gt;For more detailed information you can download the source files: &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/u2u/file.axd?file=2011%2f10%2fMetroAndMVVM.zip"&gt;MetroAndMVVM.zip (133,29 kb)&lt;/a&gt;&lt;/p&gt;</description><pubDate>Thu, 06 Oct 2011 05:34:00 -1300</pubDate><comments>http://blogs.u2u.be/u2u/post/2011/10/06/Metro-Style-Applications-and-MVVM.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Lander Verhack</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/u2u/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/u2u/post.aspx?id=b2fa6260-5d14-41c7-a56d-a738e33b2afc</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/u2u/trackback.axd?id=b2fa6260-5d14-41c7-a56d-a738e33b2afc</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/u2u/post/2011/10/06/Metro-Style-Applications-and-MVVM.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/u2u/syndication.axd?post=b2fa6260-5d14-41c7-a56d-a738e33b2afc</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=29442932-ace7-465a-a8ee-ed4f2d43f995</guid><link>http://blogs.u2u.be/michael/post/2011/08/31/Creating-WP7-prototypes-with-Sketchflow.aspx</link><title>Creating WP7 prototypes with Sketchflow</title><description>&lt;p&gt;With the upcoming release of Windows Phone Mango, you can create prototypes for Phone apps with Sketchflow. For people not knowing Sketchflow : it allows you to create prototypes that look like they have been drawn. When you present a &amp;ldquo;normal&amp;rdquo; prototype to a customer you get conversations like this :&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;Nice protoype, how long before you can deliver us the final product ?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #9b00d3;"&gt;I estimate we can deliver within 4 months.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;What ?&amp;nbsp;You created this prototype in just 3 days, it looks like it&amp;rsquo;s almost finished. How can it possibly take 4 months for completing ?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #000000;"&gt;A sketchflow prototype looks more &amp;ldquo;unfinished&amp;rdquo;. It&amp;rsquo;s not new, it has been around for WPF and silverlight, but you can now also get the projecttemplate for WP7 for using in Blend. Just go to &lt;a title="http://wp7sketchflow.codeplex.com/" href="http://wp7sketchflow.codeplex.com/"&gt;http://wp7sketchflow.codeplex.com/&lt;/a&gt;, download and install. Beware : you can only use this thing if you have the full paid version of Blend. The one you get for free with the phone developers tool will not do. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #000000;"&gt;OK. Let&amp;rsquo;s open up Blend and create a Windows Phone SketchFlow application :&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_6.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_6.png" alt="image" width="421" height="385" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This project directly creates some an empty screen for my app&amp;nbsp; and a fake start-up screen:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_7.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_7.png" alt="image" width="241" height="383" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also get an overview how I can move (&amp;ldquo;Flow&amp;rdquo;) between the different screens:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_8.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_8.png" alt="image" width="336" height="141" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I created a little prototype for an application I sometimes create during WP7-courses : a complaints-application for my city (the well-know megacity Serskamp in Belgium). This application allows me to signal stuff like defective traffic lights a.o. I also need to be able to add a location (GPS) and a picture, and to track my filed complaints. I&amp;rsquo;m not going to create the app itself now, but just the screens.&lt;/p&gt;
&lt;p&gt;I start by adding a Panorama on my start screen. This thing automatically gets 2 Panorama-items. The design of my item looks like this :&lt;/p&gt;
&lt;table style="width: 400px;" border="0" cellspacing="0" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="200"&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_9.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_9.png" alt="image" width="261" height="451" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td valign="top" width="200"&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_10.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_10.png" alt="image" width="258" height="455" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For the data I created a demo-datasource in the data-tab:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_11.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_11.png" alt="image" width="261" height="375" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;got some trouble for designing the second Panorama-item. Unlike Visual Studio, in which you simply have to select a Panorama-item for making it the active one, there&amp;rsquo;s no such thing in Blend. Or at least I didn&amp;rsquo;t find it. The only thing I could do was temporary setting the visibility of the other items to collapsed.&lt;/p&gt;
&lt;p&gt;Inside the Flow-panel I can select to add a new Connected screen. This way I create a screen for the follow-up of my complaints, and one for setting the location. I also create connections for returning to Screen 1, and remove the connection from my new screens to Search and AppList.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_12.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_12.png" alt="image" width="440" height="178" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Follow-up screen looks like this :&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_13.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_13.png" alt="image" width="230" height="397" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For finishing I also change the start-screen, and I&amp;rsquo;m done.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_14.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_14.png" alt="image" width="198" height="346" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now I&amp;rsquo;ve finished my SketchFlow-prototype, there&amp;rsquo;s 2 thing I can do : print it, or run it. In the File-menu you have an option for exporting to Word. This will export all your designs and add a table of contents :&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/file.axd?file=2011%2f8%2fWindowsPhonePrototype2.doc"&gt;WindowsPhonePrototype2.doc (1,28 mb)&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Creating a SketchFlow-prototype is essentially creating a Silverlight-application. This gives you a way of &amp;ldquo;running&amp;rdquo; the app, so you can demonstrate it to your customer (see video)&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;iframe width="425" height="349" src="http://www.youtube.com/embed/Un4YMn6kDU8?hl=nl&amp;fs=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Is that cool, or what ?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;br/&gt;
&lt;a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="piekenpuil" data-related="u2u"&gt;Tweet&lt;/a&gt;&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Wed, 31 Aug 2011 01:47:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/08/31/Creating-WP7-prototypes-with-Sketchflow.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=29442932-ace7-465a-a8ee-ed4f2d43f995</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">4</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=29442932-ace7-465a-a8ee-ed4f2d43f995</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/08/31/Creating-WP7-prototypes-with-Sketchflow.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=29442932-ace7-465a-a8ee-ed4f2d43f995</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/peter/post.aspx?id=dab925ea-7681-4412-a186-e4f8d60c4083</guid><link>http://blogs.u2u.be/peter/post/2011/08/30/Make-your-startup-task-a-Windows-Azure-startup-plugin-and-easily-re-use-it.aspx</link><title>Make your startup task a Windows Azure startup plugin and easily re-use it</title><description>&lt;p&gt;In a &lt;a href="http://blogs.u2u.be/peter/post/2011/07/12/Installing-requirements-using-Azure-startup-tasks.aspx"&gt;previous blog&lt;/a&gt; I showed you how to create a startup task to install certain requirements in Azure Compute. In this blog post I will show you how you can easily turn this startup task into a re-usable plugin. This post continues with the &lt;a href="http://blogs.u2u.be/peter/post/2011/07/12/Installing-requirements-using-Azure-startup-tasks.aspx"&gt;startup post&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Open the &lt;b&gt;UsingStartupTasks&lt;/b&gt; lab solution. Right-click on the HelloMVC3 project and select “&lt;b&gt;Open Folder in Windows Explorer&lt;/b&gt;”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_328.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_328.png" width="340" height="88" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Right-click the &lt;b&gt;StartupTasks&lt;/b&gt; folder and select &lt;b&gt;Copy&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;Open File Explorer and navigate to the Windows Azure SDK folder in Program files (at time of writing this is located on my machine at C:\Program Files\Windows Azure SDK\v1.4). Open the &lt;b&gt;bin&lt;/b&gt; folder, then the &lt;b&gt;plugins&lt;/b&gt; folder. &lt;b&gt;Paste&lt;/b&gt; the &lt;b&gt;StartupTasks&lt;/b&gt; folder here. Rename it to &lt;b&gt;MVC3&lt;/b&gt;. You should end up with something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_329.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_329.png" width="552" height="122" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As you can see, other Azure features also use this plugin model, for example Azure Connect uses this to install the proper network components in your azure role instance. &lt;/p&gt;  &lt;p&gt;Open the folder you just created. Inside it create a new file called &lt;b&gt;MVC3.csplugin&lt;/b&gt; (using notepad again, and take care that you use the right extension). Add following content to it (you can copy-paste most of it from the service definition file):&lt;/p&gt;  &lt;pre class="code"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;
&amp;lt;RoleModule  xmlns=&amp;quot;http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition&amp;quot;
 namespace=&amp;quot;U2U.WindowsAzure.Plugins.MVC3&amp;quot;&amp;gt;
  &amp;lt;Startup&amp;gt;
    &amp;lt;Task commandLine=&amp;quot;installmvc3.cmd&amp;quot; executionContext=&amp;quot;elevated&amp;quot; /&amp;gt;
  &amp;lt;/Startup&amp;gt;
  &amp;lt;ConfigurationSettings&amp;gt;
    &amp;lt;!-- None --&amp;gt;
  &amp;lt;/ConfigurationSettings&amp;gt;
  &amp;lt;Endpoints&amp;gt;
    &amp;lt;!-- None --&amp;gt;
  &amp;lt;/Endpoints&amp;gt;
  &amp;lt;Certificates&amp;gt;
    &amp;lt;!-- None --&amp;gt;
  &amp;lt;/Certificates&amp;gt;
&amp;lt;/RoleModule&amp;gt;&lt;/pre&gt;

&lt;p&gt;Go back to the service definition file. Remove your startup task, and add your plugin to the modules section:&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;xml &lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;encoding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ServiceDefinition &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;UsingStartupTasks&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;WebRole &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;HelloMVC3&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Sites&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Site &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Web&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;endpointName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Site&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Sites&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Endpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;InputEndpoint &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;protocol&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;port&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;80&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Endpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Imports&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Import &lt;/span&gt;&lt;span style="color: red"&gt;moduleName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Diagnostics&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Import &lt;/span&gt;&lt;span style="color: red"&gt;moduleName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;RemoteAccess&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Import &lt;/span&gt;&lt;span style="color: red"&gt;moduleName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;RemoteForwarder&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;
 &lt;strong&gt;     &amp;lt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #a31515"&gt;Import &lt;/span&gt;&lt;span style="color: red"&gt;moduleName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;MVC3&lt;/span&gt;&amp;quot; &lt;/strong&gt;&lt;span style="color: blue"&gt;&lt;strong&gt;/&amp;gt;&lt;/strong&gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Imports&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt;&amp;lt;Startup&amp;gt;
      &amp;lt;Task commandLine=&amp;quot;StartupTasks\installmvc.cmd&amp;quot; 
            executionContext=&amp;quot;elevated&amp;quot;
            taskType=&amp;quot;simple&amp;quot;
      /&amp;gt;
    &amp;lt;/Startup&amp;gt;&lt;/span&gt;&lt;span style="color: blue"&gt;--&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;WebRole&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ServiceDefinition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Right-click on the Cloud project and select Publish… The Deploy Windows Azure project dialog opens:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_330.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_330.png" width="452" height="426" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select your credentials, environment and storage account. &lt;/p&gt;

&lt;p&gt;Optionally you can configure remote desktop connections in case something went wrong, this will make it easier to see if MVC 3 was indeed installed.&lt;/p&gt;

&lt;p&gt;Click on Ok and wait…&lt;/p&gt;

&lt;p&gt;Deployment in Visual Studio should start:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_331.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_331.png" width="494" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait some more till complete (because the startup tasks are executing this will take a long time):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_332.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_332.png" width="609" height="116" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the Url. You should now see the MVC 3 screen!&lt;/p&gt;</description><pubDate>Tue, 30 Aug 2011 19:20:16 -1300</pubDate><comments>http://blogs.u2u.be/peter/post/2011/08/30/Make-your-startup-task-a-Windows-Azure-startup-plugin-and-easily-re-use-it.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Peter Himschoot</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/post.aspx?id=dab925ea-7681-4412-a186-e4f8d60c4083</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">8</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/peter/trackback.axd?id=dab925ea-7681-4412-a186-e4f8d60c4083</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/post/2011/08/30/Make-your-startup-task-a-Windows-Azure-startup-plugin-and-easily-re-use-it.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/syndication.axd?post=dab925ea-7681-4412-a186-e4f8d60c4083</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=c6c95e89-9fff-4cc3-8cc3-b61ee668dfb9</guid><link>http://blogs.u2u.be/michael/post/2011/08/11/The-return-of-SQL-CE.aspx</link><title>The return of SQL CE !</title><description>&lt;p&gt;After playing a few weeks with the Mango-beta, I’m even more convinced that the Windows Phone 7 simply is the best smartphone available. Driving in your car, receiving a text-message, and suddenly a voice over Bluetooth&amp;#160; asks me if the message should be read! And after the message has been read, it asks if I would like to dictate an answer (or call). How cool is that ? (unfortunately only in English for the moment, so when trying to dictate in Dutch, you get funny results ).&lt;/p&gt;  &lt;p&gt;One of the things that Mango brings is SQL Server CE. I remember using this on Windows Mobile, when you had to use stuff like SqlCeConnection, SqlCeCommand, etc… It seems that these classes are not existing on Mango, but of course we have Linq to SQL we can use. Using IsolatedStorageFile’s for storing data is nice, but having a “real” database for storing relational data is nicer. Still, during my experiment I saw that there are a few things missing to make life easier. It’s still in beta of course, so hopefully it will get added in the near future.&lt;/p&gt;  &lt;p&gt;I wanted to do a little trial showing the products and Categories out of the NorthWind-database. I decided to use SQL Integration Services for creating a SQL CE database for me, copying the needed data. Unfortunately this is not possible for CE. I needed to create the database and the tables myself. In the beta-version of Mango developer-tools it is yet impossible to select a SQLCE-file for item to add. I simply created it in a dummy console-app, and then copied it into my WP7-application. Double clicking on the sdf-file opens up the designer.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_2.png" width="175" height="106" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Adding a table is easy: Right-click the Tables-folder, select “Create Table” and you can start designing. This is what I created :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_3.png" width="600" height="496" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Specifying the Primary Key and the relationship between Products and Categories can be created by calling the table properties:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_4.png" width="606" height="501" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So far for the database structure. Copying the data from the “normal” Northwind to my CE-tables can be done through SQL Integration services. Now what about the LINQ to SQL classes ? No way of adding such an item in my project. The way to go, is like in the beginning of LINQ: use SQLMetal (You’ll find it here : C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin). The following command generates the necessary code:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;Sqlmetal /code:NorthWindCE.cs Northwind.sdf&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;The generated code look nice, but if your looking for any navigation-properties: nowhere to find…&lt;/p&gt;

&lt;p&gt;Next roadblock: I can only access databases stored in isolatedstorage. Makes sense, although it would be nice to be able to share data over multiple apps. Since there is no direct way of adding files for IsolatedStorage in VisualStudio, I wrote a bit of code for copying my sdf-file (which has been added as a resource) to IsolatedStorage:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CheckIsolatedStorageDb()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    var storage = IsolatedStorageFile.GetUserStoreForApplication();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (!storage.FileExists(&lt;span class="str"&gt;&amp;quot;NorthWind.sdf&amp;quot;&lt;/span&gt;))&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        Uri uri = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;&amp;quot;SQLTest;component/NorthWind.sdf&amp;quot;&lt;/span&gt;,UriKind.Relative);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        StreamResourceInfo info = App.GetResourceStream(uri);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (info!=&lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            Stream stream = info.Stream;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            BinaryReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; BinaryReader(stream);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[stream.Length];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            reader.Read(buffer, 0, Convert.ToInt32(stream.Length));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            reader.Dispose();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            IsolatedStorageFileStream iStream= storage.CreateFile(&lt;span class="str"&gt;&amp;quot;NorthWind.sdf&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            iStream.Write(buffer, 0, buffer.Length);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            iStream.Flush();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            iStream.Dispose();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            stream.Dispose();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;I call this function on Application_launch, and my sdf-file gets copied.&amp;#160; From now on I can start using my db, using LINQ. Let’s start by adding a listbox to our MainPage like this:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListBox&lt;/span&gt; &lt;span class="attr"&gt;DisplayMemberPath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ProductName&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Code looks like this :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PhoneApplicationPage_Loaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    db = &lt;span class="kwrd"&gt;new&lt;/span&gt; NorthWind(&lt;span class="str"&gt;&amp;quot;Data Source=isostore:/NorthWind.sdf&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataContext = from p &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Products&lt;/pre&gt;

  &lt;pre&gt;                       &lt;span class="kwrd"&gt;where&lt;/span&gt; p.UnitPrice &amp;lt; 20&lt;/pre&gt;

  &lt;pre class="alt"&gt;                       select p;    &lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;p&gt;As you can see, I provide a connectionstring pointing to Isolated storage, binding the datacontext to some LINQ-statement, and voila. &lt;/p&gt;

&lt;p&gt;Now what about navigating between categories and products ? First I extend my SQLmetal-generated code with these (copied these by generating code for the “big” Northwind) :&lt;/p&gt;

&lt;p&gt;In Products:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; EntityRef&amp;lt;Categories&amp;gt; _Category;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;[global::System.Data.Linq.Mapping.AssociationAttribute(Name = &lt;span class="str"&gt;&amp;quot;Category_Product&amp;quot;&lt;/span&gt;, Storage = &lt;span class="str"&gt;&amp;quot;_Category&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    ThisKey = &lt;span class="str"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;, OtherKey = &lt;span class="str"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;, IsForeignKey = &lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Categories Category&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    get&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;._Category.Entity;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    set&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        Categories previousValue = &lt;span class="kwrd"&gt;this&lt;/span&gt;._Category.Entity;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (((previousValue != &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                    || (&lt;span class="kwrd"&gt;this&lt;/span&gt;._Category.HasLoadedOrAssignedValue == &lt;span class="kwrd"&gt;false&lt;/span&gt;)))&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.SendPropertyChanging();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((previousValue != &lt;span class="kwrd"&gt;null&lt;/span&gt;))&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                &lt;span class="kwrd"&gt;this&lt;/span&gt;._Category.Entity = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                previousValue.Products.Remove(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;._Category.Entity = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((&lt;span class="kwrd"&gt;value&lt;/span&gt; != &lt;span class="kwrd"&gt;null&lt;/span&gt;))&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                &lt;span class="kwrd"&gt;value&lt;/span&gt;.Products.Add(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                &lt;span class="kwrd"&gt;this&lt;/span&gt;._CategoryID = &lt;span class="kwrd"&gt;value&lt;/span&gt;.CategoryID;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                &lt;span class="kwrd"&gt;this&lt;/span&gt;._CategoryID = &lt;span class="kwrd"&gt;default&lt;/span&gt;(Nullable&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.SendPropertyChanged(&lt;span class="str"&gt;&amp;quot;Category&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt; And in Categories:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; EntitySet&amp;lt;Products&amp;gt; _Products;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;[global::System.Data.Linq.Mapping.Association(Name=&lt;span class="str"&gt;&amp;quot;Category_Product&amp;quot;&lt;/span&gt;, Storage=&lt;span class="str"&gt;&amp;quot;_Products&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    ThisKey=&lt;span class="str"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;, OtherKey=&lt;span class="str"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; EntitySet&amp;lt;Products&amp;gt; Products &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;._Products; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    set { &lt;span class="kwrd"&gt;this&lt;/span&gt;._Products.Assign(&lt;span class="kwrd"&gt;value&lt;/span&gt;); }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Let’s now change our MainPage a little: I’ll have two Listboxes this time:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListBox&lt;/span&gt; &lt;span class="attr"&gt;DisplayMemberPath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;CategoryName&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;listBox2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListBox&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;listBox1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;DataContext&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=listBox2, Path=SelectedItem}&amp;quot;&lt;/span&gt;
         &lt;span class="attr"&gt;DisplayMemberPath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ProductName&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding Products}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Also set the datacontext to categories this time :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PhoneApplicationPage_Loaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    db = &lt;span class="kwrd"&gt;new&lt;/span&gt; NorthWind(&lt;span class="str"&gt;&amp;quot;Data Source=isostore:/NorthWind.sdf&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;this&lt;/span&gt;.DataContext = db.Categories;            &lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;p&gt;And thanks to the powers of databinding, I get all products from the category I select.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_5.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_5.png" width="247" height="316" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I’m already happy to have this in the beta, but I’d like to have some extras in the final version:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;- Give me an easy way of copying existing structures to my CE database&lt;/li&gt;

  &lt;li&gt;- Get me a way of creating my LINQ to SQL classes from within Visual Studio&lt;/li&gt;

  &lt;li&gt;- Make sure that my Navigation properties are being generated&lt;/li&gt;

  &lt;li&gt;- and give me something, so I can specify files to be directly saved in Isolated Storage. (Some Build Action ? Next to Resource, Content,… also an option IsolatedStorage ?)&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="piekenpuil" data-related="u2u"&gt;Tweet&lt;/a&gt;&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Thu, 11 Aug 2011 05:00:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/08/11/The-return-of-SQL-CE.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=c6c95e89-9fff-4cc3-8cc3-b61ee668dfb9</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=c6c95e89-9fff-4cc3-8cc3-b61ee668dfb9</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/08/11/The-return-of-SQL-CE.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=c6c95e89-9fff-4cc3-8cc3-b61ee668dfb9</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/peter/post.aspx?id=a75ddaa9-8d64-4a2b-927c-38f40e7e9e6f</guid><link>http://blogs.u2u.be/peter/post/2011/07/23/Excellent-intro-to-Windows-Azure.aspx</link><category>Azure</category><category>.NET Development</category><title>Excellent intro to Windows Azure</title><description>&lt;p&gt;If you want an excellent introduction into Windows Azure I can recommend “&lt;a href="http://oreilly.com/catalog/0790145309099"&gt;Windows Azure: Step by Step&lt;/a&gt;” from Roberto Brunetti. This book will teach you the basic components of Windows Azure and how to build an application with them. It will introduce you to Azure Compute, Azure Storage and Azure AppFabric Servicebus; in clear and easy-to-follow step-by-step instructions you build applications that use the different Azure features. In my opinion this is the best way to learn.&lt;/p&gt;  &lt;p&gt;Unfortunately this book doesn’t have space to delve deeper into some subjects (or you would need a &amp;gt;1000 pages book), so if you want to learn more about all the other things I recommend &lt;a href="http://www.u2u.be/CoursePage.aspx?CODE=UAZURE"&gt;our Azure training&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Sat, 23 Jul 2011 16:31:41 -1300</pubDate><comments>http://blogs.u2u.be/peter/post/2011/07/23/Excellent-intro-to-Windows-Azure.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Peter Himschoot</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/post.aspx?id=a75ddaa9-8d64-4a2b-927c-38f40e7e9e6f</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">7</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/peter/trackback.axd?id=a75ddaa9-8d64-4a2b-927c-38f40e7e9e6f</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/post/2011/07/23/Excellent-intro-to-Windows-Azure.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/syndication.axd?post=a75ddaa9-8d64-4a2b-927c-38f40e7e9e6f</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/peter/post.aspx?id=b20dd442-7dfd-4ee8-8d90-8c4bcc57b400</guid><link>http://blogs.u2u.be/peter/post/2011/07/20/Windows-Azure-Toolkit-for-social-games.aspx</link><category>Azure</category><category>VS2010</category><category>.NET Development</category><title>Windows Azure Toolkit for social games</title><description>&lt;p&gt;Marrying Azure and HTML5: Microsoft released today the Windows Azure Toolkit for social games: &lt;a title="http://blogs.msdn.com/b/windowsazure/archive/2011/07/20/build-your-next-game-with-the-windows-azure-toolkit-for-social-games.aspx" href="http://blogs.msdn.com/b/windowsazure/archive/2011/07/20/build-your-next-game-with-the-windows-azure-toolkit-for-social-games.aspx"&gt;http://blogs.msdn.com/b/windowsazure/archive/2011/07/20/build-your-next-game-with-the-windows-azure-toolkit-for-social-games.aspx&lt;/a&gt;&lt;/p&gt;</description><pubDate>Wed, 20 Jul 2011 16:01:30 -1300</pubDate><comments>http://blogs.u2u.be/peter/post/2011/07/20/Windows-Azure-Toolkit-for-social-games.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Peter Himschoot</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/post.aspx?id=b20dd442-7dfd-4ee8-8d90-8c4bcc57b400</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/peter/trackback.axd?id=b20dd442-7dfd-4ee8-8d90-8c4bcc57b400</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/post/2011/07/20/Windows-Azure-Toolkit-for-social-games.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/syndication.axd?post=b20dd442-7dfd-4ee8-8d90-8c4bcc57b400</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/peter/post.aspx?id=531ebc7c-c266-4623-9bf2-310f77243094</guid><link>http://blogs.u2u.be/peter/post/2011/07/12/Installing-requirements-using-Azure-startup-tasks.aspx</link><category>.NET Development</category><category>Azure</category><category>VS2010</category><title>Installing requirements using Azure startup tasks</title><description>&lt;p&gt;&lt;a href="http://www.microsoft.com/en-us/cloud/developer/resource.aspx?resourceId=what-is-windows-azure&amp;amp;fbid=n98rkLcZR6a&amp;amp;WT.srch=1&amp;amp;WT.mc_id=E5DACA7B-0C88-4170-9E5C-5C44A225C680&amp;amp;CR_SCC=200028940"&gt;Windows Azure&lt;/a&gt; deploys your azure web or worker role in the cloud, on a machine with Windows Server 2008 and .NET 4 pre-installed. But what if you need an additional requirement? What if you need to &lt;a href="http://blogs.u2u.be/peter/post/2011/05/20/Creating-and-Using-Custom-Performance-Counters-in-Windows-Azure.aspx"&gt;install some performance&lt;/a&gt; counter, or if you need some other piece of software like the media encoder? Then you can use a startup task to get the job done. In this blog post you will create a simple web role using &lt;a href="http://www.asp.net/mvc"&gt;ASP.NET MVC 3&lt;/a&gt;, then add a startup task to ensure MVC 3 is also installed on the Azure instance. For this walkthrough you’ll need Visual Studio 2010 and &lt;a href="http://www.asp.net/mvc"&gt;ASP.NET MVC 3&lt;/a&gt;. You’ll also need the standalone MVC 3 installer, which you can find &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=4211"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Step 1: Create the Azure solution.&lt;/h3&gt;  &lt;p&gt;Start by creating a &lt;b&gt;new Cloud project&lt;/b&gt;, call it &lt;b&gt;UsingStartupTasks&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_319.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_319.png" width="609" height="345" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Click &lt;b&gt;Ok&lt;/b&gt;. Don’t add any role just yet, so click &lt;b&gt;Ok&lt;/b&gt; in the next screen. MVC 3 is not available from the “New Windows Azure project” dialog, so we’ll need to use another way to get an ASP.NET project in Azure…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_320.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_320.png" width="609" height="382" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now add a new &lt;b&gt;ASP.NET MVC 3&lt;/b&gt; project, calling it &lt;b&gt;HelloMVC3&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_321.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_321.png" width="501" height="459" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Select the &lt;b&gt;Internet Application template&lt;/b&gt;, leave the rest to its defaults, then press Ok.&lt;/p&gt;  &lt;p&gt;Right-click the Roles folder beneath your cloud project and select &lt;b&gt;Add&lt;/b&gt;-&amp;gt;&lt;b&gt;Web Role Project in Solution&lt;/b&gt;…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_322.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_322.png" width="565" height="159" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Select the &lt;b&gt;HelloMVC3&lt;/b&gt; project in the next screen and hit Ok.&lt;/p&gt;  &lt;h3&gt;Adding the Startup task&lt;/h3&gt;  &lt;p&gt;Add a new folder &lt;b&gt;StartupTasks&lt;/b&gt; to your MVC project and add the MVC installer &lt;b&gt;AspNetMVC3Setup.exe&lt;/b&gt; to it. Open notepad.exe (&lt;b&gt;don’t add the following file using Visual Studio&lt;/b&gt; because it will add a Byte Order Mark and the Azure runtime doesn’t like that) and create a new batch file called &lt;b&gt;installmvc.cmd&lt;/b&gt; in the StartupTasks folder. To add it to the Visual Studio project first click on the &lt;b&gt;Show All Files&lt;/b&gt; button in the solution explorer, and then right-click the installmvc.cmd file and select &lt;b&gt;Include In Project&lt;/b&gt;. Do the same for the &lt;b&gt;AspNetMVC3Setup.exe&lt;/b&gt; installer.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_323.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_323.png" width="286" height="152" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We’ll use this batch file to execute the installer as follows: enter following in installmvc.cmd:&lt;/p&gt;  &lt;pre&gt;%~dp0AspNetMVC3Setup.exe /q /log %~dp0mvc3_install.htm
exit /b 0&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;The %~dp0 actually returns the install folder for your azure project, so the first line will run the standalone MVC3 installer, this will write any install problems to a log file called mvc3_install.htm.&lt;/p&gt;

&lt;p&gt;The &lt;b&gt;%~dp0&lt;/b&gt; is used to get the directory containing the startup tasks (an azure server local copy of the StartupTasks folder). The first statement will do a silent (quiet) install of MVC3, and the next line will return a success error code.&lt;/p&gt;

&lt;p&gt;Make sure both files have a build action of “none” and Copy to Output Directory set to “&lt;b&gt;Copy Always&lt;/b&gt;”.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_324.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_324.png" width="318" height="169" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Editing the Service definition file&lt;/h3&gt;

&lt;p&gt;Finally you need to open the ServiceDefinition.csdef file and add the task to it:&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;xml &lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;encoding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ServiceDefinition &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;UsingStartupTasks&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;WebRole &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;HelloMVC3&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Sites&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Site &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Web&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;endpointName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Site&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Sites&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Endpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;InputEndpoint &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Endpoint1&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;protocol&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;port&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;80&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Endpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Imports&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      …&lt;/span&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Imports&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;strong&gt;    &amp;lt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;&lt;strong&gt;Startup&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;Task &lt;/span&gt;&lt;span style="color: red"&gt;commandLine&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;StartupTasks\installmvc.cmd&lt;/span&gt;&amp;quot; 
            &lt;span style="color: red"&gt;executionContext&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;elevated&lt;/span&gt;&amp;quot;
            &lt;span style="color: red"&gt;taskType&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;simple&lt;/span&gt;&amp;quot;
      &lt;/strong&gt;&lt;strong&gt;&lt;span style="color: blue"&gt;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Startup&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: blue"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;WebRole&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ServiceDefinition&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;In this &amp;lt;Startup&amp;gt; element you can add any number of Task elements. Each represents a commandLine that will be executed on the installing instance prior to installing your azure project. You also get a couple of options, first you can specify the executionContext: this can be elevated or limited. Elevated gives you administrator-like privileges and is ideal for installers (which normally only work with admin privileges). Limited gives you “normal user” privileges. You can also choose the taskType. This is how the task will be executed. You get three options: simple, background or foreground. Simple means that the installer will wait for this task to complete before continuing with the next task (or the actual installation of your azure role). Background and foreground means the same thing like in threading. Background will not block the installer from continuing with the next task, and these will run in parallel. So to get MVC3 installed we need to run elevated, and we don’t want installation to continue before MVC3 has been installed, so we choose simple as the task type…&lt;/p&gt;

&lt;h3&gt;Deploying to Azure&lt;/h3&gt;

&lt;p&gt;Right-click on the Cloud project and select Publish… The Deploy Windows Azure project dialog opens:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_325.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_325.png" width="452" height="426" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select your credentials, environment and storage account. You may need to do some &lt;a href="http://blogs.u2u.be/peter/post/2011/06/14/Getting-started-developing-on-Azure.aspx"&gt;setup&lt;/a&gt; for this to work…&lt;/p&gt;

&lt;p&gt;Optionally you can configure remote desktop connections in case something went wrong, this will make it easier to see if MVC 3 was indeed installed.&lt;/p&gt;

&lt;p&gt;Click on Ok and wait…&lt;/p&gt;

&lt;p&gt;Deployment in Visual Studio should start:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_326.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_326.png" width="494" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait some more till complete (because the startup tasks are executing this will take a long time):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_327.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_327.png" width="609" height="116" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the Url. You should now see the MVC 3 screen!&lt;/p&gt;

&lt;p&gt;In my next blog post I will show you how to turn this startup task into an azure startup plugin, which will make it easier to re-use this startup task.&lt;/p&gt;</description><pubDate>Tue, 12 Jul 2011 15:53:29 -1300</pubDate><comments>http://blogs.u2u.be/peter/post/2011/07/12/Installing-requirements-using-Azure-startup-tasks.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Peter Himschoot</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/post.aspx?id=531ebc7c-c266-4623-9bf2-310f77243094</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/peter/trackback.axd?id=531ebc7c-c266-4623-9bf2-310f77243094</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/post/2011/07/12/Installing-requirements-using-Azure-startup-tasks.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/syndication.axd?post=531ebc7c-c266-4623-9bf2-310f77243094</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/peter/post.aspx?id=5aad9ad2-6078-47fd-94e6-96795ee325de</guid><link>http://blogs.u2u.be/peter/post/2011/07/10/Storing-message-in-table-storage.aspx</link><category>.NET Development</category><category>Entity Framework</category><category>Azure</category><category>VS2010</category><title>Storing message in table storage</title><description>&lt;p&gt;In &lt;a href="http://blogs.u2u.be/peter/post/2011/07/06/Introducing-Windows-Azure-Table-Storage.aspx"&gt;my previous post&lt;/a&gt; I looked at getting started with table storage, in this one we will create a table for our entities and store them. As you’ll see, quite easy!&lt;/p&gt;  &lt;p&gt;So, to store an entity in table storage you start by creating a &lt;strong&gt;TableServiceEntity &lt;/strong&gt;derived class (recap from previous post):&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MessageEntity &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;TableServiceEntity
&lt;/span&gt;{
  &lt;span style="color: blue"&gt;public &lt;/span&gt;MessageEntity() { }

  &lt;span style="color: blue"&gt;public &lt;/span&gt;MessageEntity(&lt;span style="color: blue"&gt;string &lt;/span&gt;partitionKey, &lt;span style="color: blue"&gt;string &lt;/span&gt;rowKey, &lt;span style="color: blue"&gt;string &lt;/span&gt;message)
    : &lt;span style="color: blue"&gt;base&lt;/span&gt;( partitionKey, rowKey )
  {
    Message = message;
  }

  &lt;span style="color: blue"&gt;public string &lt;/span&gt;Message { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;You also need a table class, this time deriving from &lt;strong&gt;TableServiceContext&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MessageContext &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;TableServiceContext
&lt;/span&gt;{
  &lt;span style="color: blue"&gt;public const string &lt;/span&gt;MessageTable = &lt;span style="color: #a31515"&gt;&amp;quot;Messages&amp;quot;&lt;/span&gt;;

  &lt;span style="color: blue"&gt;public &lt;/span&gt;MessageContext(&lt;span style="color: blue"&gt;string &lt;/span&gt;baseAddress, &lt;span style="color: #2b91af"&gt;StorageCredentials &lt;/span&gt;credentials)
    : &lt;span style="color: blue"&gt;base&lt;/span&gt;(baseAddress, credentials)
  {
  }
}&lt;/pre&gt;

&lt;p&gt;TableServiceContext requires a base address and credentials, and since our class derives from it we need a constructor taking the same arguments. I also have a const string for the table name.&lt;/p&gt;

&lt;p&gt;If the table doesn’t exist yet you should create it. This is easy, just add the code to create the table in the MessageContext’s static constructor:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static &lt;/span&gt;MessageContext()
{
  &lt;span style="color: blue"&gt;var &lt;/span&gt;tableClient =  &lt;span style="color: #2b91af"&gt;MyStorageAccount&lt;/span&gt;.Instance.CreateCloudTableClient();
  tableClient.CreateTableIfNotExist(MessageTable);
}&lt;/pre&gt;

&lt;p&gt;A static constructor is automatically called when you use the type. Note that I use the &lt;a href="http://blogs.u2u.be/peter/post/2011/07/01/Building-a-Storage-Account-helper-class-(and-forget-about-it).aspx"&gt;MyStorageAccount&lt;/a&gt; class, which uses the same static constructor trick to initialize the storage account.&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;MyStorageAccount
&lt;/span&gt;{
  &lt;span style="color: blue"&gt;public static string &lt;/span&gt;DataConnection = &lt;span style="color: #a31515"&gt;&amp;quot;DataConnection&amp;quot;&lt;/span&gt;;

  &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CloudStorageAccount &lt;/span&gt;Instance
  {
    &lt;span style="color: blue"&gt;get
    &lt;/span&gt;{
      &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CloudStorageAccount&lt;/span&gt;.FromConfigurationSetting(DataConnection);
    }
  }

  &lt;span style="color: blue"&gt;static &lt;/span&gt;MyStorageAccount()
  {
    &lt;span style="color: #2b91af"&gt;CloudStorageAccount&lt;/span&gt;.SetConfigurationSettingPublisher(
      (config, setter) =&amp;gt;
      {
        setter(
          &lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.IsAvailable ?
            &lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.GetConfigurationSettingValue(config)
            :
            &lt;span style="color: #2b91af"&gt;ConfigurationManager&lt;/span&gt;.AppSettings[config]
        );

        &lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.Changing += (_, changes) =&amp;gt;
        {
          &lt;span style="color: blue"&gt;if &lt;/span&gt;(changes.Changes
                     .OfType&amp;lt;&lt;span style="color: #2b91af"&gt;RoleEnvironmentConfigurationSettingChange&lt;/span&gt;&amp;gt;()
                     .Any(change =&amp;gt; change.ConfigurationSettingName == config))
          {
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(!setter(&lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.GetConfigurationSettingValue(config)))
            {
              &lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.RequestRecycle();
            }
          }
        };
      });
  }
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Now we are ready to add the code to create and add a message to our table. Add following code to MessageContext:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MessageEntity &lt;/span&gt;CreateMessage( &lt;span style="color: blue"&gt;string &lt;/span&gt;message )
{
  &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MessageEntity&lt;/span&gt;(MessageTable, &lt;span style="color: #2b91af"&gt;Guid&lt;/span&gt;.NewGuid().ToString(), message);
}

&lt;span style="color: blue"&gt;public void &lt;/span&gt;AddMessage(&lt;span style="color: #2b91af"&gt;MessageEntity &lt;/span&gt;msg)
{
  &lt;span style="color: blue"&gt;this&lt;/span&gt;.AddObject(MessageTable, msg);
  &lt;span style="color: blue"&gt;this&lt;/span&gt;.SaveChanges();
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;The CreateMessage method creates a new MessageEntity instance, with the same partition key (I don’t expect to store a lot of messages), a unique Guid as the row key, and of course the message. The AddMessage method adds this entity to the table, and then calls SaveChanges to send the new row to the table. This mechanism uses the same concepts as &lt;a href="http://msdn.microsoft.com/en-us/data/bb931106"&gt;WCF Data Services&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the previous post we created a web site with a textbox and a button. Implement the button’s click event as follows:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;protected void &lt;/span&gt;postButton_Click(&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;string &lt;/span&gt;message = messageText.Text;
  &lt;span style="color: blue"&gt;var &lt;/span&gt;msg = &lt;span style="color: #2b91af"&gt;MessageContext&lt;/span&gt;.CreateMessage(message);
  context.AddMessage(msg);
}&lt;/pre&gt;

&lt;p&gt;This will allow you to add messages to storage.&lt;/p&gt;

&lt;p&gt;Before you can run this sample, you also need to setup the connection. Double-click the CloudMessages project beneath the Roles folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_317.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_317.png" width="211" height="63" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This open the project’s configuration window. Select the Settings tab and add a “DataConnection” setting, select “Connection String” as the type and then select your preferred storage account. In the beginning it is best to use development storage, and that is what I did here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_318.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_318.png" width="638" height="175" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After running the web site you are of course wondering if your messages were actually added. So let’s add some code and UI to display the messages in the table.&lt;/p&gt;

&lt;p&gt;Start by adding the following property to MessageContext:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;MessageEntity&lt;/span&gt;&amp;gt; Messages
{
  &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;CreateQuery&amp;lt;&lt;span style="color: #2b91af"&gt;MessageEntity&lt;/span&gt;&amp;gt;(MessageTable); }
}&lt;/pre&gt;

&lt;p&gt;This property returns an &lt;strong&gt;IQueryable&amp;lt;MessageEntity&amp;gt;&lt;/strong&gt;, which is then used by LINQ for writing queries. To actual query is performed in our web page class. But first we need to add some UI to display the messages. Add a repeater control beneath the TextBox and Button:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Content &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;BodyContent&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;MainContent&amp;quot;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;messageText&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;396px&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;postButton&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;postButton_Click&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Post message&amp;quot; /&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Repeater &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;messageList&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
          &lt;/span&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;# &lt;/span&gt;((MessagesLib.&lt;span style="color: #2b91af"&gt;MessageEntity&lt;/span&gt;) Container.DataItem).Message &lt;span style="background: yellow"&gt;%&amp;gt;
&lt;/span&gt;        &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Repeater&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Now that we can display the messages, let’s add a LoadMessages method below the click event handler of the page:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;LoadMessages()
{
  &lt;span style="color: blue"&gt;var &lt;/span&gt;query = &lt;span style="color: blue"&gt;from &lt;/span&gt;msg &lt;span style="color: blue"&gt;in &lt;/span&gt;context.Messages
                           &lt;span style="color: blue"&gt;select &lt;/span&gt;msg;
  messageList.DataSource = query.ToList()
                                .OrderBy(m =&amp;gt; m.Timestamp)
                                .Take(10);
  messageList.DataBind();
}&lt;/pre&gt;

&lt;p&gt;Call this method in the Load event of the page:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;protected void &lt;/span&gt;Page_Load(&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;(!IsPostBack)
  {
    LoadMessages();
  }
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;And again in the button’s click event:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;protected void &lt;/span&gt;postButton_Click(&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;string &lt;/span&gt;message = messageText.Text;
  &lt;span style="color: blue"&gt;var &lt;/span&gt;msg = &lt;span style="color: #2b91af"&gt;MessageContext&lt;/span&gt;.CreateMessage(message);
  context.AddMessage(msg);
  LoadMessages();
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Run. Add some messages, and see them listed (only the first 10 messages will be displayed, change to query as you like).&lt;/p&gt;</description><pubDate>Sun, 10 Jul 2011 04:45:57 -1300</pubDate><comments>http://blogs.u2u.be/peter/post/2011/07/10/Storing-message-in-table-storage.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Peter Himschoot</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/post.aspx?id=5aad9ad2-6078-47fd-94e6-96795ee325de</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">7</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/peter/trackback.axd?id=5aad9ad2-6078-47fd-94e6-96795ee325de</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/post/2011/07/10/Storing-message-in-table-storage.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/syndication.axd?post=5aad9ad2-6078-47fd-94e6-96795ee325de</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/peter/post.aspx?id=cd274ce0-048a-43af-b408-5209f8a7d74c</guid><link>http://blogs.u2u.be/peter/post/2011/07/06/Introducing-Windows-Azure-Table-Storage.aspx</link><category>.NET Development</category><category>VS2010</category><category>Azure</category><title>Introducing Windows Azure Table Storage</title><description>&lt;p&gt;Windows Azure storage gives you several persistent and durables storage options. In this blog post I want to look at Table storage (which I prefer to call Entity storage because you can store any mix of entities&amp;#160; in these tables; so you can store products AND customers in the same table). For this walkthrough you’ll need the &lt;a href="http://www.microsoft.com/windowsazure/sdk/"&gt;AZURE SDK&lt;/a&gt; and &lt;a href="http://blogs.u2u.be/peter/post/2011/06/14/Getting-started-developing-on-Azure.aspx"&gt;setup for development&lt;/a&gt;…&lt;/p&gt;  &lt;h3&gt;1. Getting ready&lt;/h3&gt;  &lt;p&gt;Start Visual Studio 2010 and create a new Azure project called &lt;strong&gt;MessageServiceWithTables&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_315.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_315.png" width="811" height="459" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In the New Windows Azure Project dialog select the &lt;strong&gt;ASP.NET Web Role&lt;/strong&gt; and press the &lt;strong&gt;&amp;gt; button&lt;/strong&gt;, then rename the project to &lt;strong&gt;CloudMessages&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_316.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_316.png" width="640" height="404" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Replace the content of &lt;strong&gt;default.aspx&lt;/strong&gt; with the following:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: maroon"&gt;Page &lt;/span&gt;&lt;span style="color: red"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Home Page&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;C#&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;~/Site.master&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot;
    &lt;/span&gt;&lt;span style="color: red"&gt;CodeBehind&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Default.aspx.cs&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;CloudMessages._Default&amp;quot; &lt;/span&gt;&lt;span style="background: yellow"&gt;%&amp;gt;

&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Content &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;HeaderContent&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;HeadContent&amp;quot;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Content &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;BodyContent&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;MainContent&amp;quot;&amp;gt;
&lt;strong&gt;    &amp;lt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: maroon"&gt;&lt;strong&gt;p&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: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;messageText&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;396px&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;postButton&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;postButton_Click&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color: blue"&gt;=&amp;quot;Post message&amp;quot; /&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: blue"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;h3&gt;2. Creating the table store entity classes&lt;/h3&gt;

&lt;p&gt;Add a new &lt;strong&gt;Class Library&lt;/strong&gt; project to your solution, and call it &lt;strong&gt;MessagesLib&lt;/strong&gt;. Delete class1.cs. Add a new class called &lt;strong&gt;MessageEntity&lt;/strong&gt;. &lt;/p&gt;

&lt;h4&gt;2.1 Creating the entity class&lt;/h4&gt;

&lt;p&gt;We want to derive this class from &lt;strong&gt;TableServiceEntity&lt;/strong&gt;, but first we need to add a couple of references. So select &lt;strong&gt;Add Reference…&lt;/strong&gt; on the library project. &lt;/p&gt;

&lt;p&gt;Browse to &lt;strong&gt;Program Files\Windows Azure SDK\v1.4\ref&lt;/strong&gt; and select following libraries (or simply select them all):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_thumb5_3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb5" border="0" alt="image_thumb5" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb5_thumb_1.png" width="908" height="437" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You also need to add a reference to System.Data.Services.Client (I’m using &lt;a href="http://blogs.u2u.be/peter/post/2010/07/13/Add-Search-support-for-Add-Reference.aspx" target="_blank"&gt;Power Tools&lt;/a&gt;, so the Add Reference looks different (excuse me, better!):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_thumb7_3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb7" border="0" alt="image_thumb7" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb7_thumb_1.png" width="805" height="464" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you’re ready to add the &lt;strong&gt;MessageEntity&lt;/strong&gt; class deriving from the &lt;strong&gt;TableServiceEntity&lt;/strong&gt; base class. &lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MessageEntity &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;TableServiceEntity
&lt;/span&gt;{
  &lt;span style="color: blue"&gt;public &lt;/span&gt;MessageEntity() { }

  &lt;span style="color: blue"&gt;public &lt;/span&gt;MessageEntity(&lt;span style="color: blue"&gt;string &lt;/span&gt;partitionKey, &lt;span style="color: blue"&gt;string &lt;/span&gt;rowKey, &lt;span style="color: blue"&gt;string &lt;/span&gt;message)
    : &lt;span style="color: blue"&gt;base&lt;/span&gt;( partitionKey, rowKey )
  {
    Message = message;
  }

  &lt;span style="color: blue"&gt;public string &lt;/span&gt;Message { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;This base class has three properties used by table storage: the partition key, the row key and the timestamp:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_thumb9_3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb9" border="0" alt="image_thumb9" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb9_thumb_1.png" width="860" height="545" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;partition key&lt;/strong&gt; is used as follows: all entities sharing the same partition key share the same storage device, they are kept together. This make querying these objects faster. But on the other hand, entities with different partition keys can be stored on different machines, allowing queries to be distributed over these machines when there are many instances. So choosing the partition key is a tricky thing, and there are no automated tools to help you here. Some people will use buckets (like from 0 to 9) and evenly distribute their instances over all buckets.&lt;/p&gt;

&lt;p&gt;The row key makes the entity unique and the timestamp is used for concurrency checking (optimistic concurrency).&lt;/p&gt;

&lt;p&gt;So, what do we need to store? Since we just want to store messages we add a single &lt;strong&gt;Message&lt;/strong&gt; property and constructors for easy instantiation.&lt;/p&gt;

&lt;p&gt;In the &lt;a href="http://blogs.u2u.be/peter/post/2011/07/10/Storing-message-in-table-storage.aspx"&gt;next blog post&lt;/a&gt; we’ll be looking at creating the table in table storage and inserting new data…&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="color: blue"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 06 Jul 2011 08:49:22 -1300</pubDate><comments>http://blogs.u2u.be/peter/post/2011/07/06/Introducing-Windows-Azure-Table-Storage.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Peter Himschoot</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/post.aspx?id=cd274ce0-048a-43af-b408-5209f8a7d74c</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">9</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/peter/trackback.axd?id=cd274ce0-048a-43af-b408-5209f8a7d74c</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/post/2011/07/06/Introducing-Windows-Azure-Table-Storage.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/syndication.axd?post=cd274ce0-048a-43af-b408-5209f8a7d74c</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/peter/post.aspx?id=0b809b6f-0432-49ba-9ef9-b8b2bf28e6e4</guid><link>http://blogs.u2u.be/peter/post/2011/07/03/Debugging-those-nasty-Windows-Azure-startup-code-problems-with-IntelliTrace.aspx</link><category>.NET Development</category><category>Azure</category><category>VS2010</category><title>Debugging those nasty Windows Azure startup-code problems with IntelliTrace</title><description>&lt;h3&gt;1. Introducing Intelli-Trace&lt;/h3&gt;  &lt;p&gt;How do engineers figure out what caused a plane crash? One of the things they use is the &lt;a href="http://bin.ilsemedia.nl/m/m1dy73gw1xvi.jpg"&gt;black-box&lt;/a&gt; recording, which recorded all mayor data from the plane prior to the crash. This recording allows them to step back in time and analyze step-by-step what happened. &lt;a href="http://www.microsoft.com/visualstudio/en-us/products"&gt;Microsoft Visual Studio 2010 Ultimate&lt;/a&gt; also has a black-box for your code, called &lt;a href="http://msdn.microsoft.com/en-us/library/dd264915.aspx"&gt;IntelliTrace&lt;/a&gt;. While your code is running, Intellitrace writes a log file (called an &lt;a href="http://blogs.u2u.be/peter/post/2010/01/22/Using-the-Visual-Studio-2010-Historical-Debugger-to-save-and-reproduce-bugs.aspx"&gt;iTrace&lt;/a&gt; file), and you can analyze this using Visual Studio Ultimate. Windows Azure also allows you to enable Intellitrace on the server running your code, and this is ideal to figure out why your code is crashing on the server, especially early code (because you cannot &lt;a href="http://blogs.u2u.be/peter/post/2011/06/22/Remote-debugging-an-Azure-Worker-role-using-Azure-Connect-Remote-desktop-and-the-remote-debugger.aspx"&gt;attach the debugger&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;In the next part you’ll walkthrough this process. But first you need to download the AzureAndIntelliTrace solution.&lt;/p&gt; &lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="https://skydrive.live.com/embedicon.aspx/Public/AzureAndIntelliTrace.zip?cid=9a238cfbef5cac9e&amp;amp;sc=documents" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;h3&gt;2. Deploying the solution&lt;/h3&gt;  &lt;p&gt;We’ll start by deploying the solution, so open the AzureAndIntelliTrace solution with Visual Studio. Right-click the Azure project and choose &lt;b&gt;Publish…&lt;/b&gt; The &lt;b&gt;Deploy Windows Azure project&lt;/b&gt; dialog should open.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_302.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_302.png" width="302" height="284" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Make sure you check the “&lt;b&gt;Enable IntelliTrace for .NET 4 roles&lt;/b&gt;” checkbox.&lt;/p&gt;  &lt;p&gt;Let’s have a look at settings, so click the “&lt;b&gt;Settings…&lt;/b&gt;” link. Open the &lt;b&gt;Modules&lt;/b&gt; tab:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_303.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_303.png" width="439" height="324" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can just leave everything to its default settings, but you could remove the StorageClient library if you would want to use intellitrace to track down a storage problem…&lt;/p&gt;  &lt;p&gt;Wait for the deployment until it says “&lt;b&gt;Busy…&lt;/b&gt;”. If something goes wrong during the startup fase of your role instance with IntelliTrace enabled, Azure will keep the role busy so you can download the iTrace file.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_304.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_304.png" width="609" height="177" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So you’re waiting for this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_305.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_305.png" width="591" height="102" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Then it is time to download the iTrace file. You can do that from the Server Explorer window. Open the Windows Azure Compute tree item until you reach the instance (note the Busy state!):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_306.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_306.png" width="292" height="98" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The instance name will also mention whether or not it is IntelliTrace enabled.&lt;/p&gt;  &lt;p&gt;Now you can right click the instance to download the iTrace file:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_307.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_307.png" width="397" height="172" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wait for download to complete, the iTrace file should open automatically in Visual Studio:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_308.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_308.png" width="525" height="178" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Scroll down until you reach the Exception Data section. You should see that you got a FileNotFoundException, caused because it couldn’t find the &lt;b&gt;Dependencies&lt;/b&gt; assembly:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_309.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_309.png" width="609" height="272" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;3. Fixing the dependency problem&lt;/h3&gt;  &lt;p&gt;This kind of problem is easily solved, but first we need to stop this deployment. Go back to the &lt;b&gt;Windows Azure Activity Log&lt;/b&gt; and right-click the deployment. Choose “&lt;b&gt;Cancel and remove&lt;/b&gt;”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_310.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_310.png" width="609" height="227" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The problem is that we have a reference to the dependencies assembly, but when deployed to Azure it is not copied onto the instance. Go back to the solution and open the &lt;b&gt;DebugThis&lt;/b&gt; project. Open the &lt;b&gt;References&lt;/b&gt; folder and select the &lt;b&gt;Dependencies&lt;/b&gt; assembly. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_311.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_311.png" width="268" height="222" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In the properties window set the “&lt;b&gt;Copy Local&lt;/b&gt;” property to &lt;b&gt;true&lt;/b&gt;. &lt;/p&gt;  &lt;p&gt;Try redeploying again. Now we will have another problem, so wait for the instance to go Busy again…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_312.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_312.png" width="292" height="98" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Download the iTrace file again. Scroll down to the exceptions section, select the &lt;b&gt;FormatException&lt;/b&gt; and click the &lt;b&gt;Start Debugging&lt;/b&gt; button. IntelliTrace will put you on the offending line.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_313.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_313.png" width="609" height="210" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It is easy to see that the string.Format is missing an argument…&lt;/p&gt;  &lt;p&gt;You can start the debugger by clicking the “&lt;b&gt;Set Debugger Context Here&lt;/b&gt;” button in the gutter.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_314.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_314.png" width="244" height="107" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now you can step back using intellitrace…&lt;/p&gt;  &lt;p&gt;As you can see, IntelliTrace is great for figuring out this kind of problem, especially if your code works in the compute emulator, but doesn’t on the real Azure server instance…&lt;/p&gt;</description><pubDate>Sun, 03 Jul 2011 16:55:05 -1300</pubDate><comments>http://blogs.u2u.be/peter/post/2011/07/03/Debugging-those-nasty-Windows-Azure-startup-code-problems-with-IntelliTrace.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Peter Himschoot</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/post.aspx?id=0b809b6f-0432-49ba-9ef9-b8b2bf28e6e4</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/peter/trackback.axd?id=0b809b6f-0432-49ba-9ef9-b8b2bf28e6e4</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/post/2011/07/03/Debugging-those-nasty-Windows-Azure-startup-code-problems-with-IntelliTrace.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/syndication.axd?post=0b809b6f-0432-49ba-9ef9-b8b2bf28e6e4</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/peter/post.aspx?id=b4acc865-81d8-4821-921c-885a8a90dddd</guid><link>http://blogs.u2u.be/peter/post/2011/07/01/Building-a-Storage-Account-helper-class-(and-forget-about-it).aspx</link><category>.NET Development</category><category>VS2010</category><category>Azure</category><title>Building a Storage Account helper class (and forget about it)</title><description>&lt;p&gt;When you use storage with the managed API’s, you always need to use a storage account, and make sure you setup the whole thing correctly. The way to do this is slightly different when building a web role versus a worker role, so I decided to tackle this problem by building a simple class that takes care of everything, and works the same in a web or worker role. All you need is to copy/reference this class in each of your projects.&lt;/p&gt;  &lt;h3&gt;1. The first problem – setting up the ConfigurationSettingPublisher&lt;/h3&gt;  &lt;p&gt;The storage account uses a connection string. This connection string can come from the normal &lt;strong&gt;web.config&lt;/strong&gt; (when you use storage in a local web site) or the Azure project’s &lt;strong&gt;ServiceConfiguration.cscfg&lt;/strong&gt;. To allow all connections to be available in both environments the storage account uses a ConfigurationSettingPublisher, which is a delegate that retrieves the connection.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4c0b5974-aca4-4989-830d-0bcf15fda965" class="wlWriterSmartContent"&gt;   &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;     &lt;div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px"&gt;Code Snippet&lt;/div&gt;      &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt;       &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2.5em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px"&gt;         &lt;li&gt;&lt;span style="color: #2b91af"&gt;CloudStorageAccount&lt;/span&gt;.SetConfigurationSettingPublisher( &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160; (config, setter) =&amp;gt; &lt;/li&gt;          &lt;li&gt;&amp;#160; { &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160; setter( &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.IsAvailable ? &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.GetConfigurationSettingValue(config) &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;ConfigurationManager&lt;/span&gt;.AppSettings[config] &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; ); &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160; }); &lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Problem is where to put the code; in a web role you have to put the code in startup code, so you need to put this in &lt;strong&gt;Global.asax&lt;/strong&gt;. In a worker role there is no such thing, so you put this in the worker role’s Start method. So, you might say, let’s also put this code in the Start method of the web role; this will run in another process so you end up without a proper initialized web role…&lt;/p&gt;  &lt;p&gt;So here is my solution: create a new class MyStorageAccount which uses a static constructor (also known as the type constructor) so call this code. A static constructor will automatically be called by the runtime when you first use the class. So this way you will always have correct initialization, and only when you need it:&lt;/p&gt;    &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:acc51f40-1ad1-4071-bcfb-04e1487d5c9f" class="wlWriterSmartContent"&gt;   &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;     &lt;div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px"&gt;Code Snippet&lt;/div&gt;      &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt;       &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2.5em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px"&gt;         &lt;li&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Configuration; &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Microsoft.WindowsAzure; &lt;/li&gt;          &lt;li&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Microsoft.WindowsAzure.ServiceRuntime; &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160; &lt;/li&gt;          &lt;li&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; MessagesLib &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;{ &lt;/li&gt;          &lt;li&gt;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyStorageAccount&lt;/span&gt; &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160; { &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; DataConnection = &lt;span style="color: #a31515"&gt;&amp;quot;DataConnection&amp;quot;&lt;/span&gt;; &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CloudStorageAccount&lt;/span&gt; Instance &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CloudStorageAccount&lt;/span&gt;.FromConfigurationSetting(DataConnection); &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; MyStorageAccount() &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;CloudStorageAccount&lt;/span&gt;.SetConfigurationSettingPublisher( &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (config, setter) =&amp;gt; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; setter( &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.IsAvailable ? &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.GetConfigurationSettingValue(config) &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;ConfigurationManager&lt;/span&gt;.AppSettings[config] &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ); &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }); &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160; } &lt;/li&gt;          &lt;li&gt;} &lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;This class uses the static constructor to setup the ConfigurationSettingPublisher, and also has an Instance property. This allows you to retrieve the storage account without always having to provide the connection configuration name. Most applications will only use a single connection, so this should work fine.&lt;/p&gt;  &lt;p&gt;So instead of writing this all the time:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c7899571-9e9f-459a-8528-51555017fcf2" class="wlWriterSmartContent"&gt;   &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;     &lt;div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px"&gt;Code Snippet&lt;/div&gt;      &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt;       &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px"&gt;         &lt;li&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; account = &lt;span style="color: #2b91af"&gt;CloudStorageAccount&lt;/span&gt;.FromConfigurationSetting(&lt;span style="color: #a31515"&gt;&amp;quot;DataConnection&amp;quot;&lt;/span&gt;); &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; tableClient = &lt;/li&gt;          &lt;li&gt;&amp;#160; account.CreateCloudTableClient(); &lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;You can now write it like this:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2298f37e-c76a-4857-a09d-66fac7714a8a" class="wlWriterSmartContent"&gt;   &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;     &lt;div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px"&gt;Code Snippet&lt;/div&gt;      &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt;       &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px"&gt;         &lt;li&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; account = &lt;span style="color: #2b91af"&gt;MyStorageAccount&lt;/span&gt;.Instance; &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; tableClient = &lt;/li&gt;          &lt;li&gt;&amp;#160; account.CreateCloudTableClient(); &lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Or even shorter:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:38e093b6-2d29-4363-b9ec-97453894e280" class="wlWriterSmartContent"&gt;   &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;     &lt;div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px"&gt;Code Snippet&lt;/div&gt;      &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt;       &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px"&gt;         &lt;li&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; tableClient =&amp;#160; &lt;span style="color: #2b91af"&gt;MyStorageAccount&lt;/span&gt;.Instance.CreateCloudTableClient(); &lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Much easier!&lt;/p&gt;  &lt;h3&gt;2. Handling configuration changes&lt;/h3&gt;  &lt;p&gt;Next problem is when the configuration of the role is updated. In this case you need to check if you can handle this change, if not, you should restart the role. Typical code for this looks like this:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8d6c7dbe-0798-4b92-b8db-dd038c05234a" class="wlWriterSmartContent"&gt;   &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;     &lt;div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px"&gt;Code Snippet&lt;/div&gt;      &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt;       &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2.5em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px"&gt;         &lt;li&gt;&lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.Changing += (_, changes) =&amp;gt; &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;{ &lt;/li&gt;          &lt;li&gt;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (changes.Changes &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .OfType&amp;lt;&lt;span style="color: #2b91af"&gt;RoleEnvironmentConfigurationSettingChange&lt;/span&gt;&amp;gt;() &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Any(change =&amp;gt; change.ConfigurationSettingName == config)) &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160; { &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!setter(&lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.GetConfigurationSettingValue(config))) &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;RoleEnvironment&lt;/span&gt;.RequestRecycle(); &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li&gt;&amp;#160; } &lt;/li&gt;          &lt;li style="background: #f3f3f3"&gt;}; &lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;We register for the Changing event. When this event gets raised, you receive all the changes in a collection. You walk the collection to see if the configuration you’re interested in is part of the collection. In that case you need to re-invoke the ConfigurationSettingPublisher, and when that method returns false you need the recycle the role. Please note that this will only happen when running as a role (not local web site) so we can use the cloud version to retrieve configuration…&lt;/p&gt;  &lt;p&gt;So what is the result of this? No need to call special code in your Global.asax or worker role Start method. It just works!&lt;/p&gt;</description><pubDate>Fri, 01 Jul 2011 18:19:26 -1300</pubDate><comments>http://blogs.u2u.be/peter/post/2011/07/01/Building-a-Storage-Account-helper-class-(and-forget-about-it).aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Peter Himschoot</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/post.aspx?id=b4acc865-81d8-4821-921c-885a8a90dddd</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/peter/trackback.axd?id=b4acc865-81d8-4821-921c-885a8a90dddd</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/post/2011/07/01/Building-a-Storage-Account-helper-class-(and-forget-about-it).aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/syndication.axd?post=b4acc865-81d8-4821-921c-885a8a90dddd</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/peter/post.aspx?id=0f8571af-9d1f-4bc5-9b61-a3851a5afaa9</guid><link>http://blogs.u2u.be/peter/post/2011/06/28/Running-multiple-sites-in-one-Windows-Azure-Web-Role.aspx</link><category>Azure</category><category>VS2010</category><category>.NET Development</category><title>Running multiple sites in one Windows Azure Web Role</title><description>&lt;p&gt;Since the release of the Windows Azure SDK 1.3 it is possible to host multiple sites in one web role. In this blog post I will show you how to do this.&lt;/p&gt;  &lt;h3&gt;1. Creating the Azure project&lt;/h3&gt;  &lt;p&gt;Start by creating a new &lt;b&gt;Azure Cloud&lt;/b&gt; &lt;b&gt;project&lt;/b&gt;. Add a single &lt;b&gt;WebRole project&lt;/b&gt; (call it &lt;b&gt;MultiSitesWebRole&lt;/b&gt;) to it:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_291.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_291.png" width="423" height="266" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hit &lt;strong&gt;Ok&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Now we just want to make sure we see each different web site, so open the &lt;b&gt;default.aspx&lt;/b&gt; page and change the header, for example:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8052f7a3-561c-4e43-a7ae-7423b9e9e9fc" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt; &lt;span style="color:#800000"&gt;Page&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Title&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Home Page&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Language&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;~/Site.master&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#ff0000"&gt;CodeBehind&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Default.aspx.cs&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Inherits&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;WebApplication1._Default&amp;quot;&lt;/span&gt; &lt;span style="background:#ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#800000"&gt;Content&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;HeaderContent&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;HeadContent&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#800000"&gt;Content&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#800000"&gt;Content&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;BodyContent&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;MainContent&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;h2&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        This is the main site!&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;h2&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;p&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        To learn more about ASP.NET visit &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;a&lt;/span&gt; &lt;span style="color:#ff0000"&gt;href&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;http://www.asp.net&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;ASP.NET Website&amp;quot;&amp;gt;&lt;/span&gt;www.asp.net&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;a&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;.&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;p&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;p&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        You can also find &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;a&lt;/span&gt; &lt;span style="color:#ff0000"&gt;href&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;http://go.microsoft.com/fwlink/?LinkID=152368&amp;amp;amp;clcid=0x409&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#ff0000"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;MSDN ASP.NET Docs&amp;quot;&amp;gt;&lt;/span&gt;documentation on ASP.NET at MSDN&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;a&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;.&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;p&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#800000"&gt;Content&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Make sure the cloud project is set as the start project, and then run (F5) your solution.&lt;/p&gt;  &lt;p&gt;Your web browser should open and display the site. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_292.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_292.png" width="289" height="209" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;While this is still running open IIS manager. Open the list of sites, you should see the site for this solution (the name will be different):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_293.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_293.png" width="443" height="133" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Windows Azure Compute emulator actually uses IIS to run your web role by creating a site on your local machine.&lt;/p&gt;  &lt;p&gt;Stop your debugging session.&lt;/p&gt;  &lt;h3&gt;2. Adding the second site&lt;/h3&gt;  &lt;p&gt;Right-click your solution and add another ASP.NET web project.calling it “&lt;b&gt;TheSecondWebSite&lt;/b&gt;”. Update the default.aspx again to show that this is the second site:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cc13a022-6a4d-4530-83e6-7be65bf68d84" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt; &lt;span style="color:#800000"&gt;Page&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Title&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Home Page&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Language&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;~/Site.master&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#ff0000"&gt;CodeBehind&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Default.aspx.cs&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Inherits&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;WebApplication2._Default&amp;quot;&lt;/span&gt; &lt;span style="background:#ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#800000"&gt;Content&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;HeaderContent&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;HeadContent&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#800000"&gt;Content&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#800000"&gt;Content&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;BodyContent&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;MainContent&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;h2&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        The second web site!&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;h2&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;p&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        To learn more about ASP.NET visit &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;a&lt;/span&gt; &lt;span style="color:#ff0000"&gt;href&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;http://www.asp.net&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;ASP.NET Website&amp;quot;&amp;gt;&lt;/span&gt;www.asp.net&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;a&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;.&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;p&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;p&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        You can also find &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;a&lt;/span&gt; &lt;span style="color:#ff0000"&gt;href&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;http://go.microsoft.com/fwlink/?LinkID=152368&amp;amp;amp;clcid=0x409&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#ff0000"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;MSDN ASP.NET Docs&amp;quot;&amp;gt;&lt;/span&gt;documentation on ASP.NET at MSDN&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;a&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;.&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;p&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#800000"&gt;Content&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now open the cloud service definition file (&lt;b&gt;ServiceDefinition.csdef&lt;/b&gt;). Look at the &lt;b&gt;&amp;lt;Sites&amp;gt;&lt;/b&gt; element and its children. Copy the &lt;b&gt;&amp;lt;Site&amp;gt;&lt;/b&gt; element to create another one. Modify the site name and add a &lt;b&gt;physicalDirectory&lt;/b&gt; element set to the path of the second site. Inside the &lt;b&gt;&amp;lt;Site&amp;gt;&lt;/b&gt; element look for the &lt;b&gt;&amp;lt;Binding&amp;gt;&lt;/b&gt; element and add another attribute &lt;b&gt;hostHeader&lt;/b&gt; set to &lt;a href="http://www.contoso.com"&gt;&lt;strong&gt;www.contoso.com&lt;/strong&gt;&lt;/a&gt;. Ok, I’m using &lt;a href="http://www.contoso.com"&gt;www.contoso.com&lt;/a&gt; for testing purposes, you can use your own site url if you want. We’ll be changing the host file on your machine so you can test everything, but this won’t work for other people. If you really want to make this work you will need to make the necessary DNS entries to redirect your site url to the cloud url…&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ServiceDefinition.csdef&lt;/strong&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7c6c68ad-3328-4be5-91e4-25068c1c09dc" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Sites&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:#008000"&gt; First site &lt;/span&gt;&lt;span style="color:#0000ff"&gt;--&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Site&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Check&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;physicalDirectory&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;C:&amp;#92;...&amp;#92;FullIIS_MultipleSites&amp;#92;WebApplication1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Endpoint1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Endpoint1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Site&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:#008000"&gt; Second site &lt;/span&gt;&lt;span style="color:#0000ff"&gt;--&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Site&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Encore&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;physicalDirectory&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;C:&amp;#92;...&amp;#92;FullIIS_MultipleSites&amp;#92;WebApplication2&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Endpoint1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Endpoint1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;hostHeader&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;www.contoso.com&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Site&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Sites&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Before you run your solution we need to make sure that the hostHeader &lt;a href="http://www.contoso.com"&gt;www.contoso.com&lt;/a&gt; is pointing to the local environment. You can do this by editing the hosts file, which can be found in &lt;b&gt;&amp;lt;Windows&amp;gt;\System32\drivers\etc\hosts&lt;/b&gt;. You can edit this file using notepad. Make sure you have the following in this file:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;127.0.0.1 &lt;/strong&gt;&lt;a href="http://www.contoso.com"&gt;&lt;strong&gt;www.contoso.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Run your solution. Your browser should show the first site:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_294.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_294.png" width="289" height="209" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note the port used by the first site (in this screenshot above this is port 81, the compute emulator will take the first available port above port 80). &lt;/p&gt;  &lt;p&gt;Now you can open the second site by browsing to &lt;a href="http://www.contoso.com:81"&gt;www.contoso.com:81&lt;/a&gt; (use your own port here).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_295.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_295.png" width="279" height="203" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Before you stop debugging, open the IIS manager again, you should now see two sites (you may need to refresh the sites node):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_296.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_296.png" width="470" height="91" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;3. Creating a nested virtual application&lt;/h3&gt;  &lt;p&gt;Add another web project, calling it &lt;b&gt;TheThirdSite&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;Change default.aspx again to reflect that this is the third site.&lt;/p&gt;  &lt;p&gt;Open the service definition again, and add the VirtualApplication element inside the second site:&lt;/p&gt;  &lt;p&gt;Servicedefinition.csdef&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a422c5d1-aace-436e-8444-54d456ad9fe0" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Sites&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:#008000"&gt; First site &lt;/span&gt;&lt;span style="color:#0000ff"&gt;--&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Site&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Check&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;physicalDirectory&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;C:&amp;#92;...&amp;#92;FullIIS_MultipleSites&amp;#92;WebApplication1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Endpoint1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Endpoint1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Site&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:#008000"&gt; Second site &lt;/span&gt;&lt;span style="color:#0000ff"&gt;--&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Site&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Encore&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;physicalDirectory&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;C:&amp;#92;...&amp;#92;FullIIS_MultipleSites&amp;#92;WebApplication2&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:#008000"&gt; Even a nested Virtual application &lt;/span&gt;&lt;span style="color:#0000ff"&gt;--&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;VirtualApplication&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;More&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;physicalDirectory&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;C:&amp;#92;...&amp;#92;FullIIS_MultipleSites&amp;#92;MvcApplication1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;VirtualApplication&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Endpoint1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Endpoint1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;hostHeader&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;www.contoso.com&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Site&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Sites&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Run again and browse to &lt;b&gt;&lt;a href="http://www.contoso.com:81/More"&gt;www.contoso.com:81/More&lt;/a&gt;&lt;/b&gt;. You should see the third site.&lt;/p&gt;  &lt;h3&gt;4 Deploying and testing in the cloud&lt;/h3&gt;  &lt;p&gt;Let’s test your project in the cloud. &lt;/p&gt;  &lt;p&gt;Deploy your solution:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_297.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_297.png" width="302" height="284" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Once deployment is ready click on the link to open the first site.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_298.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_298.png" width="609" height="136" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_299.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_299.png" width="279" height="190" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now open a command prompt and use the ping command to retrieve the site’s IP address. Open the hosts file and modify the &lt;a href="http://www.contoso.com"&gt;www.contoso.com&lt;/a&gt; to use the new IP address. &lt;/p&gt;  &lt;p&gt;Browse to &lt;a href="http://www.contoso.com"&gt;www.contoso.com&lt;/a&gt; (no need to specify a port number now). You should see the second site. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_300.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_300.png" width="240" height="181" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If not, you might need to clear your DNS cache using the command:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;i&gt;ipconfig /flushdns&lt;/i&gt;&lt;/code&gt;     &lt;br /&gt;&lt;code&gt;&lt;i&gt;net stop dnscache&lt;/i&gt;&lt;/code&gt;     &lt;br /&gt;&lt;code&gt;&lt;i&gt;net start dnscache&lt;/i&gt;&lt;/code&gt;&lt;code&gt;&lt;i&gt;&lt;/i&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;Browse to the nested virtual application at &lt;a href="http://www.contoso.com/More"&gt;www.contoso.com/More&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_301.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb_301.png" width="246" height="185" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;That’s it. You’ve just created your own web role in the cloud, hosting three different sites! To complete everything you now should go to your internet provider to make the necessary DNS entries to redirect your site url to the cloud url!&lt;/p&gt;</description><pubDate>Tue, 28 Jun 2011 16:32:24 -1300</pubDate><comments>http://blogs.u2u.be/peter/post/2011/06/28/Running-multiple-sites-in-one-Windows-Azure-Web-Role.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Peter Himschoot</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/post.aspx?id=0f8571af-9d1f-4bc5-9b61-a3851a5afaa9</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">7</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/peter/trackback.axd?id=0f8571af-9d1f-4bc5-9b61-a3851a5afaa9</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/post/2011/06/28/Running-multiple-sites-in-one-Windows-Azure-Web-Role.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/syndication.axd?post=0f8571af-9d1f-4bc5-9b61-a3851a5afaa9</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/peter/post.aspx?id=cc6e54bb-d4c6-4af0-95f2-4ae0eb1042d0</guid><link>http://blogs.u2u.be/peter/post/2011/06/26/Remote-debugging-a-Windows-Azure-Worker-Role-using-Azure-Connect-Remote-desktop-and-the-remote-debugger-part-3.aspx</link><category>.NET Development</category><category>Azure</category><category>VS2010</category><title>Remote debugging a Windows Azure Worker Role using Azure Connect, Remote desktop and the remote debugger, part 3</title><description>&lt;p&gt;This is the third part of the “&lt;a href="http://blogs.u2u.be/peter/post/2011/06/22/Remote-debugging-a-Windows-Azure-Worker-Role-using-Azure-Connect-Remote-Desktop-and-the-Remote-debugger.aspx" target="_blank"&gt;Remote debugging a Windows Azure Worker Role using Azure Connect, Remote desktop and the remote debugger&lt;/a&gt;”. In this part I will show you how to attach the remote debugger on your worker role and start debugging…&lt;/p&gt;  &lt;h3&gt;Step 3: Connect to the remove debugger&lt;/h3&gt;  &lt;p&gt;In the &lt;a href="http://blogs.u2u.be/peter/post/2011/06/24/Remote-debugging-an-Azure-worker-role-using-Azure-Connect-remote-desktop-and-remote-debugger-part-2.aspx" target="_blank"&gt;previous blog post&lt;/a&gt; we ended up copying the remote debugger to the worker role instance machine.&lt;/p&gt;  &lt;p&gt;Open the remote debugger folder (the one you just copied) and &lt;strong&gt;start the remote debugger&lt;/strong&gt; by double-clicking the &lt;strong&gt;msvsmon.exe&lt;/strong&gt; application. The remote debugger should start:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_thumb16_thumb_1.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb16_thumb" border="0" alt="image_thumb16_thumb" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb16_thumb_thumb.png" width="604" height="204" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Take note of the server name. Minimize the remote desktop session.&lt;/p&gt;  &lt;p&gt;Open Visual Studio ( the one you used to publish the worker role project). &lt;/p&gt;  &lt;p&gt;Select Debug-&amp;gt;Attach to process… The &lt;strong&gt;Attach to Process &lt;/strong&gt;windows should open. Type in the server name you got when you started the remote debugger.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_thumb1_4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb1" border="0" alt="image_thumb1" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb1_thumb_3.png" width="475" height="174" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Be patient while Visual Studio downloads the list of processes from the remote server…&lt;/p&gt;  &lt;p&gt;WARNING: if you get authentication errors this means you are not using the same username and password from your local machine.&lt;/p&gt;  &lt;p&gt;After a while you should get a list of all processes:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_thumb3_4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb3" border="0" alt="image_thumb3" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb3_thumb_3.png" width="831" height="306" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Select the &lt;strong&gt;WaWorkerHost.exe&lt;/strong&gt; process and click the Attach button.&lt;/p&gt;  &lt;h3&gt;Step 4: debug!&lt;/h3&gt;  &lt;p&gt;Now you can add a breakpoint in your code and wait for the worker role to hit it. Again you will have to be patient…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/peter/image.axd?picture=image_thumb5_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb5" border="0" alt="image_thumb5" src="http://blogs.u2u.be/peter/image.axd?picture=image_thumb5_thumb.png" width="611" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Happy debugging!&lt;/p&gt;</description><pubDate>Sun, 26 Jun 2011 18:46:08 -1300</pubDate><comments>http://blogs.u2u.be/peter/post/2011/06/26/Remote-debugging-a-Windows-Azure-Worker-Role-using-Azure-Connect-Remote-desktop-and-the-remote-debugger-part-3.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Peter Himschoot</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/peter/post.aspx?id=cc6e54bb-d4c6-4af0-95f2-4ae0eb1042d0</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/peter/trackback.axd?id=cc6e54bb-d4c6-4af0-95f2-4ae0eb1042d0</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/post/2011/06/26/Remote-debugging-a-Windows-Azure-Worker-Role-using-Azure-Connect-Remote-desktop-and-the-remote-debugger-part-3.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/peter/syndication.axd?post=cc6e54bb-d4c6-4af0-95f2-4ae0eb1042d0</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=a01f0650-c549-4266-9f45-87e12c4a0268</guid><link>http://blogs.u2u.be/michael/post/2011/06/20/Visual-State-Manager-or-rather-Behavior-(part-3).aspx</link><category>Behavior</category><category>Silverlight</category><category>Windows Phone</category><title>Visual State Manager or rather Behavior ? (part 3)</title><description>&lt;p&gt;So far, so good. I created a little application indicating the distance to my geographically closest friend. I used Visual State Manager for making my indicator change, depending on the distance I get from the Distance-service. It takes some practice to get used to it. Now, I have two little problems with VSM:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It's a lot to write, even for having a simple control like our distance-indicator. &lt;/li&gt;

  &lt;li&gt;Changes (e.g. adding another state) always have to be done in two locations : code and XAML. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, when using Blend, you might have seen Behaviors, which you can drag and drop on top of your controls. They add some, ehm 'Behavior' to these controls. It also adds a specific assembly needed for creating these Behaviors, i.e. Microsoft.Phone.Interop. Next to a few out-of-the-box behaviors that Blend provides, you can start creating your own Behaviors. And the way of doing that, is just child's play. Simply create your own class, inheriting from Behavior&amp;lt;T&amp;gt; with T being the control for which you create a behavior. Of course, nothing stops you from using FrameworkElement here.&lt;/p&gt;

&lt;p&gt;I keep it simple, and I create a Behavior for the Ellipse. I also create 3 properties for specifying the colors for my distance-indicator:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DistanceBehavior : Behavior&amp;lt;Ellipse&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnAttached()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnAttached();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        Ellipse ao = AssociatedObject &lt;span class="kwrd"&gt;as&lt;/span&gt; Ellipse;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        DistanceReader.DistanceChanged += (s, ea) =&amp;gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (ea.Distance&amp;gt;5)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                ao.Fill = &lt;span class="kwrd"&gt;this&lt;/span&gt;.FarColor;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (ea.Distance&amp;gt;2)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                ao.Fill = &lt;span class="kwrd"&gt;this&lt;/span&gt;.AverageColor;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                ao.Fill = &lt;span class="kwrd"&gt;this&lt;/span&gt;.CloseColor;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        };&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Brush FarColor { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Brush AverageColor { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Brush CloseColor { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Let's now use this behavior on an ellipse we add to our MainPage. We first need to add the necessary namespaces to our xaml:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;xmlns:i=&lt;span class="str"&gt;&amp;quot;clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;xmlns:my=&lt;span class="str"&gt;&amp;quot;clr-namespace:WindowsPhoneApplication1&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;(!! I'm only showing the my-namespace here for completeness. Since we already added it to App.xaml in Part 1, we don't need to add it here).&lt;/p&gt;

&lt;p&gt;Let's now add our ellipse, and give it our Behavior :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Ellipse&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;i:Interaction.Behaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;my:DistanceBehavior&lt;/span&gt; &lt;span class="attr"&gt;FarColor&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Red&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;AverageColor&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Orange&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;CloseColor&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Green&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;i:Interaction.Behaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Ellipse&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;blockquote style="margin-right: 0px" dir="ltr"&gt;
  &lt;p&gt;Test your application again, and you'll see your ellipse change in the same way as your VSM-control, but this time with less coding and (in my opinion) easier to maintain.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br/&gt;
&lt;a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="piekenpuil" data-related="u2u"&gt;Tweet&lt;/a&gt;&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Mon, 20 Jun 2011 15:59:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/06/20/Visual-State-Manager-or-rather-Behavior-(part-3).aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=a01f0650-c549-4266-9f45-87e12c4a0268</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=a01f0650-c549-4266-9f45-87e12c4a0268</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/06/20/Visual-State-Manager-or-rather-Behavior-(part-3).aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=a01f0650-c549-4266-9f45-87e12c4a0268</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=be542f30-ef68-4a8a-bf87-a1dab41d9675</guid><link>http://blogs.u2u.be/michael/post/2011/06/19/Visual-State-Manager-or-rather-Behavior-(part-2).aspx</link><category>Silverlight</category><category>Visual State Manager</category><category>Windows Phone</category><title>Visual State Manager or rather Behavior ? (part 2)</title><description>&lt;p&gt;In part 1 I set up the service and the WP7-application. The WP7-application will poll the service regularly for asking the distance to the closest friend. Let's now finish the WP7-app so we can show the distance by a little indicator. When closer than 2 (km? miles ? light-years ? You choose) the indicator will show green, less then 5 will be orange, and all the rest is red. Let's first create an indicator using Visual State Manager. In VSM we will define different states. In code we define the state our control is in, and in XAML we define how a state should look like.&lt;/p&gt;

&lt;p&gt;Let's create our control:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TemplatePart(Name=&lt;span class="str"&gt;&amp;quot;Core&amp;quot;&lt;/span&gt;,Type=&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(FrameworkElement))]&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;[TemplateVisualState(Name=&lt;span class="str"&gt;&amp;quot;Far&amp;quot;&lt;/span&gt;,GroupName=&lt;span class="str"&gt;&amp;quot;DistanceStates&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;[TemplateVisualState(Name = &lt;span class="str"&gt;&amp;quot;Close&amp;quot;&lt;/span&gt;, GroupName = &lt;span class="str"&gt;&amp;quot;DistanceStates&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;[TemplateVisualState(Name = &lt;span class="str"&gt;&amp;quot;VeryClose&amp;quot;&lt;/span&gt;, GroupName = &lt;span class="str"&gt;&amp;quot;DistanceStates&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DistanceIndicator: Button&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    Ellipse corePart;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Ellipse CorePart &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; corePart; }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        set { corePart = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnApplyTemplate()&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnApplyTemplate();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        CorePart = (Ellipse) GetTemplateChild(&lt;span class="str"&gt;&amp;quot;Core&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        VisualStateManager.GoToState(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Far&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        DistanceReader.DistanceChanged += &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;DistanceEventArgs&amp;gt;(DistanceReader_DistanceChanged);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; DistanceReader_DistanceChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, DistanceEventArgs e)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Distance&amp;gt;5)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            VisualStateManager.GoToState(&lt;span class="kwrd"&gt;this&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;Far&amp;quot;&lt;/span&gt;,&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Distance &amp;gt; 2)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;            VisualStateManager.GoToState(&lt;span class="kwrd"&gt;this&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;Close&amp;quot;&lt;/span&gt;,&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;            VisualStateManager.GoToState(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;VeryClose&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;    }         &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;The code-attributes already shows you the different states my Indicator can have : Far, Close and VeryClose (OutOfInspirationException occurred). I add the controltemplate to App.xaml, describing how my three states should look like :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ControlTemplate&lt;/span&gt; &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;u2uCtrl&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;TargetType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;my:DistanceIndicator&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Ellipse&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ellipse&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{TemplateBinding Height}&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Fill&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Yellow&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;VisualStateManager.VisualStateGroups&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;VisualStateGroup&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;DistanceStates&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Close&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColorAnimation&lt;/span&gt; &lt;span class="attr"&gt;Duration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;To&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Orange&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetProperty&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;(Shape.Fill).(SolidColorBrush.Color)&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ellipse&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;d:IsOptimized&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;VeryClose&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColorAnimation&lt;/span&gt; &lt;span class="attr"&gt;Duration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;To&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Green&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetProperty&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;(Shape.Fill).(SolidColorBrush.Color)&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ellipse&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;d:IsOptimized&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Far&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColorAnimation&lt;/span&gt; &lt;span class="attr"&gt;Duration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;To&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Red&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetProperty&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;(Shape.Fill).(SolidColorBrush.Color)&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                                        &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ellipse&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;d:IsOptimized&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;VisualState&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;VisualStateGroup&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;VisualStateManager.VisualStateGroups&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Ellipse&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ControlTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;I cheated, of course: I used blend for creating this template. Nevertheless, I add my control to my MainPage:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;my:DistanceIndicator&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;distanceIndicator1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Template&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource u2uCtrl}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;That's it. Open the WPF-application, change the slider. Run the WP7-application and there you go. Play with the slider, and the WP7-app responds visually (after some time). Nice stuff, but it get's nicer with Behavior. That's for part 3. 

&lt;br/&gt;
&lt;a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="piekenpuil" data-related="u2u"&gt;Tweet&lt;/a&gt;&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Sun, 19 Jun 2011 16:23:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/06/19/Visual-State-Manager-or-rather-Behavior-(part-2).aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=be542f30-ef68-4a8a-bf87-a1dab41d9675</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=be542f30-ef68-4a8a-bf87-a1dab41d9675</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/06/19/Visual-State-Manager-or-rather-Behavior-(part-2).aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=be542f30-ef68-4a8a-bf87-a1dab41d9675</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=4bd05dfd-4632-442b-baed-7c83141b1de0</guid><link>http://blogs.u2u.be/michael/post/2011/06/15/Visual-State-Manager-or-rather-Behavior(part-1).aspx</link><category>Silverlight</category><category>Visual State Manager</category><category>Windows Phone</category><title>Visual State Manager or rather Behavior(part 1)</title><description>&lt;p&gt;During an interesting event last week, discussing the virtues of Silverlight apps out of the browser, I was confronted with Behavior. I should probably be ashamed because I never heard of them before. Because they have a high coolness- and awesomeness-level I checked if they were also available for Windows Phone, and hooray,&amp;nbsp; they are!&lt;/p&gt;
&lt;p&gt;Now what are they about ? In WPF you can use Triggers, to react on certain "events", like this one :&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button.Triggers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;EventTrigger&lt;/span&gt; &lt;span class="attr"&gt;RoutedEvent&lt;/span&gt;&lt;span class="kwrd"&gt;="Click"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;BeginStoryboard&lt;/span&gt; &lt;span class="attr"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;="{StaticResource mySB}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;EventTrigger&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Button.Triggers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Specially useful when you're creating your own Controltemplates. Unfortunately they're not available in Silverlight (except for the Loaded-event).&amp;nbsp; When creating your own controls, and you need them to have some kind of visual feedback, we'll have to use the Visual State Manager.&lt;/p&gt;
&lt;p&gt;In my little example I have a WP7-app that regularly calls a "Distance-service" that gives the shortest distance between you and your geographically closest friend (could be something Foursquare provides). The closest distance will be shown by some small colored ellipse. Whenever the distance changes, the color changes.&lt;/p&gt;
&lt;p&gt;Let's start by the service: I have a little WCF library that I'm hosting in a WPF-app. Service looks like this:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DistanceService : IDistanceService&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; GetDistance()&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; DistanceHelper.Distance;&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Can't make them smaller than this. What about this DistanceHelper ?&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DistanceHelper&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; distance=10;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; Distance&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; distance; }&lt;/pre&gt;
&lt;pre&gt;        set { distance = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre class="alt"&gt;    }        &lt;/pre&gt;
&lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;My MainWindow only has a slider going from 0 to 10, with an eventhandler for the ValueChanged. In this eventhandler I simply set the DIstance-property from DIstanceHelper:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; distanceSlider_ValueChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedPropertyChangedEventArgs&amp;lt;&lt;span class="kwrd"&gt;double&lt;/span&gt;&amp;gt; e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;    DistanceHelper.Distance = distanceSlider.Value;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;}&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Window_Loaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;    host = &lt;span class="kwrd"&gt;new&lt;/span&gt; ServiceHost(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(DistanceServiceLib.DistanceService));&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt;    host.Open();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt;}&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Window_Unloaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt;    host.Close();            &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I also configured my WCF-service to use simple basicHttpBinding.&lt;/p&gt;
&lt;p&gt;In my WP7-app I start by creating a service reference towards my service. This will be used by a helper-class DistanceReader:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DistanceReader&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; DistanceReader()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;        DispatcherTimer timer = &lt;span class="kwrd"&gt;new&lt;/span&gt; DispatcherTimer();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;        timer.Interval = &lt;span class="kwrd"&gt;new&lt;/span&gt; TimeSpan(0, 0, 10);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;        timer.Tick += (s, ea) =&amp;gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt;            var proxy = &lt;span class="kwrd"&gt;new&lt;/span&gt; DistanceServiceRef.DistanceServiceClient();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt;            proxy.GetDistanceCompleted+=(s2,ea2)=&amp;gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt;            {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt;                DistanceReader.LastDistance = ea2.Result;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt;            };&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt;            proxy.GetDistanceAsync();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt;        };&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt;        timer.Start();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt;    &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler&amp;lt;DistanceEventArgs&amp;gt; DistanceChanged;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnDistanceChanged(DistanceEventArgs e) &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (DistanceChanged!=&lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt;            DistanceChanged(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(DistanceReader), e);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; lastDistance;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; LastDistance&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 31: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 32: &lt;/span&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; lastDistance;}&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 33: &lt;/span&gt;        set &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 34: &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 35: &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (lastDistance!=&lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 36: &lt;/span&gt;            {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 37: &lt;/span&gt;                lastDistance = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 38: &lt;/span&gt;                OnDistanceChanged(&lt;span class="kwrd"&gt;new&lt;/span&gt; DistanceEventArgs() { Distance=&lt;span class="kwrd"&gt;value&lt;/span&gt;});&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt;            }                &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt;        } &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 41: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 42: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This class calls the service (every 10 seconds) and raises an event whenever the distance changes. Now, how to show this ? Let's start by the VSM-approach.&amp;nbsp; But that is something I'll leave for part 2.&lt;/p&gt;
&lt;br/&gt;
&lt;a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="piekenpuil" data-related="u2u"&gt;Tweet&lt;/a&gt;&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Wed, 15 Jun 2011 23:15:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/06/15/Visual-State-Manager-or-rather-Behavior(part-1).aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=4bd05dfd-4632-442b-baed-7c83141b1de0</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=4bd05dfd-4632-442b-baed-7c83141b1de0</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/06/15/Visual-State-Manager-or-rather-Behavior(part-1).aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=4bd05dfd-4632-442b-baed-7c83141b1de0</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=12710d86-43f4-4a47-ad5d-de987f8c9f87</guid><link>http://blogs.u2u.be/michael/post/2011/05/01/Updating-WP7-live-tiles-without-push-notifications.aspx</link><category>Push Notifications</category><category>Silverlight</category><category>Windows Phone</category><title>Updating WP7 live tiles without push notifications</title><description>&lt;p&gt;While experimenting with push notifications for updating your live tiles, I found the ShellTileSchedule-class. It sounded interesting enough to play around with it.&lt;/p&gt;
&lt;p&gt;On MSDN I found following description for &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.shell.shelltileschedule(VS.92).aspx" target="_blank"&gt;this class&lt;/a&gt; : Creates an object which allows an application to schedule updates of its tile's background image.&amp;nbsp; The ShellTileSchedule has some properties like the recurrence and the interval. The interval is an enumeration which goes from hourly to monthly :&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=1.jpg"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="1" src="http://blogs.u2u.be/michael/image.axd?picture=1_thumb.jpg" alt="1" width="137" height="96" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another Property is the RemoteImageUri. Because of the word "Remote" I assume that the image has to be remote (that was a hard one &lt;img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://blogs.u2u.be/michael/image.axd?picture=wlEmoticon-smile.png" alt="Smile" /&gt;). So for testing this thing I first set up a website, with simply a png-image (62*62 &amp;ndash; I copied Background.png and changed it a bit with Paint). Let's set up our schedule. This has to be done in the Application_Launching:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Application_Launching(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, LaunchingEventArgs e)&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    sts = &lt;span class="kwrd"&gt;new&lt;/span&gt; ShellTileSchedule();&lt;/pre&gt;
&lt;pre&gt;    sts.Interval = UpdateInterval.&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    sts.Recurrence = UpdateRecurrence.Interval;&lt;/pre&gt;
&lt;pre class="alt"&gt;    sts.RemoteImageUri = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(String.Format(&lt;span class="str"&gt;"http://localhost:51177/Site/Tiles/1.png"&lt;/span&gt;, TileNr.ToString()));&lt;/pre&gt;
&lt;pre&gt;    sts.Start();&lt;/pre&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;After starting the application I had to wait for an hour before my tile changed. Changing the clock settings didn't do the job either, but after an hour, finally the tile changed.&lt;/p&gt;
&lt;p&gt;This could be useful for pulling tiles, instead of pushing. Get a tile every hour for showing the weather conditions in your area.&lt;/p&gt;
&lt;p&gt;Now about this "Remote"-thing. Can I use a local png-file for changing the tile this way ? My first try was to add a png-file, and than refer to it this way:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;sts.RemoteImageUri = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;"/LocalTile/5.png"&lt;/span&gt;,UriKind.Relative);&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;That was not good.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=2.jpg"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="2" src="http://blogs.u2u.be/michael/image.axd?picture=2_thumb.jpg" alt="2" width="244" height="45" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also tried it with "/TilesTest;component/LocalTile/5.png", but also no success. I needed to get the absolute path. In Silverlight I can use App.Current.Host.Source and Windows Phone is Silverlight, right. But I cannot use the Source-property here, although I can see it in my Locals-window:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=3.jpg"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="3" src="http://blogs.u2u.be/michael/image.axd?picture=3_thumb.jpg" alt="3" width="601" height="235" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;OK, another try : let's use this code:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;Uri uri = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="str"&gt;"file:///Applications//Install//27F6C4CB-1192-44AD-A970-635F12689A08//Install"&lt;/span&gt;),&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="str"&gt;"//LocalTile//5.png"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;sts.RemoteImageUri = uri;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;OK, I know it's not very useful, because every user that has this application, will also have another GUID. Still : I do it for serving science &lt;img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="http://blogs.u2u.be/michael/image.axd?picture=wlEmoticon-winkingsmile.png" alt="Winking smile" /&gt;. Result :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=4.jpg"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="4" src="http://blogs.u2u.be/michael/image.axd?picture=4_thumb.jpg" alt="4" width="244" height="47" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What happened to my GUID and stuff jQuery152010964315148992043_1315308924440 Last try, Let's simplify by using this :&lt;/p&gt;
&lt;pre class="csharpcode"&gt;Uri uri = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(
    &lt;span class="str"&gt;"file:///Applications//Install//27F6C4CB-1192-44AD-A970-635F12689A08//Install//LocalTile//5.png"&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And now I get this :&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=5.jpg"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="5" src="http://blogs.u2u.be/michael/image.axd?picture=5_thumb.jpg" alt="5" width="460" height="82" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OK, I quit. Remote indeed means Remote.&lt;/p&gt;
&lt;br/&gt;
&lt;a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="piekenpuil" data-related="u2u"&gt;Tweet&lt;/a&gt;&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Sun, 01 May 2011 09:59:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/05/01/Updating-WP7-live-tiles-without-push-notifications.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=12710d86-43f4-4a47-ad5d-de987f8c9f87</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=12710d86-43f4-4a47-ad5d-de987f8c9f87</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/05/01/Updating-WP7-live-tiles-without-push-notifications.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=12710d86-43f4-4a47-ad5d-de987f8c9f87</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=8679de70-1104-48a9-a62a-0af6fae4bc20</guid><link>http://blogs.u2u.be/michael/post/2011/04/28/Saving-an-Image-to-the-Pictures-Hub.aspx</link><category>Images</category><category>MediaLibrary</category><category>Silverlight</category><category>Windows Phone</category><category>XNA</category><title>Saving an Image to the Pictures Hub</title><description>&lt;p&gt;Something that will also be discussed during the upcoming Windows Phone course, here at U2U, is the cooperation between Silverlight for Windows Phone and XNA.&lt;/p&gt;
&lt;p&gt;At the end of my previous blog post, I was left with one more challenge: saving my modified picture to the Pictures Hub. Until shortly I thought that the only way of using the Pictures Hub was through the PhotoChooserTask or the CameraCaptureTask. Luckily I came across the MediaLibrary-class from the XNA-framework, who gives much more possibilities for accessing your pictures.&lt;/p&gt;
&lt;p&gt;To start I needed to add a reference to Microsoft.Xna.Framework. This results in an alarming message :&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb.png" alt="image" width="603" height="409" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At first I tried to do some experimenting with the MediaLibrary. Let&amp;rsquo;s start by simply getting the number of pictures I have on the emulator :&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;ml = &lt;span class="kwrd"&gt;new&lt;/span&gt; MediaLibrary();&lt;/pre&gt;
&lt;pre&gt;nrOfPics = ml.Pictures.Count;&lt;/pre&gt;
&lt;pre class="alt"&gt;MessageBox.Show(nrOfPics.ToString());&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;That works nice. The Medialibrary has several collection I can use, like Pictures, Songs, Genres,&amp;hellip;&lt;/p&gt;
&lt;p&gt;Next step : lets create a little slideshow-app for iterating through my pictures. I start out with a simple page :&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="ContentPanel"&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="12,0,12,0"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="523*"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="84*"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Image&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="image1"&lt;/span&gt; &lt;span class="attr"&gt;Stretch&lt;/span&gt;&lt;span class="kwrd"&gt;="Fill"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="grid1"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColumnDefinition&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColumnDefinition&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="&amp;amp;gt;&amp;amp;gt;"&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Column&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="btnGoForward"&lt;/span&gt; &lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="attr"&gt;Click&lt;/span&gt;&lt;span class="kwrd"&gt;="btnGoForward_Click"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="&amp;amp;lt;&amp;amp;lt;"&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="btnGoBack"&lt;/span&gt; &lt;span class="attr"&gt;Click&lt;/span&gt;&lt;span class="kwrd"&gt;="btnGoBack_Click"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The code looks like this :&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainPage : PhoneApplicationPage&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; nrOfPics;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; picNr = 0;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;    MediaLibrary ml;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;    BitmapImage img = &lt;span class="kwrd"&gt;new&lt;/span&gt; BitmapImage();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;    &lt;span class="rem"&gt;// Constructor&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; MainPage()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt;        InitializeComponent();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PhoneApplicationPage_Loaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt;        ml = &lt;span class="kwrd"&gt;new&lt;/span&gt; MediaLibrary();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt;        nrOfPics = ml.Pictures.Count;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt;        MessageBox.Show(nrOfPics.ToString());&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt;        &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt;        ShowImage();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ShowImage()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt;        img.SetSource(ml.Pictures[picNr].GetImage());&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt;        image1.Source = img;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnGoBack_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 31: &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (--picNr&amp;lt;0)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 32: &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 33: &lt;/span&gt;            picNr = nrOfPics - 1;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 34: &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 35: &lt;/span&gt;        ShowImage();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 36: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 37: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 38: &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnGoForward_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (++picNr&amp;gt;=nrOfPics)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 41: &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 42: &lt;/span&gt;            picNr = 0;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 43: &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 44: &lt;/span&gt;        ShowImage();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 45: &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 46: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_1.png"&gt;&lt;img style="background-image: none; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blogs.u2u.be/michael/image.axd?picture=image_thumb_1.png" alt="image" width="267" height="439" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let's now return to the application created during my previous blog post. In the "Save Img" code we opened another page that simply showed the image with copyright-message. Let's now change the loaded-event of the WrittenImage-page so we can save the image :&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;WriteableBitmap bmp = PhoneApplicationService.Current.State[&lt;span class="str"&gt;"bmp"&lt;/span&gt;] &lt;span class="kwrd"&gt;as&lt;/span&gt; WriteableBitmap;&lt;/pre&gt;
&lt;pre&gt;writtenImage.Source = bmp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;MediaLibrary ml = &lt;span class="kwrd"&gt;new&lt;/span&gt; MediaLibrary();&lt;/pre&gt;
&lt;pre class="alt"&gt;Stream stream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();&lt;/pre&gt;
&lt;pre&gt;bmp.SaveJpeg(stream, bmp.PixelWidth, bmp.PixelHeight, 0, 100);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;ml.SavePicture(&lt;span class="str"&gt;"u2uPic.jpg"&lt;/span&gt;, stream);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;MessageBox.Show(&lt;span class="str"&gt;"Picture Saved..."&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The SaveJpeg-method from WritableBitmap gives me a Stream containing the image in jpg-format. SavePicture saves the image in the MediaLibrary. However: it doesn't work ! It took me some time to find out why: It seems that the position of the stream remains at the end-position. Insert this line of code just before the SavePicture-call to make it work:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;stream.Position=0;&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;It's working !! Cool.&lt;/p&gt;
&lt;p&gt;Next step: let's deploy these two apps to my device and test. Not working ! How the hell is that possible ? Retesting in the emulator : works fine. Retesting on device: not working. Aaaaargh !! Disconnecting my device, going over to a colleague to ventilate my frustration and see that all of a sudden it is working !! Seems that for this thing to work, it needs to be disconnected from the PC.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a class="twitter-share-button" href="http://twitter.com/share" data-related="u2u" data-via="piekenpuil" data-count="vertical"&gt;Tweet&lt;/a&gt;&lt;/p&gt;
&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Thu, 28 Apr 2011 10:21:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/04/28/Saving-an-Image-to-the-Pictures-Hub.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=8679de70-1104-48a9-a62a-0af6fae4bc20</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">5</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=8679de70-1104-48a9-a62a-0af6fae4bc20</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/04/28/Saving-an-Image-to-the-Pictures-Hub.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=8679de70-1104-48a9-a62a-0af6fae4bc20</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/kris/post.aspx?id=11a9376d-3a0e-4291-bac2-43c34ae7492b</guid><link>http://blogs.u2u.be/kris/post/2011/04/25/U2U-Consult-TechDays-2011-CD-Available-for-Download.aspx</link><category>.NET</category><category>Tools</category><category>WCF</category><title>U2U Consult TechDays 2011 CD Available for Download</title><description>&lt;p&gt;At TechDays 2011 in Antwerp, U2U Consult distributed a CD-ROM with two free tools. I’m happy to announce that the CD-ROM contents is now also &lt;a href="http://www.u2uconsult.com/DL/U2UConsultTechDays2011CD.ZIP" target="_blank"&gt;available for download&lt;/a&gt; from &lt;a href="http://www.u2uconsult.com/" target="_blank"&gt;our web site&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The U2U Consult SQL Database Analyzer is a tool for SQL Server database administrators and developers. It displays diagnostic information about a database and its hosting instance that is hard to collect when you only use the standard SQL Server tools. Just point the tool at a SQL Server database of your choice, and have a look at the reports generated by the tool.&lt;/p&gt;  &lt;p&gt;The U2U Consult Code Analysis Rules for Visual Studio 2010 are a series of additional code analysis rules for Visual Studio 2010 Premium or Ultimate, and two rule sets with recommended rules for libraries and applications. The rules include additional general performance and design rules, as well as a series of rules specifically for WCF. All rules are documented on the CD-ROM. Obviously, they are applicable to all .NET languages, including C# and VB.&lt;/p&gt;  &lt;p&gt;With this CD, for the first time we make two of our own tools available to you. These are only two small components out of the U2U Consult Framework, but we hope they are as useful to you as they are to us and our clients. Enjoy.&lt;/p&gt;</description><pubDate>Mon, 25 Apr 2011 05:15:19 -1300</pubDate><comments>http://blogs.u2u.be/kris/post/2011/04/25/U2U-Consult-TechDays-2011-CD-Available-for-Download.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Kris Vandermotten</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/kris/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/kris/post.aspx?id=11a9376d-3a0e-4291-bac2-43c34ae7492b</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">83</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/kris/trackback.axd?id=11a9376d-3a0e-4291-bac2-43c34ae7492b</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/kris/post/2011/04/25/U2U-Consult-TechDays-2011-CD-Available-for-Download.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/kris/syndication.axd?post=11a9376d-3a0e-4291-bac2-43c34ae7492b</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=154295f8-6968-4dd0-b029-b95bc95fa63b</guid><link>http://blogs.u2u.be/diederik/post/2011/04/24/Using-a-server-side-Prism-module-catalog-in-Silverlight.aspx</link><category>Silverlight</category><title>Using a server side Prism module catalog in Silverlight</title><description>&lt;p&gt;Prism 4.0, Managed Extensibility Framework, and Silverlight 4.0 provide an ideal combination to develop robust and flexible enterprise applications. This article explains&amp;nbsp;how you can&amp;nbsp;keep the Prism module catalog in such an application on the server side. In most of the &lt;a href="http://msdn.microsoft.com/en-us/library/gg430879(v=PandP.40).aspx"&gt;Prism Quickstarts&lt;/a&gt;, the module catalog is embedded in the shell:&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fcatalog_before.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The application class starts the bootstrapper:&lt;/p&gt;
&lt;div style="color: black; background: aliceblue;font-family: Courier New; font-size: 9pt; margin: 5px; padding: 5px; border-style: dashed; border-width: 1px; border-color:steelblue"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Application_Startup(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;StartupEventArgs&lt;/span&gt; e)
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;ApplicationBootstrapper&lt;/span&gt; bootstrapper = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ApplicationBootstrapper&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bootstrapper.Run();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The bootstrapper builds the catalog from the local file:&lt;/p&gt;
&lt;div style="color: black; background: aliceblue;font-family: Courier New; font-size: 9pt; margin: 5px; padding: 5px; border-style: dashed; border-width: 1px; border-color:steelblue"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IModuleCatalog&lt;/span&gt; CreateModuleCatalog()
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;ModuleCatalog&lt;/span&gt; catalog = Microsoft.Practices.Prism.Modularity.&lt;span style="color: #2b91af;"&gt;ModuleCatalog&lt;/span&gt;.CreateFromXaml(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Prism.Sample.Shell;component/Modules/ModuleCatalog.xaml"&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;UriKind&lt;/span&gt;.Relative));&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; catalog;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Unfortunately, this setup requires a rebuild and a redeploy of the shell application whenever a change in the catalog is needed (e.g. to add an extra module, or to remove a buggy module). In most -if not all- real-world scenarios it makes more sense to place the catalog in an area that allows easy modification. The following solution has the catalog in a file on the server side, but you can easily go for other storage locations, like a database table, a WCF service or a SharePoint list. Here's where the file is kept:&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fcatalog_after.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The bootstrapper gets an extra constructor that takes a stream:&lt;/p&gt;
&lt;div style="color: black; background: aliceblue;font-family: Courier New; font-size: 9pt; margin: 5px; padding: 5px; border-style: dashed; border-width: 1px; border-color:steelblue"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Stream&lt;/span&gt; stream;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; ApplicationBootstrapper(&lt;span style="color: #2b91af;"&gt;Stream&lt;/span&gt; stream)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.stream = stream;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This stream is used to build the catalog:&lt;/p&gt;
&lt;div style="color: black; background: aliceblue;font-family: Courier New; font-size: 9pt; margin: 5px; padding: 5px; border-style: dashed; border-width: 1px; border-color:steelblue"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IModuleCatalog&lt;/span&gt; CreateModuleCatalog()
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;ModuleCatalog&lt;/span&gt; catalog = Microsoft.Practices.Prism.Modularity.&lt;span style="color: #2b91af;"&gt;ModuleCatalog&lt;/span&gt;.CreateFromXaml(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.stream);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; catalog;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;On application startup, the file is read, wrapped in a stream, and handed over to the bootstrapper:&lt;/p&gt;
&lt;div style="color: black; background: aliceblue;font-family: Courier New; font-size: 9pt; margin: 5px; padding: 5px; border-style: dashed; border-width: 1px; border-color:steelblue"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Application_Startup(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;StartupEventArgs&lt;/span&gt; e)
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;WebClient&lt;/span&gt; client = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WebClient&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.OpenReadCompleted += &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Client_OpenReadCompleted;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.OpenReadAsync(&lt;span style="color: blue;"&gt;new&lt;/span&gt; System.&lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;@"Modules\ModuleCatalog.xaml"&lt;/span&gt;, System.&lt;span style="color: #2b91af;"&gt;UriKind&lt;/span&gt;.Relative));&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Client_OpenReadCompleted(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;OpenReadCompletedEventArgs&lt;/span&gt; e)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;ApplicationBootstrapper&lt;/span&gt; bootstrapper = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ApplicationBootstrapper&lt;/span&gt;(e.Result);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bootstrapper.Run();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The following two projects demonstrate both approaches. The application is a small Prism-MEF-Silverlight tutorial application that I wrote a couple of months ago. Here's how it looks like:&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fapplication.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Here's the project before and after the modification (it&amp;nbsp;contains the Prism dll's, so you might need to unblock these):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Catalog in the Shell xap: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2011%2f4%2fU2UConsult.Prism.Sample.Application.1.zip"&gt;U2UConsult.Prism.Sample.Application.1.zip (1,99 mb)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Catalog on the server: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2011%2f4%2fU2UConsult.Prism.Sample.Application.2.zip"&gt;U2UConsult.Prism.Sample.Application.2.zip (1,03 mb)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enjoy !&lt;/p&gt;</description><pubDate>Sun, 24 Apr 2011 09:03:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2011/04/24/Using-a-server-side-Prism-module-catalog-in-Silverlight.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=154295f8-6968-4dd0-b029-b95bc95fa63b</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=154295f8-6968-4dd0-b029-b95bc95fa63b</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2011/04/24/Using-a-server-side-Prism-module-catalog-in-Silverlight.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=154295f8-6968-4dd0-b029-b95bc95fa63b</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=5b935d45-0756-4e46-a50b-b40b641b211e</guid><link>http://blogs.u2u.be/michael/post/2011/04/20/Adding-a-text-to-an-image-in-WP7.aspx</link><category>Images</category><title>Adding a text to an image in WP7</title><description>&lt;p&gt;Some time ago, somebody asked me if it was possible to add some text to an image, and then use the combination image-text as a new image. It seems that it&amp;rsquo;s rather easy to do, and it&amp;rsquo;s very similar to the way you could achieve this in regular Silverlight.&lt;/p&gt;
&lt;p&gt;I started out by adding this piece of XAML to my MainPage :&lt;/p&gt;
&lt;p&gt;&lt;span style="color: blue; font-family: Courier New;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;Grid&lt;span style="color: red;"&gt; x&lt;span style="color: blue;"&gt;:&lt;span style="color: red;"&gt;Name&lt;span style="color: blue;"&gt;=&amp;rdquo;ContentPanel&amp;rdquo;&lt;span style="color: red;"&gt; Grid.Row&lt;span style="color: blue;"&gt;=&amp;rdquo;1&amp;Prime;&lt;span style="color: red;"&gt; Margin&lt;span style="color: blue;"&gt;=&amp;rdquo;12,0,12,0&amp;Prime;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;Grid.RowDefinitions&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;RowDefinition&lt;span style="color: red;"&gt; Height&lt;span style="color: blue;"&gt;=&amp;rdquo;532*&amp;rdquo; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;RowDefinition&lt;span style="color: red;"&gt; Height&lt;span style="color: blue;"&gt;=&amp;rdquo;75*&amp;rdquo; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;span style="color: #a31515;"&gt;Grid.RowDefinitions&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;Grid&lt;span style="color: red;"&gt; Name&lt;span style="color: blue;"&gt;=&amp;rdquo;TheImage&amp;rdquo;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;Image&lt;span style="color: red;"&gt; Name&lt;span style="color: blue;"&gt;=&amp;rdquo;sourceImg&amp;rdquo;&lt;span style="color: red;"&gt; Stretch&lt;span style="color: blue;"&gt;=&amp;rdquo;Uniform&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: red;"&gt; Source&lt;span style="color: blue;"&gt;=&amp;rdquo;/WritableBitMap;component/Images/BasilicaNotreDame_ROW459961203.jpg&amp;rdquo; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;TextBlock&lt;span style="color: red;"&gt; VerticalAlignment&lt;span style="color: blue;"&gt;=&amp;rdquo;Center&amp;rdquo;&lt;span style="color: red;"&gt; Text&lt;span style="color: blue;"&gt;=&amp;rdquo;(c) U2U&amp;rdquo;&lt;span style="color: red;"&gt; HorizontalAlignment&lt;span style="color: blue;"&gt;=&amp;rdquo;Center&amp;rdquo;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;span style="color: #a31515;"&gt;Grid&lt;span style="color: blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt; &lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;Grid&lt;span style="color: red;"&gt; Grid.Row&lt;span style="color: blue;"&gt;=&amp;rdquo;1&amp;Prime;&lt;span style="color: red;"&gt; Name&lt;span style="color: blue;"&gt;=&amp;rdquo;grid1&amp;Prime;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;Grid.ColumnDefinitions&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;ColumnDefinition&lt;span style="color: red;"&gt; Width&lt;span style="color: blue;"&gt;=&amp;rdquo;*&amp;rdquo; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;ColumnDefinition&lt;span style="color: red;"&gt; Width&lt;span style="color: blue;"&gt;=&amp;rdquo;*&amp;rdquo; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;span style="color: #a31515;"&gt;Grid.ColumnDefinitions&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;Button&lt;span style="color: red;"&gt; Content&lt;span style="color: blue;"&gt;=&amp;rdquo;Get Picture&amp;rdquo;&lt;span style="color: red;"&gt; Name&lt;span style="color: blue;"&gt;=&amp;rdquo;button1&amp;Prime;&lt;span style="color: red;"&gt; Click&lt;span style="color: blue;"&gt;=&amp;rdquo;button1_Click&amp;rdquo; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;span style="color: #a31515;"&gt;Button&lt;span style="color: red;"&gt; Content&lt;span style="color: blue;"&gt;=&amp;rdquo;Save Img&amp;rdquo;&lt;span style="color: red;"&gt; Grid.Column&lt;span style="color: blue;"&gt;=&amp;rdquo;1&amp;Prime;&lt;span style="color: red;"&gt; Name&lt;span style="color: blue;"&gt;=&amp;rdquo;addMsgButton&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: red;"&gt; Click&lt;span style="color: blue;"&gt;=&amp;rdquo;addMsgButton_Click&amp;rdquo; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;span style="color: #a31515;"&gt;Grid&lt;span style="color: blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: blue; font-family: Courier New;"&gt;&amp;lt;/&lt;span style="color: #a31515;"&gt;Grid&lt;span style="color: blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This creates something like this :&lt;/p&gt;
&lt;p&gt;&lt;img src="http://piekenpuil.files.wordpress.com/2011/04/041411_2122_addingatext11.png?w=614" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;What I need to do now, is to use the grid, combining the Image and the TextBlock, as a new Image. To make it a bit more complete I also added a Button for fetching a picture from the PictureHub:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; button1_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;RoutedEventArgs&lt;/span&gt; e) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;{&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;br /&gt;&lt;span style="color: #2b91af;"&gt;PhotoChooserTask&lt;/span&gt; task = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PhotoChooserTask&lt;/span&gt;(); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt; task.Completed += (s, ea) =&amp;gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt; { &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt; img = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;BitmapImage&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt; img.SetSource(ea.ChosenPhoto);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt; sourceImg.Source = img;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt; };&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt; task.Show();&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;br /&gt;&lt;/span&gt;For creating an new Image, out of the original one plus the added TextBlock, I use the WriteableBitmap-class, which has a constructor that takes a UIElement as input. This one I save in the service-state, and I open another page (WrittenImage.xaml).&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="color: #2b91af;"&gt;WriteableBitmap&lt;/span&gt; wbm = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WriteableBitmap&lt;/span&gt;(TheImage, &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="color: #2b91af;"&gt;PhoneApplicationService&lt;/span&gt;.Current.State[&lt;span style="color: #a31515;"&gt;"bmp"&lt;/span&gt;] = wbm;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;NavigationService.Navigate(&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;ldquo;/WrittenImage.xaml&amp;rdquo;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;UriKind&lt;/span&gt;.Relative)); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;WrittenImage.xaml is a simple Page that only has one Image-control (called writtenImage, to make a little bit confusing &amp;ndash; I like confusion, sometimes). In the loaded-event I have following code :&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;PhoneApplicationService&lt;/span&gt;.Current.State.ContainsKey(&lt;span style="color: #a31515;"&gt;&amp;ldquo;bmp&amp;rdquo;&lt;/span&gt;))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt; writtenImage.Source = &lt;span style="color: #2b91af;"&gt;PhoneApplicationService&lt;/span&gt;.Current.State[&lt;span style="color: #a31515;"&gt;"bmp"&lt;/span&gt;] &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WriteableBitmap&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;} &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;Nice. The next question is then if it&amp;rsquo;s possible to save this image in the Picture-hub. That&amp;rsquo;s for a next time&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;If you know of a more elegant way of adding text to an image, let it know !&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; &lt;a class="twitter-share-button" href="http://twitter.com/share" data-related="u2u" data-via="piekenpuil" data-count="vertical"&gt;Tweet&lt;/a&gt;&lt;/p&gt;
&lt;script type="text/javascript" src="http://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;</description><pubDate>Wed, 20 Apr 2011 20:57:00 -1300</pubDate><comments>http://blogs.u2u.be/michael/post/2011/04/20/Adding-a-text-to-an-image-in-WP7.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Michaël Van Wesemael</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/michael/post.aspx?id=5b935d45-0756-4e46-a50b-b40b641b211e</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/michael/trackback.axd?id=5b935d45-0756-4e46-a50b-b40b641b211e</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2011/04/20/Adding-a-text-to-an-image-in-WP7.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=5b935d45-0756-4e46-a50b-b40b641b211e</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=0f2758dd-54ee-4568-be21-eb3b1a98cf3a</guid><link>http://blogs.u2u.be/diederik/post/2011/04/01/How-to-migrate-a-TFS-team-project-to-a-new-process-template.aspx</link><title>How to migrate a TFS team project to a new process template</title><description>&lt;p&gt;Here's the bad news: there are two very common things that should be easy, but can NOT be done in Team Foundation Server.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You can not switch an existing team project to a new set of process templates.&lt;/li&gt;
&lt;li&gt;You can not rename a team project. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These are two show stoppers when you have a team project containing a couple of man years of coding, and&amp;nbsp;you want to migrate to e.g. the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/59ac03e3-df99-4776-be39-1917cbfc5d8e/"&gt;Microsoft Visual Studio Scrum 1.0&lt;/a&gt; templates.&lt;/p&gt;
&lt;p&gt;Here's the good news: the show can go on! You c&amp;aacute;n migrate a TFS team project to an new process template in a supported way, and with just minimum loss of information. It just takes a lot more effort -and guts- than it should take.&lt;/p&gt;
&lt;p&gt;Here's a procedure:&lt;/p&gt;
&lt;h2&gt;Step 1: Create a (new) backup team project.&lt;/h2&gt;
&lt;p&gt;You need a backup project to temporarily host all data. It doesn't matter what process templates you select for this project, since &lt;span style="text-decoration: underline;"&gt;you're going to lose the work item tracking anyway&lt;/span&gt;. In most situations that's not a real problem: you probably decided to migrate to another process template because you didn't like your current work items...&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fNew.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Step 2:&amp;nbsp;Copy the files and their&amp;nbsp;version history to this new project.&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;This sounds easy, but it can't be done with the standard toolset. For this task you need to&amp;nbsp;download and install the Team Foundation Integration Tools, a platform developed by the Visual Studio ALM Rangers. The TFS Integration Tools come in two flavors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the &lt;a href="http://tfsintegration.codeplex.com/"&gt;bleeding edge version&lt;/a&gt; on Codeplex, and&lt;/li&gt;
&lt;li&gt;the &lt;a href="http://visualstudiogallery.msdn.microsoft.com/f854dd59-8eeb-4673-8d9a-ae012989bfa2"&gt;supported product&lt;/a&gt; in the Visual Studio Gallery.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For this type of TFS-to-TFS migration the March 2011 release of the non-bleeding version is OK, and it's fully supported by our friends in Redmond - you never know...&lt;/p&gt;
&lt;p&gt;The TFS Integration Tools are not really lightweight. You'll need an extra SQL Server database -SQL Express is good enough if you don't hit the 4GB size limit- and two Windows services will be installed:&lt;/p&gt;
&lt;table border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fsql.png" alt="" /&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fServices.png" alt="" /&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The backup project should be populated through&amp;nbsp;a new migration from TFS to TFS, with VersionHistory only. Your project's work item tracking&amp;nbsp;will be&amp;nbsp;lost if you migrate to a project with another process template. Here are the two configuration screens. The configuration will be persisted in the database:&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fConfigure.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fConfigure2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The tool will store&amp;nbsp;the source project's metadata in a database. It then populates the target project by replaying all check-in activities through the API of TFS, controlled by&amp;nbsp;a windows service.&lt;/p&gt;
&lt;p&gt;During the process, you might need to solve some minor conflicts, e.g. regarding the build template xaml files:&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fResolve.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Whilst the migration is running, you can sit back and relax, and&amp;nbsp;keep an eye on the process:&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fRun.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Step 3: Delete the original team project.&lt;/h2&gt;
&lt;p&gt;This is by far the most scary step, but it's necessary&amp;nbsp;if&amp;nbsp;you want to reuse the original project name. It's a step that can not be&amp;nbsp;performed from Visual Studio: you need to do this&amp;nbsp;via the TFS Administration Console. Here are the buttons&amp;nbsp;and&amp;nbsp;the checkboxes&amp;nbsp;that will remove all traces of several man years of development in just a couple of seconds:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img style="border: 0px" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f4%2fDelete.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The rest of the story is obvious: you need to re-run everything in the opposite direction.&lt;/p&gt;
&lt;h2&gt;Step 4: Recreate the project.&lt;/h2&gt;
&lt;p&gt;Make sure to select the correct process templates.&lt;/p&gt;
&lt;h2&gt;Step 5: Repopulate the new project from the the backup project.&lt;/h2&gt;
&lt;p&gt;Reselect TFS-to-TFS, and keep VersionHistory.&lt;/p&gt;
&lt;p&gt;And there you are!&lt;/p&gt;</description><pubDate>Fri, 01 Apr 2011 19:20:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2011/04/01/How-to-migrate-a-TFS-team-project-to-a-new-process-template.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=0f2758dd-54ee-4568-be21-eb3b1a98cf3a</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=0f2758dd-54ee-4568-be21-eb3b1a98cf3a</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2011/04/01/How-to-migrate-a-TFS-team-project-to-a-new-process-template.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=0f2758dd-54ee-4568-be21-eb3b1a98cf3a</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=5fe5b435-ddc6-41ab-84fd-412c9e59afa0</guid><link>http://blogs.u2u.be/diederik/post/2011/03/26/Cloning-Entities-in-Silverlight.aspx</link><category>Spatial</category><title>Cloning Entities in Silverlight</title><description>&lt;p&gt;Here's a nice little extension method that returns a deep copy of a relatively simple object - like an Entity or a Data Transfer Object. It is based on the &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx"&gt;DataContractSerializer&lt;/a&gt;, so the object should be serializable through XML or a DataContract.&lt;/p&gt;
&lt;p&gt;The extension works&amp;nbsp;from Silverlight 2 upwards:&lt;/p&gt;
&lt;div style="color: black; background: aliceblue;font-family: Courier New; font-size: 9pt; margin: 5px; padding: 5px; border-style: dashed; border-width: 1px; border-color:steelblue"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;GenericExtensions&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; T Clone&amp;lt;T&amp;gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt; T source)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DataContractSerializer&lt;/span&gt; dcs = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DataContractSerializer&lt;/span&gt;(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(T));&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;MemoryStream&lt;/span&gt; ms = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MemoryStream&lt;/span&gt;())&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dcs.WriteObject(ms, source);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ms.Position = 0;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (T)dcs.ReadObject(ms);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="http://blogs.u2u.be/diederik/image.axd?picture=2011%2f3%2fClone-Trooper-icon.png" alt="" /&gt;Enjoy!&lt;/p&gt;</description><pubDate>Sat, 26 Mar 2011 05:15:00 -1300</pubDate><comments>http://blogs.u2u.be/diederik/post/2011/03/26/Cloning-Entities-in-Silverlight.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Diederik Krols</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/diederik/post.aspx?id=5fe5b435-ddc6-41ab-84fd-412c9e59afa0</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=5fe5b435-ddc6-41ab-84fd-412c9e59afa0</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2011/03/26/Cloning-Entities-in-Silverlight.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=5fe5b435-ddc6-41ab-84fd-412c9e59afa0</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/u2u/post.aspx?id=aeb983e2-af8d-4317-b20c-5488e5336087</guid><link>http://blogs.u2u.be/u2u/post/2010/12/16/Using-reporting-services-with-Oracle-package-stored-procedure.aspx</link><category>SQL Server BI</category><category>Reporting Services</category><title>Using reporting services with Oracle package / stored procedure</title><description>&lt;p&gt;Reporting services can create data sets on top of Oracle stored procedures. Sure, the manual says so, but this afternoon, I tried to get things up and running, and I want to share some of the dead ends and problems I experienced in that, maybe it can help you avoid these obstacles. Don’t panic, not all paths are dead ends, we got to the stored procs in Oracle via Reporting Services &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.u2u.be/u2u/image.axd?picture=wlEmoticon-smile_1.png" /&gt;.&lt;/p&gt;  &lt;p&gt;Please note that I’m not an oracle expert, nor did I spend days figuring these things out. So please, if you can share your experience, please do so!&lt;/p&gt;  &lt;h4&gt;Getting started&lt;/h4&gt;  &lt;p&gt;There are two important decisions that can cause this querying to go wrong:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Which data provider do we use? &lt;/li&gt;    &lt;li&gt;How do we create the procedure in Oracle &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;First the data provider. I installed &lt;strong&gt;Oracle 10g Express&lt;/strong&gt; edition on the same machine that was running Microsoft &lt;strong&gt;Reporting Services 2008 R2&lt;/strong&gt;. To test the connection with Oracle independent of the Microsoft product stack, I also installed the freeware version of Toad. A first frustration that I ran into was that I was unable to connect to Oracle from Toad on my &lt;strong&gt;64 bit&lt;/strong&gt; version of windows 7. I could access Oracle from the web interface, but not from Toad. Installing the client tools for Oracle express didn’t help &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Sad smile" src="http://blogs.u2u.be/u2u/image.axd?picture=wlEmoticon-sadsmile.png" /&gt;.&lt;/p&gt;  &lt;p&gt;So I moved to 32 bit box of Win7. Installing Oracle Express with client tools on this box and… hurray, Toad can talk to Oracle. Next, I used Integration Services to push the DimGeography table from AdventureworksDW into my Oracle.&lt;/p&gt;  &lt;p&gt;Time to query the data from Reporting Services. I first try sending an explicit query with the three data providers that I have on my machine:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Microsoft OleDb Provider for Oracle (MSDAORA) &lt;/li&gt;    &lt;li&gt;Oracle Provider for OLE DB (OraOLEDB) &lt;/li&gt;    &lt;li&gt;Oracle (OracleClient .Net) &lt;/li&gt; &lt;/ol&gt;  &lt;h4&gt;MSDAORA&lt;/h4&gt;  &lt;p&gt;Configuring the data provider is straight forward, only remember to &lt;strong&gt;not&lt;/strong&gt; use “.” or “(local)” as the name of the local machine, but use localhost (or 127.0.0.1) instead. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/u2u/image.axd?picture=MSDAORA_prop.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="MSDAORA_prop" border="0" alt="MSDAORA_prop" src="http://blogs.u2u.be/u2u/image.axd?picture=MSDAORA_prop_thumb.png" width="192" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;When I create a dataset with query type &lt;strong&gt;Text&lt;/strong&gt;, I can start the graphical query builder. The query builder lists nicely all tables and views, and is clever enough to put double quotes around my object names.    &lt;br /&gt;&lt;a href="http://blogs.u2u.be/u2u/image.axd?picture=MSDAORA_query.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="MSDAORA_query" border="0" alt="MSDAORA_query" src="http://blogs.u2u.be/u2u/image.axd?picture=MSDAORA_query_thumb.png" width="244" height="185" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Also query type &lt;strong&gt;Table&lt;/strong&gt; is available, but unfortunately, this one does not list the available tables, I must type the table name myself. Don’t forget to put double quotes around the table name, or Oracle can become angry at you!&lt;/p&gt;  &lt;p&gt;Query type &lt;strong&gt;Stored Procedure&lt;/strong&gt; is available as well, but whatever I tried, I could not get it working. Nothing shows up in the drop-down box, typing the procedure name&amp;#160; results in an error asking for parameters, when I start adding parameters in the call as well, it either claims     &lt;br /&gt;&lt;font face="Courier New"&gt;ORA-06550 PLS-00201 identifier must be declared&lt;/font&gt;, or     &lt;br /&gt;&lt;font face="Courier New"&gt;ORA-06550 PLS-00306 wrong number or types of arguments&lt;/font&gt;, or     &lt;br /&gt;&lt;font face="Courier New"&gt;ORA-01008 not all variables bound&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I gave up on this one.&lt;/p&gt;  &lt;h4&gt;OraOLEDB&lt;/h4&gt;  &lt;p&gt;Also easy to configure this Oracle OleDb driver, just as MSDAORA. When building a query in the graphical query builder environment, the query builder doesn’t put double quotes around table and column names, which causes error    &lt;br /&gt;&lt;font face="Courier New"&gt;ORA-00942: table or view does not exist&lt;/font&gt;.     &lt;br /&gt;Of course, we can manually add the quotes, but it’s nice if computers work for us, not the other way around. Besides this, the driver seems to give the same results as MSDAORA, and I can’t seem to get the stored procedure calls up and running. Next!&lt;/p&gt;  &lt;h4&gt;OracleClient&lt;/h4&gt;  &lt;p&gt;Last one down the list. Configuring the DataSource is comparable with the two previous: local connections should refer to Localhost or 127.0.0.1, not just “.”. As query type, only Text and Stored procedure is available, not Table. The Text graphical query builder behaves as with MSDORA. &lt;/p&gt;  &lt;p&gt;But the very good news is that if you create an Oracle stored procedure in the proper way (more on that in a second), that you can select the stored procedure radio button and the drop-down box will be populated with the Oracle stored procedures! Just select one from the list and it will behave exactly as on sql server: All the regular parameters of the stored procedure become report parameters, and a data set is built based on the first table returned by the stored procedure.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/u2u/image.axd?picture=OracleClient_sprocs.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="OracleClient_sprocs" border="0" alt="OracleClient_sprocs" src="http://blogs.u2u.be/u2u/image.axd?picture=OracleClient_sprocs_thumb.png" width="244" height="191" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Building the Oracle stored procedure&lt;/h4&gt;  &lt;p&gt;Oracle is somewhat different from SQL Server when it comes to stored procedures. In Oracle you can create a package, a container in which you can declare and implement variables, stored procedures, functions,…. In contrast to SQL Server, a stored procedure in Oracle cannot return a table, only functions can do so. But … we still need to use the stored procedure anyhow, if we want it to show up in the Reporting services drop-down box. The trick is to make sure this stored procedure builds up the result in a REF CURSOR, and make this ref cursor a parameter! To illustrate this, I show you the code to get a list of all cities in a particular country (a lot of thanks to Philippe Clercq for writing this!)&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;CREATE OR REPLACE PACKAGE sp_country AS&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160; type ref_cursor is REF CURSOR;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160; PROCEDURE get_city(country_name IN varchar2 default null,po_cursor out ref_cursor);      &lt;br /&gt;END sp_country;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;CREATE OR REPLACE PACKAGE sp_country AS     &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;PROCEDURE get_city(country_name IN varchar2,po_cursor out ref_cursor)&amp;#160; IS&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160; BEGIN      &lt;br /&gt;&amp;#160; open po_cursor for SELECT       &lt;br /&gt;&amp;quot;GeographyKey&amp;quot;, &amp;quot;City&amp;quot;, &amp;quot;StateProvinceCode&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160; &amp;quot;StateProvinceName&amp;quot;, &amp;quot;CountryRegionCode&amp;quot;, &amp;quot;EnglishCountryRegionName&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160; &amp;quot;SpanishCountryRegionName&amp;quot;, &amp;quot;FrenchCountryRegionName&amp;quot;, &amp;quot;PostalCode&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160; &amp;quot;SalesTerritoryKey&amp;quot;      &lt;br /&gt;FROM DW.&amp;quot;DimGeography&amp;quot; g      &lt;br /&gt;where upper(g.&amp;quot;EnglishCountryRegionName&amp;quot;) like upper(country_name||'%');&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; END;      &lt;br /&gt;END sp_country;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;And with that, we could finally build our Reporting Services report on top of Oracle Express Edition (XE) and have the stored procedures show up in the drop down box. Of course, once your data is in, it doesn’t matter anymore whether you build your reports on top of SQL Server or Oracle.&lt;/p&gt;  &lt;p&gt;Nico&lt;/p&gt;</description><pubDate>Thu, 16 Dec 2010 09:42:47 -1300</pubDate><comments>http://blogs.u2u.be/u2u/post/2010/12/16/Using-reporting-services-with-Oracle-package-stored-procedure.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Nico Jacobs</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/u2u/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/u2u/post.aspx?id=aeb983e2-af8d-4317-b20c-5488e5336087</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">231</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/u2u/trackback.axd?id=aeb983e2-af8d-4317-b20c-5488e5336087</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/u2u/post/2010/12/16/Using-reporting-services-with-Oracle-package-stored-procedure.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/u2u/syndication.axd?post=aeb983e2-af8d-4317-b20c-5488e5336087</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/kris/post.aspx?id=0365afef-9b09-4464-a8b3-46a134e63069</guid><link>http://blogs.u2u.be/kris/post/2010/11/30/Farewell-Visitor.aspx</link><category>.NET</category><title>Farewell Visitor</title><description>&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/Visitor_pattern" target="_blank"&gt;Visitor design pattern&lt;/a&gt; was first documented in 1995 by the &lt;a href="http://en.wikipedia.org/wiki/Design_Patterns" target="_blank"&gt;Gang of Four&lt;/a&gt;. It’s a workaround for the fact that most strongly typed object oriented languages only support single dispatch, even when sometimes &lt;a href="http://en.wikipedia.org/wiki/Double_dispatch" target="_blank"&gt;double dispatch&lt;/a&gt; is required. With C# 4, we no longer need this workaround. We now have something better, more on that below. Let’s look at an example.&lt;/p&gt; &lt;h2&gt;The traditional Visitor pattern&lt;/h2&gt; &lt;p&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx" target="_blank"&gt;System.Linq.Expressions&lt;/a&gt; namespace contains types that enable code expressions to be represented as objects in the form of expression trees. For example, the following C# statement creates an expression tree:&lt;/p&gt;&lt;pre style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; font-family: ; padding-top: 0px"&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;&lt;font style="font-size: "&gt;Expression&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: "&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Func&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;gt;&amp;gt; f = x =&amp;gt; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Math&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Sin(1 + 2 * x);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There are many kinds of expressions. The above example creates several objects of different types, including ParameterExpression, ConstantExpression, BinaryExpression and MethodCallExpression, all of which inherit from &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.aspx" target="_blank"&gt;Expression&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are many ways to represent expressions as text. For example, we can use an infix notation (as most programming languages do), but we can also use prefix or postfix notation. Anyone who as ever worked with an HP scientific calculator, or a programming language such as Forth, will appreciate postfix notation, also known as &lt;a href="http://en.wikipedia.org/wiki/Reverse_Polish_Notation" target="_blank"&gt;reverse polish notation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As a result, the way to translate a particular expression into a text representation depends on two things: the kind of expression and the kind of notation. More precisely, the method to execute to translate an expression object into a string object depends on the type of the expression, and on the type of the translation algorithm. Using a virtual function would allow the system to choose a method based on one of these dimensions, e.g. the type of expression, but not on both. &lt;strong&gt;Virtual functions provide single dispatch, but we need dual dispatch.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In fact, the expression class has a virtual ToString() method, inherited from object. Every type inheriting from Expression has its own version, making the algorithm depend on the type of expression. But it’s a hardcoded implementation, using an infix notation. What if we want a postfix ToString? Or Prefix? Or a C# or F# syntax? This is where the Visitor pattern can help us, and luckily the Expression class has support for it. The class &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.expressionvisitor.aspx" target="_blank"&gt;ExpressionVisitor&lt;/a&gt; is an abstract base class for algorithms working on expressions. Now when I say algorithms, you probably think of methods with parameters and return values, but that’s not how a Visitor works. A Visitor is an object of some class, and parameters must be passed in, typically via the constructor. The return value, i.e. the result of the algorithm must be read back from a property. Let’s create a base class for our ToString visitors:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: "&gt;&lt;font size="2"&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;abstract&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ToStringVisitor&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionVisitor&lt;/font&gt;&lt;/span&gt; &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: "&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;{ &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;readonly&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; resultAccumulator = &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;(); &lt;br&gt;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: "&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; Result &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; { &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font color="#000000" size="2"&gt; resultAccumulator.ToString(); } &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;br&gt;&lt;/p&gt;
&lt;p&gt;This provides us with a base class for Visitors that have a string Result property. There are some issues with it, such as when to Clear() the StringBuilder when the Visitor is reused, but let’s not get into those. We can now create a ToPostfixStringVisitor, and encapsulate it behind a static method:&lt;/p&gt;&lt;pre style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; font-family: ; padding-top: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: " size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: "&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionExtensions&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: "&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; ToPostfixString(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Func&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;&amp;gt;&amp;gt; function)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; visitor = &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ToPostFixStringVisitor&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;();&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; visitor.Visit(function);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; visitor.Result;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ToPostFixStringVisitor&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ToStringVisitor&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitLambda&amp;lt;T&amp;gt;(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;&amp;lt;T&amp;gt; node)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#008000"&gt;// enables reusing the visitor – not absolutely required here as the only &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;&lt;pre style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; font-family: ; padding-top: 0px"&gt;&lt;font style="font-size: "&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#008000"&gt;            // place where an instance can be created is in the ToPostfixString method.&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.resultAccumulator.Clear();&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;foreach&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; parameter &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;in&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node.Parameters)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Visit(parameter);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;"-&amp;gt; "&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Visit(node.Body);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitParameter(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ParameterExpression&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(node.Name);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;' '&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitBinary(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;BinaryExpression&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Visit(node.Left);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Visit(node.Right);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;switch&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; (node.NodeType)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Add:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.AddChecked:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;'+'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Multiply:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.MultiplyChecked:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;'*'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Subtract:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.SubtractChecked:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;'-'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Divide:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;'/'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Modulo:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;'%'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;default&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;throw&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;NotSupportedException&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;' '&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitMethodCall(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;MethodCallExpression&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;foreach&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; arg &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;in&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node.Arguments)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Visit(arg);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(node.Method.Name);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;' '&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitConstant(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ConstantExpression&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(node.Value);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;' '&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000" size="2"&gt; node;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: "&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;For example, the following line outputs x -&amp;gt; 1 2 x * + Sin&lt;/p&gt;&lt;pre style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; font-family: ; padding-top: 0px"&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;&lt;font style="font-size: "&gt;Console&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: "&gt;&lt;font color="#000000"&gt;.WriteLine(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionExtensions&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.ToPostfixString(x =&amp;gt; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Math&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Sin(1 + 2 * x)));&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;It works, even though for the sake of example it only supports a very small subset of all expressions. At least in the case of binary operators, it throws a NotSupportedException for operators that are, well, not supported. I really should add a bunch of other methods, for example:&lt;/p&gt;&lt;font style="font-size: 12pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;br&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitConditional(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ConditionalExpression&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;throw&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;NotSupportedException&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;(); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitBlock(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;BlockExpression&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: "&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;throw&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;NotSupportedException&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font color="#000000" size="2"&gt;(); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Anyway, how does it work? The Visit() method calls an internal virtual method on Expression called Accept. Being virtual, this chooses what kind of expression to work on an it calls the appropriate VisitX method in the visitor. This one is virtual as well, and it chooses the correct algorithm, our ToPostfixStringVisitor in this case.&lt;/p&gt;
&lt;p&gt;So we have double dispatch, via a combination of two single dispatch calls.&lt;/p&gt;
&lt;h2&gt;Dynamic dispatch to the rescue&lt;/h2&gt;
&lt;p&gt;As of C# 4, we are not restricted to single dispatch, we now have dynamic dispatch. Let’s see what this example looks like using dynamic:&lt;/p&gt;&lt;pre style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; font-family: ; padding-top: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: " size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: "&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionExtensions&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: "&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; ToPostfixString(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Func&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;&amp;gt;&amp;gt; function)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; resultAccumulator = &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;();&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Visit(function, resultAccumulator);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; resultAccumulator.ToString();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; Visit(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; expression, &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; resultAccumulator)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;dynamic&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; dynamicExpression = expression;&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VisitCore(dynamicExpression, resultAccumulator);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitCore(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;LambdaExpression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; node, &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; resultAccumulator)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;foreach&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; parameter &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;in&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node.Parameters)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Visit(parameter, resultAccumulator);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;"-&amp;gt; "&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Visit(node.Body, resultAccumulator);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitCore(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ParameterExpression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; node, &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; resultAccumulator)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(node.Name);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;' '&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitCore(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;BinaryExpression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; node, &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; resultAccumulator)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Visit(node.Left, resultAccumulator);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Visit(node.Right, resultAccumulator);&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;switch&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; (node.NodeType)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Add:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.AddChecked:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;'+'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Multiply:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.MultiplyChecked:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;'*'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Subtract:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.SubtractChecked:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;'-'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Divide:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;'/'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;case&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ExpressionType&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;.Modulo:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;'%'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;break&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;default&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;throw&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;NotSupportedException&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;' '&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitCore(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;MethodCallExpression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; node, &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; resultAccumulator)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;foreach&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; arg &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;in&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; node.Arguments)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Visit(arg, resultAccumulator);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(node.Method.Name);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;' '&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitCore(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;ConstantExpression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; node, &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; resultAccumulator)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(node.Value);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultAccumulator.Append(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#a31515"&gt;' '&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VisitCore(&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Expression&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; node, &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: "&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; resultAccumulator)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;throw&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;nbsp;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;NotSupportedException&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font color="#000000" size="2"&gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The dynamic dispatch is achieved by the Visit method. To learn more about how this works, see &lt;a title="http://blogs.msdn.com/b/samng/archive/2008/11/06/dynamic-in-c-iii-a-slight-twist.aspx" href="http://blogs.msdn.com/b/samng/archive/2008/11/06/dynamic-in-c-iii-a-slight-twist.aspx"&gt;http://blogs.msdn.com/b/samng/archive/2008/11/06/dynamic-in-c-iii-a-slight-twist.aspx&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So how is this better?&lt;/p&gt;
&lt;p&gt;First of all, this approach works with all classes. The Expression class does have visitor support baked in, but most classes don’t. The dynamic approach also works if the target classes don’t support the visitor pattern. That also means that you don’t have to do anything special with your own classes to enable this technique.&lt;/p&gt;
&lt;p&gt;The dynamic approach is also simpler. I’ve noticed that most people don’t immediately “see” the visitor pattern, but the dynamic approach is easier to understand.&lt;/p&gt;
&lt;p&gt;Visitor implementations typically have methods that return void, and producing a result must be accomplished via fields and properties (the ExpressionVisitor is a notable exception here, it is optimized for rewriting expressions, i.e. calculating a new expression based on an existing one). With dynamic methods, you choose your parameter and return types (the StringBuilder in this example). Not only is that much simpler to code, the entire thing has no state in fields, only in stack local variables. As a result, it’s completely reentrant and thread-safe.&lt;/p&gt;
&lt;p&gt;Note also that the last VisitCore method specifies what to do with expressions that aren’t handled by any of the other methods. Much more convenient than with a Visitor, where you always have to specify a method for each concrete type, unless it just so happens that the behavior you want is the default behavior from the base class.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The dynamic keyword was introduced to facilitate interoperability with dynamic languages and systems, including COM. C# remains primarily a strongly typed language. As such, some people suggested that dynamic has no place in plain C# programs that don’t require such interoperability. However, the above example shows that dynamic dispatch can be very useful in the context of strongly typed C# programs, as an alternative to the Visitor pattern.&lt;/p&gt;</description><pubDate>Tue, 30 Nov 2010 20:35:46 -1300</pubDate><comments>http://blogs.u2u.be/kris/post/2010/11/30/Farewell-Visitor.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Kris Vandermotten</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/kris/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/kris/post.aspx?id=0365afef-9b09-4464-a8b3-46a134e63069</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">319</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/kris/trackback.axd?id=0365afef-9b09-4464-a8b3-46a134e63069</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/kris/post/2010/11/30/Farewell-Visitor.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/kris/syndication.axd?post=0365afef-9b09-4464-a8b3-46a134e63069</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/u2u/post.aspx?id=96bcb04d-0564-446f-8072-85bb3cf4c4aa</guid><link>http://blogs.u2u.be/u2u/post/2010/11/24/Scripting-in-integration-services-data-flow.aspx</link><title>Scripting in integration services data flow</title><description>&lt;p&gt;If you wander how we can program our own conditional splits in SSIS data flow, or implement our own asynchronous transformations, or implement things such as a Year-To-Date, then you forgot to attend my session at the SQL Server Day. Luckily you can catch up with the slides and code samples on my web page at &lt;a title="http://www.u2u.be/res/Nico.aspx#Presentations" href="http://www.u2u.be/res/Nico.aspx#Presentations"&gt;http://www.u2u.be/res/Nico.aspx#Presentations&lt;/a&gt;&amp;#160;&lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.u2u.be/u2u/image.axd?picture=wlEmoticon-smile.png" /&gt;&lt;/p&gt;  &lt;p&gt;Happy coding!&lt;/p&gt;</description><pubDate>Wed, 24 Nov 2010 11:47:53 -1300</pubDate><comments>http://blogs.u2u.be/u2u/post/2010/11/24/Scripting-in-integration-services-data-flow.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Nico Jacobs</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/u2u/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/u2u/post.aspx?id=96bcb04d-0564-446f-8072-85bb3cf4c4aa</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">80</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/u2u/trackback.axd?id=96bcb04d-0564-446f-8072-85bb3cf4c4aa</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/u2u/post/2010/11/24/Scripting-in-integration-services-data-flow.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/u2u/syndication.axd?post=96bcb04d-0564-446f-8072-85bb3cf4c4aa</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/kris/post.aspx?id=ae2773bd-9408-4618-8087-052900de10b5</guid><link>http://blogs.u2u.be/kris/post/2010/10/30/Lambda-Curry-in-F.aspx</link><category>.NET</category><title>Lambda Curry in F#</title><description>&lt;p&gt;&lt;a href="http://community.bartdesmet.net/blogs/bart/" target="_blank"&gt;Bart De Smet&lt;/a&gt; commented on my post about &lt;a href="http://blogs.u2u.net/kris/post/2010/06/28/Lambda-Curry.aspx" target="_blank"&gt;Lambda Curry in C#&lt;/a&gt;, saying (amongst other things) that F# supports &lt;a href="http://en.wikipedia.org/wiki/Currying" target="_blank"&gt;currying&lt;/a&gt; out of the box.&lt;/p&gt;  &lt;p&gt;That’s true, and it’s a nice feature of the language. However, it is a mechanical operation, almost identical to what the following C# extension method does:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 12pt"&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;FunctionalExtensions&lt;/font&gt;&lt;/span&gt;         &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 12pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;{          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Func&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;T2, TResult&amp;gt; Curry&amp;lt;T1, T2, TResult&amp;gt;(&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;this &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#2b91af"&gt;Func&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt;&amp;lt;T1, T2, TResult&amp;gt; func, T1 value)          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; value2 =&amp;gt; func(value, value2);          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The important point to note is that F# does not perform &lt;a href="http://en.wikipedia.org/wiki/Partial_evaluation" target="_blank"&gt;partial evaluation&lt;/a&gt; automatically, which is where in my mind most of the benefit comes from.&lt;/p&gt;  &lt;p&gt;To illustrate, consider the following function definition in F#:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 12pt"&gt;open&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt; System&lt;/font&gt;         &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt;&lt;/font&gt;        &lt;br /&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; compute x y = Math.Sin(float x) * Math.Sin(float y)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This is exactly the same as the following, illustrating the automatic currying:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 12pt"&gt;let&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt; compute x = &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;fun&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; y &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;-&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; Math.Sin(float x) * Math.Sin(float y)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;And when I say “exactly the same”, I do mean just that: they compile to the exact same IL.&lt;/p&gt;  &lt;p&gt;If you want the partial evaluation, and the performance benefit of it, you’ll have to do it manually, also in F#:&lt;/p&gt;  &lt;p&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff" face="Consolas"&gt;&lt;font style="font-size: 12pt"&gt;let&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 12pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; compute' x =          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt; sinx = Math.Sin(float x)          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;fun&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; y &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;-&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; sinx * Math.Sin(float y)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;To illustrate, consider the following program, which is more or less analogous to my previous example:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 12pt"&gt;open&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt; System&lt;/font&gt;         &lt;br /&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;open&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 12pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; System.Diagnostics          &lt;br /&gt;&lt;/font&gt;        &lt;br /&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; compute x y = Math.Sin(float x) * Math.Sin(float y)          &lt;br /&gt;&lt;/font&gt;        &lt;br /&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; compute' x =          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; sinx = Math.Sin(float x)          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;fun&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; y &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;-&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; sinx * Math.Sin(float y)          &lt;br /&gt;&lt;/font&gt;        &lt;br /&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; sum f =          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;mutable&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; sum = 0.0          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; x = -1000 &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;to&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; 1000 &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;do&lt;/font&gt;&lt;/span&gt;         &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; f' = f x          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; y = -1000 &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;to&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; 1000 &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;do&lt;/font&gt;&lt;/span&gt;         &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sum &amp;lt;- sum + f' y          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sum           &lt;br /&gt;&lt;/font&gt;        &lt;br /&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; measureTime f =          &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; sw = Stopwatch.StartNew()          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#0000ff"&gt;let&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; _ = sum f          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sw.ElapsedMilliseconds           &lt;br /&gt;          &lt;br /&gt;printfn &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#800000"&gt;&amp;quot;%d&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt; (measureTime compute)          &lt;br /&gt;printfn &lt;/font&gt;&lt;span style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; color: ; padding-top: 0px"&gt;&lt;font color="#800000"&gt;&amp;quot;%d&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (measureTime compute')&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;On the machine I’m testing this, it prints 329 milliseconds for the compute function, and 137 for the compute’ function.&lt;/p&gt;  &lt;p&gt;To be honest, this should not come as a surprise. Even if F# wanted to perform a partial evaluation, how could it? It does not know that Math.Sin is a &lt;a href="http://en.wikipedia.org/wiki/Pure_function" target="_blank"&gt;pure function&lt;/a&gt;. So it has no choice but to play safe. It does what the developer tells it to do. So if you want partial evaluation, do it yourself, explicitly, no matter what language you’re using.&lt;/p&gt;</description><pubDate>Sat, 30 Oct 2010 03:40:18 -1300</pubDate><comments>http://blogs.u2u.be/kris/post/2010/10/30/Lambda-Curry-in-F.aspx#comment</comments><dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/">Kris Vandermotten</dc:publisher><pingback:server xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/kris/pingback.axd</pingback:server><pingback:target xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/">http://blogs.u2u.be/kris/post.aspx?id=ae2773bd-9408-4618-8087-052900de10b5</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">222</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/kris/trackback.axd?id=ae2773bd-9408-4618-8087-052900de10b5</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/kris/post/2010/10/30/Lambda-Curry-in-F.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/kris/syndication.axd?post=ae2773bd-9408-4618-8087-052900de10b5</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/kris/post.aspx?id=08608f9b-06a9-4e1c-b335-e01c388bb4e3</guid><link>http://blogs.u2u.be/kris/post/2010/09/28/Safe-disposal-of-WCF-proxies.aspx</link><category>WCF</category><title>Safe disposal of WCF proxies</title><description>&lt;p&gt;The issue has been known for a long time: you cannot safely dispose a WCF proxy that inherits from &lt;a href="http://msdn.microsoft.com/en-us/library/ms576141.aspx" target="_blank"&gt;ClientBase&amp;lt;T&amp;gt;&lt;/a&gt; with a using statement, because the dispose method may throw.&amp;#160; For more information, see &lt;a title="http://www.google.com/search?q=wcf+proxy+dispose" href="http://www.google.com/search?q=wcf+proxy+dispose"&gt;http://www.google.com/search?q=wcf+proxy+dispose&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;However, I’ve always found most solutions out there to be too complex, too cumbersome, or both. Some of them even seek to replace the Visual Studio (or svcutil.exe) generated proxy by handwritten code, in which case you loose the convenience of the “Add Service Reference” dialog and the automatic configuration file generation. I wanted a simple but effective solution that does not replace the Visual Studio code generation, and is easy to use at the same time.&lt;/p&gt;  &lt;p&gt;I came up with a simple extension method, that you use as follows:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;proxy = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SomeServiceClient&lt;/span&gt;();
&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;(proxy.SafeDisposer())
{
    &lt;span style="color: green"&gt;// use the proxy here
&lt;/span&gt;}&lt;/pre&gt;

&lt;p&gt;Here’s the code:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;namespace &lt;/span&gt;U2UConsult.ServiceModel
{
    &lt;span style="color: blue"&gt;using &lt;/span&gt;System;
    &lt;span style="color: blue"&gt;using &lt;/span&gt;System.Diagnostics;
    &lt;span style="color: blue"&gt;using &lt;/span&gt;System.ServiceModel;

    &lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ClientBaseExtensions
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;private static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TraceSource &lt;/span&gt;traceSource = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TraceSource&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;U2UConsult.ServiceModel&amp;quot;&lt;/span&gt;);

        &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDisposable &lt;/span&gt;SafeDisposer&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;this &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ClientBase&lt;/span&gt;&amp;lt;T&amp;gt; proxy) &lt;span style="color: blue"&gt;where &lt;/span&gt;T : &lt;span style="color: blue"&gt;class
        &lt;/span&gt;{
            &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SafeDisposerProxy&lt;/span&gt;&amp;lt;T&amp;gt;(proxy);
        }

        &lt;span style="color: blue"&gt;private sealed class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SafeDisposerProxy&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color: #2b91af"&gt;IDisposable &lt;/span&gt;&lt;span style="color: blue"&gt;where &lt;/span&gt;T : &lt;span style="color: blue"&gt;class
        &lt;/span&gt;{
            &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ClientBase&lt;/span&gt;&amp;lt;T&amp;gt; proxy;

            &lt;span style="color: blue"&gt;public &lt;/span&gt;SafeDisposerProxy(&lt;span style="color: #2b91af"&gt;ClientBase&lt;/span&gt;&amp;lt;T&amp;gt; proxy)
            {
                &lt;span style="color: blue"&gt;this&lt;/span&gt;.proxy = proxy;
            }

            &lt;span style="color: blue"&gt;public void &lt;/span&gt;Dispose()
            {
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;.proxy != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                {
                    &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;.proxy.State == &lt;span style="color: #2b91af"&gt;CommunicationState&lt;/span&gt;.Opened)
                    {
                        &lt;span style="color: blue"&gt;try
                        &lt;/span&gt;{
                            &lt;span style="color: blue"&gt;this&lt;/span&gt;.proxy.Close();
                        }
                        &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Exception &lt;/span&gt;ex)
                        {
                            &lt;span style
