<?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=fb54aa1f-935e-460a-b2d5-737882dfde43</guid><link>http://blogs.u2u.be/diederik/post/2013/05/12/Using-the-Documents-Library-as-a-database-in-Windows-8-Store-apps.aspx</link><title>Using the Documents Library as a database in Windows 8 Store apps</title><description>&lt;p&gt;Many Windows 8 Store apps require some amount of structured storage on the client. But in WinRT, local and roaming storage is limited in size, and a client-side relational database does not come out of the box yet. This article describes how to use a folder in the user&amp;rsquo;s Documents library to store serialized business objects. This gives the app an almost unlimited amount of client-side structured storage. I created a small but representative sample project (code is attached at the end of the article) to illustrate this. Its purpose is to maintain a list of &lt;a href="http://en.wikipedia.org/wiki/Trappist_beer" target="_blank"&gt;Trappist beers&lt;/a&gt;. Here&amp;rsquo;s how the app looks like:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f5%2fscreenshot_05122013_192629.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;By default, a Windows 8 Store app runs in the smallest possible sandbox: it does not have the right to directly access the user&amp;rsquo;s Documents. If you need this capability, you have to register it through the app manifest:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f5%2fmanifest_1.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Even with the capability declared, the app&amp;rsquo;s rights on the documents folder are limited to the registered file types. More on that later.&lt;br /&gt;The sample app uses a specific folder to store its Trappist beers in. Store apps don&amp;rsquo;t not come with an installer &amp;agrave; la .msi, so the app should create the working folder at run time:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;private static string AppFolderName = "Trappist Beers";

public static async Task&amp;lt;StorageFolder&amp;gt; AppFolder()
{
    return await KnownFolders.DocumentsLibrary.GetFolderAsync(AppFolderName);
}

public static async Task EnsureFolderExists()
{
    StorageFolder folder = null;

    try
    {
        folder = await KnownFolders.DocumentsLibrary.GetFolderAsync(AppFolderName);
    }
    catch (Exception)
    {
        // Folder does not exist, but we cannot await in a catch block, so we can not create it here.
    }

    if (folder == null)
    {
        folder = await KnownFolders.DocumentsLibrary.CreateFolderAsync(AppFolderName, CreationCollisionOption.OpenIfExists);
    }
}&lt;/pre&gt;
&lt;pre class="brush: c-sharp;"&gt;protected async override void OnLaunched(LaunchActivatedEventArgs args)
{
    await AppModel.EnsureFolderExists();

    // Rest of the app initialization
    // ...
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;We now have a container to store the objects, let&amp;rsquo;s generate some content. The WinRT framework comes with a whole range of serializers that can serialize business objects to a string that can be persisted in a file and deserialize it back to an object when needed. You can choose between &lt;a href="http://www.irisclasson.com/2012/07/11/example-metro-app-winrt-serializing-and-deseralizing-objects-using-xmlserializer-to-storagefile-and-localfolder-using-generics-and-asyncawait-threading/" target="_blank"&gt;plain XML&lt;/a&gt; as explained by &lt;a href="https://twitter.com/IrisClasson" target="_blank"&gt;Iris Classon&lt;/a&gt;, &lt;a href="http://www.saramgsilva.com/index.php/2012/using-datacontractserializer-or-xmlserializer-for-serialization-windows-8-winrt/" target="_blank"&gt;WCF DataContract XML&lt;/a&gt; as explained by &lt;a href="https://twitter.com/SaramgSilva" target="_blank"&gt;Sara Silva&lt;/a&gt;, and &amp;nbsp;&lt;a href="http://www.bartlannoeye.be/blog/consuming-json-data-in-winrt" target="_blank"&gt;JSON&lt;/a&gt; as explained by &lt;a href="https://twitter.com/bartlannoeye" target="_blank"&gt;Bart Lannoeye&lt;/a&gt;. I&amp;rsquo;m using the XmlSerializer in the sample app, it focuses on the public properties of the class. Here&amp;rsquo;s how to use this one to serialize and deserialize a Trappist:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;// Serialize
XmlSerializer serializer = new XmlSerializer(typeof(Trappist));
using (StringWriter writer = new StringWriter())
{
    serializer.Serialize(writer, trappist);
    String xmlString = writer.ToString();
}

// Deserialize
string xml = await FileIO.ReadTextAsync(file);
XmlSerializer serializer = new XmlSerializer(typeof(Trappist));
trappist = serializer.Deserialize(new StringReader(xml)) as Trappist;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;We have a folder now, and we know how to serialize and deserialize its content. Let&amp;rsquo;s see how our app can access the folder. There are actually two ways to achieve this:&lt;br /&gt;&amp;bull;&amp;nbsp;Through the classic File and Folder API. This requires asynchronous calls.&lt;br /&gt;&amp;bull;&amp;nbsp;Through the MostRecentlyUsed API. This requires less programmatic maintenance, and uses synchronous calls.&lt;/p&gt;
&lt;p&gt;For the sample app, I&amp;rsquo;m assuming that the user will work most of the times with one of the 25 most recent objects that he manipulated. In the case of Trappist beers, that is a fair assumption: there are only 8 authentic Trappist breweries in the world, and together they have not even created 25 Trappist beers. By the way: they&amp;rsquo;re excellent, I tasted all of them (except the two from Engelszell which are hard to get outside Austria). Anyway, a scenario in which a user mainly works with his most recent business objects, is common.&lt;/p&gt;
&lt;p&gt;Each Windows 8 Store app can maintain its own Most Recently Used file list. When registering a file in the MRU list, you are allowed to store some metadata with it. The file itself is indexed through a token (not unsurprisingly based on&amp;nbsp;a GUID). The sample app stores the name of the Trappist beer in the metadata. That name is also used as the physical file name. So I&amp;rsquo;m actually treating the name of the beer as primary key. Here&amp;rsquo;s how to add a file to the MRU list:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;StorageApplicationPermissions.MostRecentlyUsedList.Add(file, trappist.Name);&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;We execute this registration when saving a new file, and when opening an existing file. Here&amp;rsquo;s how to fetch the list of most recently used Trappist names, the most recently accessed file always comes first:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public static ObservableCollection&amp;lt;string&amp;gt; MostRecentTrappists
{
    get
    {
        var result = new ObservableCollection&amp;lt;string&amp;gt;();

        foreach (var item in StorageApplicationPermissions.MostRecentlyUsedList.Entries)
        {
            result.Add(item.Metadata);
        }

        return result;
    }
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Observe that the call is synchronous. We&amp;rsquo;re actually not accessing the folder or files themselves.&lt;/p&gt;
&lt;p&gt;Of course, the user may add, delete, move, and rename these files with other apps, or directly with the File Explorer. After all: it is *his* Documents folder. So the app&amp;rsquo;s GUI should also expose that real situation from disk. Here&amp;rsquo;s how to get the alphabetical list of Trappist names in the app&amp;rsquo;s working folder:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public async static Task&amp;lt;ObservableCollection&amp;lt;string&amp;gt;&amp;gt; FolderTrappists()
{
    var result = new ObservableCollection&amp;lt;string&amp;gt;();

    var folder = await AppFolder();
    var files = await folder.GetFilesAsync();
    var names = from file in files
                where file.FileType == AppFileExtension
                orderby file.DisplayName
                select file.DisplayName;

    foreach (var name in names)
    {
        result.Add(name);
    }

    return result;
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;This is an asynchronous method because in WinRT we cannot access the file system synchronously.&lt;/p&gt;
&lt;p&gt;I use a toggle switch to change between &amp;lsquo;MRU&amp;rsquo; and &amp;lsquo;Folder&amp;rsquo; mode. In a production app the control would end up in the app bar or the settings panel:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f5%2fscreenshot_05122013_165749.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f5%2fscreenshot_05122013_165759.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;To save memory, the app only displays the list of Trappist names, not the list of full business objects. When saving, opening or deleting a Trappist, we need to make the link with the corresponding physical file. Therefor we first need to fetch the identification token from the MRU list. Here&amp;rsquo;s how to do this:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;private static string GetMruToken(string trappistName)
{
    var token = (from e in StorageApplicationPermissions.MostRecentlyUsedList.Entries
                    where e.Metadata == trappistName
                    select e.Token).FirstOrDefault();
    return token;
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Using the token, we can get the file, like this:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;var token = GetMruToken(trappistName);

if (!String.IsNullOrEmpty(token))
{
    try
    {
        // Get file through MRU list
        file = await StorageApplicationPermissions.MostRecentlyUsedList.GetFileAsync(token);
        return file;
    }
    catch (Exception)
    {
        // File was probably deleted, so continue with app folder.
    }
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;If something went wrong (e.g. the Trappist is not in the MRU anymore), then you should go for the physical file directly:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;try
{
    var folder = await AppFolder();
    file = await folder.GetFileAsync(trappistName + AppFileExtension);
}
catch (Exception)
{
    // Ignore
}

return file;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Now you can save, open, and delete the corresponding file for a Trappist name in the list.&lt;/p&gt;
&lt;p&gt;So far for the Model and the Data Access Layer, let&amp;rsquo;s now take a look to the ViewModel. It has the classic CRUD commands to open, create, rename, and delete a Trappist. I&amp;rsquo;m using the RelayCommand from &lt;a href="http://mvvmlight.codeplex.com/" target="_blank"&gt;MVVM Light&lt;/a&gt; for this. To get the name for a newly created or renamed Trappist, I&amp;rsquo;m using an InputDialog control from the &lt;a href="http://winrtxamltoolkit.codeplex.com/" target="_blank"&gt;WinRTXamlToolkit&lt;/a&gt;. Here&amp;rsquo;s how to work with it:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;var dialog = new InputDialog();
var result = await dialog.ShowAsync(
    "Add new Trappist",
    "Please enter the name:",
    "Create",
    "Cancel");

if (result == "Create" &amp;amp;&amp;amp; !String.IsNullOrEmpty(dialog.InputText))
{
    // ...
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;This is how it looks like by default:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f5%2fscreenshot_05122013_165835.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Since some of the interactions require asynchronous calls under the hood, I decorated the ViewModel with some internal events and local event handlers to bridge the period between setting a property and notifying its change:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;private event EventHandler TrappistNamesChanged;

public MainPageViewModel()
{
    // Initialization
    // ...
    this.TrappistNamesChanged += this.MainPageViewModel_TrappistNamesChanged;
}

public ObservableCollection&amp;lt;string&amp;gt; TrappistNames
{
    get
    {
        return this.trappistNames;
    }
}

private async void MainPageViewModel_TrappistNamesChanged(object sender, EventArgs e)
{
    if (this.ShowAll)
    {
        this.trappistNames = await AppModel.FolderTrappists();
    }
    else
    {
        this.trappistNames = AppModel.MostRecentTrappists;
    }

    this.OnPropertyChanged("TrappistNames");
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;I&amp;rsquo;m not evangelizing this as a best practice, but it seems to do the trick.&lt;/p&gt;
&lt;p&gt;I already revealed one advantage of using the file system over a local database: the user can easily copy, move, rename, and delete objects through the File Explorer (admitted: that&amp;rsquo;s not always an advantage). Let&amp;rsquo;s take this one step further. Through the app manifest you can register&amp;nbsp;your app&amp;nbsp;as the default app to open files with the corresponding extension(s), and at the same time define&amp;nbsp;a default icon for the files. The declaration of these extensions is mandatory, since it defines the files to which the app has access:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f5%2fmanifest_2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;When the user is now browsing through his Documents, he&amp;rsquo;ll easily recognize the files:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f5%2fdocuments.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;You can let the app open on the selected business object when the user double clicks (or taps) the file. Here&amp;rsquo;s the code to do that (in app.xaml.cs):&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;protected override void OnFileActivated(FileActivatedEventArgs args)
{
    if (args.Files.Count &amp;gt; 0)
    {
        var file = args.Files[0];

        Frame rootFrame = Window.Current.Content as Frame;

        if (rootFrame == null)
        {
            rootFrame = new Frame();
            Window.Current.Content = rootFrame;
        }

        // MRU list
        var name = Path.GetFileNameWithoutExtension(file.Name);
        StorageApplicationPermissions.MostRecentlyUsedList.Add(file, name);

        if (!rootFrame.Navigate(typeof(MainPage), name))
        {
            throw new Exception("Failed to create initial page");
        }

        Window.Current.Activate();
    }
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;That&amp;rsquo;s it, I tried to structure the code to make it as reusable as possible. I have at least three apps waiting for this pattern.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the code: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2013%2f5%2fU2UConsult.Win8.documentLibrarySample.zip"&gt;U2UConsult.Win8.documentLibrarySample.zip (643.43 kb)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;a href="https://twitter.com/diederikkrols" target="_blank"&gt;Diederik&lt;/a&gt;&lt;/p&gt;</description><pubDate>Sun, 12 May 2013 19:08:00 -1200</pubDate><comments>http://blogs.u2u.be/diederik/post/2013/05/12/Using-the-Documents-Library-as-a-database-in-Windows-8-Store-apps.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=fb54aa1f-935e-460a-b2d5-737882dfde43</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/diederik/trackback.axd?id=fb54aa1f-935e-460a-b2d5-737882dfde43</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2013/05/12/Using-the-Documents-Library-as-a-database-in-Windows-8-Store-apps.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=fb54aa1f-935e-460a-b2d5-737882dfde43</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=5d0053b9-8dd3-40e1-bc19-5eebdf8d22af</guid><link>http://blogs.u2u.be/diederik/post/2013/04/21/A-convention-based-data-template-selector-for-Windows-8-XAML-Store-apps.aspx</link><title>A convention-based data template selector for Windows 8 XAML Store apps</title><description>&lt;p&gt;This article describes how you can use naming conventions to hook a XAML Data Template to a ViewModel or a Model in a Windows 8 Store app. The last couple of years, convention-based coding became more and more popular in the .NET world. The MVC framework was one of the first managed environments where the constituents of an application (in this case Models, Views, and Controllers) were automatically linked to each other based on their name, instead of letting a developer create references and interfaces. The latest version of the Managed Extensibility Framework &amp;ndash;a.k.a. MEF- also comes with a &lt;a href="http://msdn.microsoft.com/en-us/library/hh925579.aspx" target="_blank"&gt;convention-based programming model&lt;/a&gt;: the &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.registration.registrationbuilder.aspx" target="_blank"&gt;RegistrationBuilder&lt;/a&gt;&amp;nbsp;and &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.registration.partbuilder.aspx" target="_blank"&gt;PartBuilder&lt;/a&gt; classes provide an alternative for MEF attributes: they let you specify the rules to infer Parts, Imports, and Exports from the names of your classes and properties. Also in the XAML world, convention-based coding is not new. Most of the popular MVVM frameworks rely heavily on naming conventions to link components together. &lt;a href="http://devlicio.us/blogs/rob_eisenberg/archive/2010/12/16/caliburn-micro-soup-to-nuts-part-7-all-about-conventions.aspx" target="_blank"&gt;Caliburn.micro&lt;/a&gt; has several classes to lookup the View for a ViewModel (and vice-versa) and to generate data bindings solely based on class and property names: ViewLocator, ViewModelLocator, and ViewModelBinder.&lt;/p&gt;
&lt;p&gt;This article presents a way to link a XAML DataTemplate in a View to its corresponding Model or ViewModel data context&amp;nbsp; class. Here are some screenshots of the attached sample project: it shows a FlipView control (with an associated &lt;a href="http://blogs.u2u.be/diederik/post/2012/08/24/A-CXAML-FlipView-Context-Indicator-for-Windows-8.aspx" target="_blank"&gt;FlipViewIndicator&lt;/a&gt;) that has a different type of Model for each item, so each page should look differently:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f4%2fdatatemplate_1.png" alt="" /&gt;&lt;br /&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f4%2fdatatemplate_2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;In ye olde XAML platforms, you could specify the default data template for a class with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype.aspx" target="_blank"&gt;DataType&lt;/a&gt; property. In Windows 8 Store app XAML, that property is not supported anymore. So when you want an ItemsControl to display a list of objects of different types, you have to use a &lt;a href="http://msdn.microsoft.com/library/windows/apps/windows.ui.xaml.controls.datatemplateselector" target="_blank"&gt;DataTemplateSelector&lt;/a&gt;. I already explained the mechanisms in &lt;a href="http://blogs.u2u.be/diederik/post/2013/01/08/Using-Dynamic-XAML-in-Windows-8-Store-Apps.aspx" target="_blank"&gt;this blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The following class defines a data template selector that looks up a data template in the app&amp;rsquo;s resources, based on the name of the data context class. It just adds &amp;ldquo;Template&amp;rdquo; to the name of the data context class, so if you want to display an instance of &amp;ldquo;Person&amp;rdquo;, you just have to provide a data template with as x:Key &amp;ldquo;PersonTemplate&amp;rdquo;:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;/// &amp;lt;summary&amp;gt;
/// Convention-based DataTemplate Selector.
/// &amp;lt;/summary&amp;gt;
public sealed class DynamicDataTemplateSelector : DataTemplateSelector
{
    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        DataTemplate result = null;
        string typeName = item.GetType().Name;

        try
        {
            result = App.Current.Resources[typeName + "Template"] as DataTemplate;
        }
        catch (Exception)
        {
            Debug.Assert(false, string.Format("No data template found to display '{0}' instances.", typeName));
        }

        return result;
    }
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;The try-catch block is necessary because the resource manager throws an exception when a resource is not found. &lt;br /&gt;Here&amp;rsquo;s how to apply the selector in an ItemsControl. It is declared as a resource:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Page.Resources&amp;gt;
    &amp;lt;templates:DynamicDataTemplateSelector x:Key="DynamicDataTemplateSelector" /&amp;gt;
&amp;lt;/Page.Resources&amp;gt;&lt;/pre&gt;
&lt;p&gt;And then applied to the FlipView:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;FlipView x:Name="TheFlipView"
            ItemsSource="{Binding Models}"
            ItemTemplateSelector="{StaticResource DynamicDataTemplateSelector}" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;Here&amp;nbsp;are some of the&amp;nbsp;data templates from the resource dictionary:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;!-- Biography --&amp;gt;
&amp;lt;DataTemplate x:Key="BiographyTemplate"&amp;gt;
    &amp;lt;Grid&amp;gt;
        &amp;lt;Grid.RowDefinitions&amp;gt;
            &amp;lt;RowDefinition Height="auto" /&amp;gt;
            &amp;lt;RowDefinition Height="*" /&amp;gt;
        &amp;lt;/Grid.RowDefinitions&amp;gt;
        &amp;lt;Grid.ColumnDefinitions&amp;gt;
            &amp;lt;ColumnDefinition Width="*" /&amp;gt;
        &amp;lt;/Grid.ColumnDefinitions&amp;gt;
        &amp;lt;TextBlock Text="{Binding Name}"
                    Foreground="Yellow"
                    FontSize="28"
                    HorizontalAlignment="Center"
                    Margin="0 48 0 0" /&amp;gt;
        &amp;lt;TextBlock Text="{Binding  Description}"
                    Grid.Row="1"
                    FontSize="20"
                    TextWrapping="Wrap"
                    Margin="0 48 0 0" /&amp;gt;
    &amp;lt;/Grid&amp;gt;
&amp;lt;/DataTemplate&amp;gt;

&amp;lt;!-- Powers And Abilities --&amp;gt;
&amp;lt;DataTemplate x:Key="PowersAndAbilitiesTemplate"&amp;gt;
    &amp;lt;Grid&amp;gt;
        &amp;lt;Grid.RowDefinitions&amp;gt;
            &amp;lt;RowDefinition Height="auto" /&amp;gt;
            &amp;lt;RowDefinition Height="auto" /&amp;gt;
            &amp;lt;RowDefinition Height="auto" /&amp;gt;
            &amp;lt;RowDefinition Height="*" /&amp;gt;
        &amp;lt;/Grid.RowDefinitions&amp;gt;
        &amp;lt;Grid.ColumnDefinitions&amp;gt;
            &amp;lt;ColumnDefinition Width="*" /&amp;gt;
        &amp;lt;/Grid.ColumnDefinitions&amp;gt;
        &amp;lt;TextBlock Text="{Binding Name}"
                    Foreground="Yellow"
                    FontSize="28"
                    HorizontalAlignment="Center"
                    Margin="0 48 0 0" /&amp;gt;
        &amp;lt;ItemsControl ItemsSource="{Binding Powers}"
                        Grid.Row="1"
                        Margin="0 48 0 0"
                        HorizontalAlignment="Center"&amp;gt;
            &amp;lt;ItemsControl.ItemTemplate&amp;gt;
                &amp;lt;DataTemplate&amp;gt;
                    &amp;lt;TextBlock FontSize="20"&amp;gt;
                        &amp;lt;Run Text="● " /&amp;gt;
                        &amp;lt;Run Text="{Binding}" /&amp;gt;
                    &amp;lt;/TextBlock&amp;gt;
                &amp;lt;/DataTemplate&amp;gt;
            &amp;lt;/ItemsControl.ItemTemplate&amp;gt;
        &amp;lt;/ItemsControl&amp;gt;
        &amp;lt;TextBlock Text="Weaknesses"
                    Grid.Row="2"
                    Foreground="Yellow"
                    FontSize="28"
                    HorizontalAlignment="Center"
                    Margin="0 48 0 0" /&amp;gt;
        &amp;lt;ItemsControl ItemsSource="{Binding Weaknesses}"
                        Grid.Row="3"
                        Margin="0 48 0 0"
                        HorizontalAlignment="Center"&amp;gt;
            &amp;lt;ItemsControl.ItemTemplate&amp;gt;
                &amp;lt;DataTemplate&amp;gt;
                    &amp;lt;TextBlock FontSize="20"&amp;gt;
                        &amp;lt;Run Text="● " /&amp;gt;
                        &amp;lt;Run Text="{Binding}" /&amp;gt;
                    &amp;lt;/TextBlock&amp;gt;
                &amp;lt;/DataTemplate&amp;gt;
            &amp;lt;/ItemsControl.ItemTemplate&amp;gt;
        &amp;lt;/ItemsControl&amp;gt;
    &amp;lt;/Grid&amp;gt;
&amp;lt;/DataTemplate&amp;gt;&lt;/pre&gt;
&lt;p&gt;When a data template is not found in the resources, the selector returns a &lt;em&gt;Null&lt;/em&gt; value. The data binding engine then applies a default template, with the fully qualified type name in a text box. Here&amp;rsquo;s how this looks like:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f4%2fdatatemplate_3.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;During debugging, the Assert statement writes an exception to the output window when the template is not found, like this:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f4%2ftemplate_assert.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s all there is. Actually, the title of this article was longer than&amp;nbsp;its source code. Here is the sample app: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2013%2f4%2fU2UConsult.Win8.DataTemplating.zip"&gt;U2UConsult.Win8.DataTemplating.zip (692.39 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;br /&gt;&lt;a href="http://www.twitter.com/@diederikkrols" target="_blank"&gt;Diederik&lt;/a&gt;&lt;/p&gt;</description><pubDate>Sun, 21 Apr 2013 18:54:00 -1200</pubDate><comments>http://blogs.u2u.be/diederik/post/2013/04/21/A-convention-based-data-template-selector-for-Windows-8-XAML-Store-apps.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=5d0053b9-8dd3-40e1-bc19-5eebdf8d22af</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=5d0053b9-8dd3-40e1-bc19-5eebdf8d22af</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2013/04/21/A-convention-based-data-template-selector-for-Windows-8-XAML-Store-apps.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=5d0053b9-8dd3-40e1-bc19-5eebdf8d22af</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=3ec9870c-06dd-4f42-bce4-4aaeb2094698</guid><link>http://blogs.u2u.be/diederik/post/2013/03/28/Creating-touch-based-rotation-in-Windows-8-XAML-Store-apps.aspx</link><category>WinRT</category><title>Creating touch-based rotation in Windows 8 XAML Store apps</title><description>&lt;p&gt;This article illustrates two ways of using touch or mouse input to rotate a UI element in a XAML-based Windows 8 Store app. I&amp;rsquo;m sharing this code because I believe that the corresponding official MSDN sample is too complex. Don't get me wrong: the &lt;a href="http://code.msdn.microsoft.com/windowsapps/Input-Windows-8-gestures-62c6689b" target="_blank"&gt;Windows 8 gestures sample&lt;/a&gt; looks nice and&amp;nbsp;gives a&amp;nbsp;complete overview of all gestures and their mouse equivalent. But it uses three entire classes to do something that you can literally do in three lines of code. In this article, I&amp;rsquo;ll describe the&amp;nbsp;guidelines-compliant way of rotating an element using a two-finger gesture, but I also provide a one-finger alternative. Since not everyone has a touch screen (yet), I also give you two ways for using the mouse to rotate an element. As usual, the article comes with a downloadable sample app. It just displays two round&amp;nbsp;rotatable images.&amp;nbsp;Here&amp;rsquo;s a screenshot of it:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fRotationSample.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Multi Touch Rotation&lt;/h2&gt;
&lt;p&gt;A UI Element&amp;nbsp;can&amp;nbsp;register for rotation by setting its &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.uielement.manipulationmode.aspx" target="_blank"&gt;ManipulationMode&lt;/a&gt; to &lt;em&gt;Rotate&lt;/em&gt;, optionally adding inertia. Multiple manipulation modes can be set in XAML through a comma-separated list. Just ignore Intellisense and don&amp;rsquo;t use the property editor:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Image ...
       ManipulationMode="Rotate,RotateInertia"  /&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Setting the manipulation mode causes the corresponding manipulation events (&lt;em&gt;starting&lt;/em&gt;, &lt;em&gt;inertiaStarting&lt;/em&gt;, &lt;em&gt;started&lt;/em&gt;, &lt;em&gt;delta&lt;/em&gt;, and &lt;em&gt;completed&lt;/em&gt;) to fire. You find the complete list of events and event argument classes in the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh465387.aspx#using_manipulation_events" target="_blank"&gt;Touch Input Quickstart&lt;/a&gt;. &lt;br /&gt;You still have to code what should happen in your app. Typically that boils down to configuring the element&amp;rsquo;s &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.uielement.rendertransform.aspx" target="_blank"&gt;RenderTransform&lt;/a&gt;. To simplify the code in the event handlers, I gave the image a named rotation transformation:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Image x:Name="Left"
        ManipulationMode="Rotate,RotateInertia"
        ManipulationDelta="Left_ManipulationDelta"&amp;gt;
    &amp;lt;Image.RenderTransform&amp;gt;
        &amp;lt;RotateTransform x:Name="LeftRotateTransform" /&amp;gt;
    &amp;lt;/Image.RenderTransform&amp;gt;
&amp;lt;/Image&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;All you have to do to manually rotate the image, is to subscribe to the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.uielement.manipulationdelta.aspx" target="_blank"&gt;ManipulationDelta&lt;/a&gt; event, and add the delta's rotation to the element&amp;rsquo;s rotation transform:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;// Called when rotate by touch.
private void Left_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
    this.LeftRotateTransform.Angle += e.Delta.Rotation;
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;[Tip: You could use the &lt;em&gt;ManipulationCompleted&lt;/em&gt; event to implement snap points.]&lt;/p&gt;
&lt;p&gt;The pivot point of the rotation is set to the center of the element.&amp;nbsp;For images you can do this&amp;nbsp;in the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.image.imageopened.aspx" target="_blank"&gt;ImageOpened&lt;/a&gt; event. It&amp;rsquo;s the first event that guarantees that ActualHeight and ActualWidth are set. I must&amp;nbsp;say that&amp;nbsp;every now and then I still get zero values here.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;// Called when the image is ready to be rendered. ActualHeight and ActualWidth are known.
private void Image_Opened(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
    Image img = sender as Image;
    RotateTransform rt = img.RenderTransform as RotateTransform;
    rt.CenterX = img.ActualWidth / 2;
    rt.CenterY = img.ActualHeight / 2;
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;The standard touch-based rotation requires two touch points or more:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2frotate_gesture.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;In&amp;nbsp;Visual Studio's Touch&amp;nbsp;Simulator, you can test it with&amp;nbsp;the &amp;lsquo;Rotation touch mode&amp;rsquo; button. Press it, hover over the UI element on the page, and&amp;nbsp;scroll the mouse wheel:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fRotateButton.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;On a non-touch device, the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh465370.aspx" target="_blank"&gt;guidelines for common user interactions&lt;/a&gt; prescribe that&amp;nbsp;a rotation gesture&amp;nbsp;should be triggered&amp;nbsp;by the mouse wheel, with &lt;em&gt;ctrl&lt;/em&gt; and &lt;em&gt;shift&lt;/em&gt; buttons pressed. So we add an event handler for &lt;em&gt;PointerWheelChanged&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Image x:Name="Left"
        Grid.Row="1"
        Margin="64 36"
        Source="../Assets/Wheel_of_Fortune.png"
        ManipulationMode="Rotate,RotateInertia"
        ManipulationDelta="Left_ManipulationDelta"
        ImageOpened="Image_Opened"
        PointerWheelChanged="Left_PointerWheelChanged"&amp;gt;
    &amp;lt;Image.RenderTransform&amp;gt;
        &amp;lt;RotateTransform x:Name="LeftRotateTransform" /&amp;gt;
    &amp;lt;/Image.RenderTransform&amp;gt;
&amp;lt;/Image&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;In the handler, we check whether the &lt;em&gt;shift&lt;/em&gt; and &lt;em&gt;control&lt;/em&gt; buttons are pressed, and then apply the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.input.pointerpointproperties.mousewheeldelta.aspx" target="_blank"&gt;MouseWheelDelta&lt;/a&gt; to the rotation angle. Look at the weird code to get that mouse wheel delta:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;// Called when rotate by mousewheel.
private void Left_PointerWheelChanged(object sender, PointerRoutedEventArgs e)
{
    bool shift = (e.KeyModifiers &amp;amp; VirtualKeyModifiers.Shift) == VirtualKeyModifiers.Shift;
    bool ctrl = (e.KeyModifiers &amp;amp; VirtualKeyModifiers.Control) == VirtualKeyModifiers.Control;

    if (shift &amp;amp;&amp;amp; ctrl)
    {
        var delta = PointerPoint.GetCurrentPoint(e.Pointer.PointerId).Properties.MouseWheelDelta;
        // With my mouse, delta is a multiple of 30.
        this.LeftRotateTransform.Angle -= delta / 15;
    }
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Use cases&lt;/strong&gt;&lt;br /&gt;In scenarios where inertia is needed (e.g. spinning a wheel) the two finger touch rotation is the right match. That manipulation is also very useful for rotating larger elements, with a high precision. For rotating a small element, I wouldn&amp;rsquo;t recommend this gesture, simply because you don&amp;rsquo;t see what you&amp;rsquo;re doing with two or more&amp;nbsp;fingers on it. &lt;br /&gt;For non-touch environments, I&amp;rsquo;m not sure that the shift-control-mousewheel combination will become popular.&lt;/p&gt;
&lt;h2&gt;Single Touch Rotation&lt;/h2&gt;
&lt;p&gt;As an alternative, you can allow a user to put a finger on the element and start dragging. You just need to transform the translation into a rotation with a pinch of trigonometry. It&amp;rsquo;s easy to build, intuitive, and the code immediately works for the mouse too: click and start dragging. Just enable the &lt;em&gt;TranslateX&lt;/em&gt; and &lt;em&gt;TranslateY&lt;/em&gt; manipulation modes (and optionally add inertia), register a handler for &lt;em&gt;ManipulationDelta&lt;/em&gt;, and initialize the RenderTransform:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Image ...
       ManipulationMode="TranslateX,TranslateY,TranslateInertia"
       ManipulationDelta="Right_ManipulationDelta"
       ImageOpened="Image_Opened"&amp;gt;
    &amp;lt;Image.RenderTransform&amp;gt;
        &amp;lt;RotateTransform x:Name="RightRotateTransform" /&amp;gt;
    &amp;lt;/Image.RenderTransform&amp;gt;
&amp;lt;/Image&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;In the ManipulationDelta handler, you transform the translation into&amp;nbsp;a rotation by calculating the angle of the delta. Add this angle&amp;nbsp;to the angle of the element&amp;rsquo;s RotateTransform. I took&amp;nbsp;some time to make a small drawing to illustrate this. Alpha is the angle to be calculated:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fTrigonometry.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;From a performance standpoint, I assume that the &lt;a href="http://en.wikipedia.org/wiki/Law_of_cosines" target="_blank"&gt;law of cosines&lt;/a&gt; would be the most appropriate solution here. But I have the right to be lazy sometimes, so I went for the &amp;ldquo;least C#&amp;rdquo; option: calculate Alpha as the difference of Alpha1 and Alpha2 on the image. Here&amp;rsquo;s that code:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;// Called by touch and mouse.
private void Right_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
    // Alternatively, use Triangle Cosines Law.
    // It uses just one trigonometric function (Acos), but you first need to calculate the lengths of all sides.

    var x = this.RightRotateTransform.CenterX - e.Position.X;
    var y = this.RightRotateTransform.CenterY - e.Position.Y;
            
    double a1 = Math.Atan(y / x);
    double a2 = Math.Atan((e.Delta.Translation.Y - y) / (x - e.Delta.Translation.X));

    this.RightRotateTransform.Angle += a1 - a2;
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Use cases&lt;/strong&gt;&lt;br /&gt;I would definitely recommend this type of rotation in non-touch scenarios: it reacts naturally and it does not require the shift and control buttons (or the user&amp;rsquo;s recollection to press these). In a touch environment, it does not occlude the element you're manipulating. There&amp;rsquo;s a lag in reaction time, and it&amp;rsquo;s easy to outpace the algorithm by moving too fast. So I would not use single point rotation to e.g. spin a wheel. The roulette wheel in the sample app&amp;nbsp;is a bad&amp;nbsp;choice - it just looked nice next to that wheel of fortune. &lt;img style="border: 0px;" title="Smile" src="http://blogs.u2u.be/diederik/editors/tiny_mce_3_4_3_1/plugins/emotions/img/smiley-smile.gif" alt="Smile" /&gt;&lt;/p&gt;
&lt;h2&gt;Code&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the full code: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2013%2f3%2fU2UConsult.RotationManipulation.Sample.zip"&gt;U2UConsult.RotationManipulation.Sample.zip (587.17 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;br /&gt;&lt;a href="http://www.twitter.com/diederikkrols" target="_blank"&gt;Diederik&lt;/a&gt;&lt;/p&gt;</description><pubDate>Thu, 28 Mar 2013 00:22:00 -1200</pubDate><comments>http://blogs.u2u.be/diederik/post/2013/03/28/Creating-touch-based-rotation-in-Windows-8-XAML-Store-apps.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=3ec9870c-06dd-4f42-bce4-4aaeb2094698</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=3ec9870c-06dd-4f42-bce4-4aaeb2094698</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2013/03/28/Creating-touch-based-rotation-in-Windows-8-XAML-Store-apps.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=3ec9870c-06dd-4f42-bce4-4aaeb2094698</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=0994a364-755d-4594-80f3-32396a638942</guid><link>http://blogs.u2u.be/diederik/post/2013/03/18/The-Slider%E2%80%99s-Guide-to-the-MVVM-Galaxy.aspx</link><title>The Slider’s Guide to the MVVM Galaxy</title><description>&lt;p&gt;This article describes two behaviors of the native XAML &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.slider.aspx" target="_blank"&gt;Slider&lt;/a&gt; control that reduce the joy of using it in MVVM Windows 8 Store apps. We all agree that XAML is one of the nicest technologies to develop Windows 8 Store apps, right? We all agree that you should use MVVM to build XAML apps, right? No, we don&amp;rsquo;t: unfortunately some of the native controls strongly disagree with us. The most well-known example of an MVVM-unfriendly XAML control is the radio button. A radio button is cleared by selecting another radio button in the same group. That&amp;rsquo;s OK, but at that moment it also clears its binding. It breaks the link to the viewmodels to which it was bound. This classic MVVM problem is generally solved by assigning a unique &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.radiobutton.groupname.aspx" target="_blank"&gt;GroupName&lt;/a&gt; to each radio button, and deal with the mutual exclusiveness programmatically on the viewmodels&amp;rsquo; side. Ouch!&lt;/p&gt;
&lt;p&gt;Recently I observed that the native slider control has a similar issue. Even worse: two issues. Ouch! Ouch!&lt;/p&gt;
&lt;p&gt;Seeing is believing, so I created a small demo app to illustrate these issues. The app shows two sliders that display temperature values from a viewmodel. The user may&amp;nbsp;switch between Celsius and Fahrenheit scales using a data bound toggle switch. [My shoulder devil tried to&amp;nbsp;convince me to use radio buttons instead of a toggle switch. It was a close fight, but the angel won.] &lt;br /&gt;Here&amp;rsquo;s a screenshot of the app:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fslider_demo.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Here are the two issues, and their impact on the MVVM app:&lt;/p&gt;
&lt;h2&gt;&lt;br /&gt;A Slider dies when its Minimum becomes greater than its Maximum&lt;/h2&gt;
&lt;p&gt;Whenever a slider control &amp;ndash;even temporarily- reaches a state where its Minimum value becomes greater than is Maximum, it simply blocks. So when you create a slider of which the range is bound to values in the viewmodel, you could be in trouble. The sliders in the sample app show a range from 0 &amp;deg;C to 28 &amp;deg;C, that&amp;rsquo;s (more or less) from 32 &amp;deg;F to 82 &amp;deg;F. These values are provided by the viewmodel, and they&amp;rsquo;re updated when the settings change. Here are the bindings for one of the sliders:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Slider Value="{Binding SomeTemperature, Mode=TwoWay}"
        Minimum="{Binding MinimumTemperature}"
        Maximum="{Binding MaximumTemperature}" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;In a regular MVVM app, we would safely rely on the data binding engine to propagate the modifications from the viewmodels to the controls. Well, that does not work if there are sliders involved: whenever the sample app reaches a sub state where the MinimumValue is in Fahrenheit (32) and the MaximumValue is still or already in Celsius (28), the sliders simply die with an unmovable thumb docked to the maximum end, like this:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fslider_blocked.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;As a work around, you can take&amp;nbsp;control of the order in which the property changes are notified, just&amp;nbsp;to make sure there&amp;rsquo;s always a valid range. Here&amp;rsquo;s an example; this is part of the code that is triggered by the temperature unit&amp;nbsp;toggle switch:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;// Workaround: control change propagation order.
if (this.isCelsius)
{
    this.OnPropertyChanged("MinimumTemperature");
    this.OnPropertyChanged("MaximumTemperature");
}
else
{
    this.OnPropertyChanged("MaximumTemperature");
    this.OnPropertyChanged("MinimumTemperature");
}&lt;/pre&gt;
&lt;p&gt;If we switch to Celsius, we first change the MinimumValue (from 32 to 0) and then the MaximumValue (from 82 to 28), and the other way around when we switch to Fahrenheit. We should never be forced to write this kind of code, but it does the trick. &lt;br /&gt;Let&amp;rsquo;s move to another issue:&lt;/p&gt;
&lt;h2&gt;&lt;br /&gt;A Slider modifies its Value to keep it in its Range&lt;/h2&gt;
&lt;p&gt;While the first issue is just an inconvenience, I perceive the second issue as a real disaster: while you are changing the boundaries of the slider range, the slider will update its Value property to keep it in this range. Here&amp;rsquo;s a scenario. Start the app and set both temperatures to 57&amp;deg;F (that&amp;rsquo;s in the middle of the range).&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fslider_start.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Then switch to Celsius and observe the value in the top slider:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fslider_wrong_value.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;The slider Value&amp;nbsp;went down to 0 instead of the expected 14 &amp;deg;C. This is what happened: when the range moved from (32 -&amp;gt; 82) to (0 -&amp;gt; 28), the slider &amp;lsquo;adjusted&amp;rsquo; the value before the viewmodel had a chance to calculate the new value. So the slider changes the value, and then the viewmodel used that wrong value to apply the conversion to.&amp;nbsp;Somewhere in that&amp;nbsp;process, the slider also broke&amp;nbsp;its binding. So its value is at zero, where the viewmodel is at -2. Both are wrong.&amp;nbsp;Staggering, isn&amp;rsquo;t it? And by the way: unit tests on&amp;nbsp;your viewmodel will NOT reveal these bugs. &lt;img style="border: 0px;" title="Frown" src="http://blogs.u2u.be/diederik/editors/tiny_mce_3_4_3_1/plugins/emotions/img/smiley-frown.gif" alt="Frown" /&gt;&lt;/p&gt;
&lt;p&gt;On a more positive note: you can&amp;nbsp;circumvent the problem by making a backup of the value on the start of the change propagation, like this:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;var temp = this.anotherTemperature;
            
// Obsolete algorithm to update slider range
// ...
            
// This would be standard code. Unfortunately it does not work.
if (this.isCelsius)
{
    this.SomeTemperature = UnitConverter.FahrenheitToCelsius(this.SomeTemperature);
}
else
{
    this.SomeTemperature = UnitConverter.CelsiusToFahrenheit(this.SomeTemperature);
}

// Workaround: backup value.
if (this.isCelsius)
{
    this.AnotherTemperature = UnitConverter.FahrenheitToCelsius(temp);
}
else
{
    this.AnotherTemperature = UnitConverter.CelsiusToFahrenheit(temp);
}&lt;/pre&gt;
&lt;p&gt;Can you imagine how the complexity would increase if we had multiple sliders, some of them with more than two possible ranges (e.g. liters, US gallons, and UK gallons)? Well I can, here&amp;rsquo;s an example of such a page.&amp;nbsp;This view&amp;nbsp;will be part of&amp;nbsp;the next release of &lt;a href="http://www.greatwindowsapps.com/app/homebrewers-toolkit" target="_blank"&gt;this app&lt;/a&gt;.&amp;nbsp;It does what it's supposed to do, but its viewmodel is bloated with logic to keep&amp;nbsp;all sliders up and running:&lt;/p&gt;
&lt;p&gt;&lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fpriming_calculator.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Call to action&lt;/h2&gt;
&lt;p&gt;This small sample shows that&amp;nbsp;even one simple slider in a view could dramatically increase the complexity of&amp;nbsp;your code, even up to a point where it threatens the MVVM architecture. It really should not be necessary to apply modifications to the viewmodels (and/or models), just to work around the inappropriate behavior of one single type of control. I strongly believe that&amp;nbsp;XAML developers deserve a better solution, in the form of more&amp;nbsp;MVVM-friendly native&amp;nbsp;controls. So &lt;strong&gt;Microsoft: please fix this&lt;/strong&gt;. And while you&amp;rsquo;re there: fix the radio button too.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Maybe I should make an appeal to the community? Why not:&lt;/p&gt;
&lt;div style="margin: 10px; padding: 10px; border: solid black 2px;"&gt;
&lt;p&gt;Dear open source MVVM framework builders,&lt;/p&gt;
&lt;p&gt;We have enough property change propagators, dependency injectors, service locators and event aggregators. Could you please spend some time in creating or fixing&amp;nbsp;some controls to actually work with it?&lt;/p&gt;
&lt;p&gt;Thanks,&lt;br /&gt;a XAML developer&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That almost sounded like a rant, didn't it? Don't worry: I'm fine.&lt;img style="border: 0px;" title="Smile" src="http://blogs.u2u.be/diederik/editors/tiny_mce_3_4_3_1/plugins/emotions/img/smiley-smile.gif" alt="Smile" /&gt;&lt;/p&gt;
&lt;h2&gt;Code&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the sample project: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2013%2f3%2fU2UConsult.WinRT.MVVMSlider.zip"&gt;U2UConsult.WinRT.MVVMSlider.zip (117.08 kb)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;a href="http://www.twitter.com/diederikkrols" target="_blank"&gt;Diederik&lt;/a&gt;&lt;/p&gt;</description><pubDate>Mon, 18 Mar 2013 22:44:00 -1200</pubDate><comments>http://blogs.u2u.be/diederik/post/2013/03/18/The-Slider’s-Guide-to-the-MVVM-Galaxy.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=0994a364-755d-4594-80f3-32396a638942</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=0994a364-755d-4594-80f3-32396a638942</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2013/03/18/The-Slider’s-Guide-to-the-MVVM-Galaxy.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=0994a364-755d-4594-80f3-32396a638942</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=9bfbbe2a-3f9e-4934-9dcc-7f97480c12e4</guid><link>http://blogs.u2u.be/diederik/post/2013/03/04/Semantic-Zoom-and-LINQ-Better-Together.aspx</link><category>Metro</category><category>WinRT</category><title>Semantic Zoom and LINQ: Better Together</title><description>&lt;p&gt;With this short article, I want to show you the easy way&amp;nbsp;to provide data to a semantic zoom in a Windows 8 Store app. I&amp;rsquo;ve seen too many developers trying to massage their business data to make it consumable for a semantic zoom, by&amp;nbsp;pulling it through&amp;nbsp;custom implementations of &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.isemanticzoominformation.aspx" target="_blank"&gt;ISemanticZoomInformation&lt;/a&gt; or&amp;nbsp;through other data adapter classes. You see this pattern even in the official &lt;a href="http://code.msdn.microsoft.com/windowsapps/GroupedGridView-77c59e8e" target="_blank"&gt;XAML GridView grouping and SemanticZoom&lt;/a&gt; sample. All you need to remember from this article, is that such infrastructure is not necessary: the grouped data source for the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.data.collectionviewsource.aspx" target="_blank"&gt;CollectionViewSource&lt;/a&gt; that populates the two zoom levels of a semantic zoom control, can be generated by a simple LINQ query that your ViewModel can pull straight out of your Models.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;As usual, I built a simple MVVM app to illustrate my point. It comes with two Model classes: Item and Category, where each item has a category. I do realize that&amp;nbsp;this will not help me win&amp;nbsp;the Oscar for the most original scenario. The data access layer provides a list of both. The only View in the app just shows a semantic zoom that pulls its data (items with a category) from a property in the main ViewModel.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Here&amp;rsquo;s how the two levels of the semantic zoom look like at runtime.&lt;/p&gt;
&lt;p&gt;Zoomed in:&lt;br /&gt; &lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fsemantic-linq-1.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Zoomed out:&lt;br /&gt; &lt;img style="width: 100%;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fsemantic-linq-2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The CollectionViewSource is defined as a resource in XAML, and bound to the zoomed-in view of the semantic zoom:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Page.Resources&amp;gt;
    &amp;lt;CollectionViewSource x:Name="collectionViewSource"
                            IsSourceGrouped="True"
                            Source="{Binding ItemsByCategory}" /&amp;gt;
&amp;lt;/Page.Resources&amp;gt;

&amp;lt;!-- ... --&amp;gt;

&amp;lt;SemanticZoom x:Name="semanticZoom"&amp;gt;
    &amp;lt;SemanticZoom.ZoomedInView&amp;gt;
        &amp;lt;GridView ItemsSource="{Binding Source={StaticResource collectionViewSource}}"
                    SelectionMode="None"&amp;gt;
            &amp;lt;!-- ... --&amp;gt;
        &amp;lt;/GridView&amp;gt;
    &amp;lt;/SemanticZoom.ZoomedInView&amp;gt;
    &amp;lt;!-- ... --&amp;gt;
&amp;lt;/SemanticZoom&amp;gt;&lt;/pre&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img style="height: 240px; border: 0px;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fSnoopy-juggling.jpg" alt="" /&gt;&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;
&lt;p&gt;The CollectionViewSource gets its data from the viewmodel through a LINQ query that yields the items, grouped by category:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;itemsByCategory = from item in Items
                    orderby item.Name
                    group item by item.Category into g
                    orderby g.Key.Name
                    select g;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;By the way, this is how&amp;nbsp;that &lt;strong&gt;same&amp;nbsp;query&lt;/strong&gt; looks like in the official sample:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;internal List&amp;lt;GroupInfoList&amp;lt;object&amp;gt;&amp;gt; GetGroupsByCategory()
{
    List&amp;lt;GroupInfoList&amp;lt;object&amp;gt;&amp;gt; groups = new List&amp;lt;GroupInfoList&amp;lt;object&amp;gt;&amp;gt;();

    var query = from item in Collection
                orderby ((Item)item).Category
                group item by ((Item)item).Category into g
                select new { GroupName = g.Key, Items = g };
    foreach (var g in query)
    {
        GroupInfoList&amp;lt;object&amp;gt; info = new GroupInfoList&amp;lt;object&amp;gt;();
        info.Key = g.GroupName;
        foreach (var item in g.Items)
        {
            info.Add(item);
        }
        groups.Add(info);
    }

    return groups;
}&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;That's a lot of obsolete code. For the sake of simplicity, I spare you from the definition of the -also obsolete- &lt;em&gt;GroupInfoList&lt;/em&gt; class.&amp;nbsp;Looking at this code,&amp;nbsp;one can only agree when&amp;nbsp;a tweet like this one pops up in&amp;nbsp;his timeline:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2ftweet.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Enough ranting, let's go back to the sample.&lt;/p&gt;
&lt;p&gt;The LINQ query returns an IEnumerable&amp;lt;IGrouping&amp;lt;Category, Item&amp;gt;&amp;gt;. And that&amp;rsquo;s enough to provide a source for all semantic zoom bindings.&lt;/p&gt;
&lt;p&gt;The zoomed-out view of the semantic zoom has several templates. The item template is bound to each item, so the binding expressions are straightforward:&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;GridView.ItemTemplate&amp;gt;
    &amp;lt;DataTemplate&amp;gt;
        &amp;lt;!-- Bound to an Item --&amp;gt;
        &amp;lt;StackPanel&amp;gt; 
            &amp;lt;Image Source="{Binding Image}"
                    ... /&amp;gt;
            &amp;lt;Border ... &amp;gt;
                &amp;lt;TextBlock Text="{Binding Name}"
                            ... /&amp;gt;
            &amp;lt;/Border&amp;gt;
        &amp;lt;/StackPanel&amp;gt;
    &amp;lt;/DataTemplate&amp;gt;
&amp;lt;/GridView.ItemTemplate&amp;gt;&lt;/pre&gt;
&lt;p&gt;Each grouping (= category) has a&amp;nbsp;group style header, of which the&amp;nbsp;template is bound to an &lt;a href="http://msdn.microsoft.com/en-us/library/bb344977.aspx" target="_blank"&gt;IGrouping&lt;/a&gt;. That interface only provides a &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb343251.aspx" target="_blank"&gt;Key&lt;/a&gt;&lt;/em&gt; attribute, but that's enough to provide the title:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;GroupStyle.HeaderTemplate&amp;gt;
    &amp;lt;DataTemplate&amp;gt;
        &amp;lt;!-- Bound to an IGrouping with Category as Key--&amp;gt;
        &amp;lt;Grid Margin="0"&amp;gt;
            &amp;lt;TextBlock Text='{Binding Key.Name}'
                        ... /&amp;gt;
        &amp;lt;/Grid&amp;gt;
    &amp;lt;/DataTemplate&amp;gt;
&amp;lt;/GroupStyle.HeaderTemplate&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;The zoomed-in view of the semantic zoom is bound to the collection of groups in the data source. We (still) have to do this in code behind:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;protected override void OnNavigatedTo(NavigationEventArgs e)
{
    // IObservableVector&amp;lt;IGrouping&amp;lt;Category, Item&amp;gt;&amp;gt;
    (this.semanticZoom.ZoomedOutView as ListViewBase).ItemsSource = collectionViewSource.View.CollectionGroups;
}&lt;/pre&gt;
&lt;p&gt;This is an &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.data.icollectionviewgroup.aspx" target="_blank"&gt;ICollectionViewGroup&lt;/a&gt;, so it comes with &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.data.icollectionviewgroup.group.aspx" target="_blank"&gt;Group&lt;/a&gt;&lt;/em&gt; and &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.data.icollectionviewgroup.groupitems.aspx" target="_blank"&gt;GroupItems&lt;/a&gt;&lt;/em&gt; properties. These properties come in handy to provide binding expressions. &lt;em&gt;Group.Key&lt;/em&gt; returns&amp;nbsp;the category instance, but&amp;nbsp;you could also choose to just &lt;span style="text-decoration: underline;"&gt;follow the links in the viewmodel&lt;/span&gt; from the items' perspective:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;GridView.ItemTemplate&amp;gt;
    &amp;lt;DataTemplate&amp;gt;
        &amp;lt;!-- Bound to an ICollectionViewGroup --&amp;gt;
        &amp;lt;StackPanel&amp;gt;
            &amp;lt;Border&amp;gt;
                &amp;lt;TextBlock Text="{Binding Group.Key}"
                            ... /&amp;gt;
            &amp;lt;/Border&amp;gt;
            &amp;lt;Image Source="{Binding GroupItems[0].Category.Image}"
                    ... /&amp;gt;
        &amp;lt;/StackPanel&amp;gt;
    &amp;lt;/DataTemplate&amp;gt;
&amp;lt;/GridView.ItemTemplate&amp;gt;&lt;/pre&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img style="border: 0px;" src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f3%2fjoe-cool.jpg" alt="" /&gt;&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;
&lt;p&gt;As you see, you don&amp;rsquo;t need special infrastructure to populate a two-level semantic zoom.&amp;nbsp;All bindings can be&amp;nbsp;fulfilled with&amp;nbsp;just your ViewModels and a little LINQ.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the code: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2013%2f3%2fU2UConsult.Win8.SemanticZoomWithLinq.V2.zip"&gt;U2UConsult.Win8.SemanticZoomWithLinq.V2.zip (531.35 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;br /&gt; &lt;a href="https://twitter.com/@diederikkrols" target="_blank"&gt;Diederik&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Mon, 04 Mar 2013 23:17:00 -1200</pubDate><comments>http://blogs.u2u.be/diederik/post/2013/03/04/Semantic-Zoom-and-LINQ-Better-Together.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=9bfbbe2a-3f9e-4934-9dcc-7f97480c12e4</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=9bfbbe2a-3f9e-4934-9dcc-7f97480c12e4</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2013/03/04/Semantic-Zoom-and-LINQ-Better-Together.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=9bfbbe2a-3f9e-4934-9dcc-7f97480c12e4</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=bc7cbdc2-087d-4111-b5ef-54e952de9c5e</guid><link>http://blogs.u2u.be/diederik/post/2013/02/05/Avoiding-hard-times-with-the-soft-keyboard.aspx</link><category>WinRT</category><title>Avoiding hard times with the soft keyboard</title><description>&lt;p&gt;Developers who submit a Windows 8 XAML-based Store app that involves data entry, should always test their app on a real touch device. Otherwise they might see their app rejected because of the soft keyboard blocking the screen. This article illustrates some of my personal experiences and issues regarding the behavior of the soft keyboard in Windows 8 Store apps. Don&amp;rsquo;t worry: none of these issues is really blocking, and I&amp;rsquo;ll show you some workarounds.&lt;/p&gt;
&lt;p&gt;When and why the soft keyboard opens and closes, is described in &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh465404.aspx" target="_blank"&gt;this white paper&lt;/a&gt;. If you&amp;rsquo;re building Windows 8 Store apps that have data entry pages, &lt;span style="text-decoration: underline;"&gt;this white paper is a must read&lt;/span&gt;. The behavior of the soft keyboard is well documented and justified, at least in theory. In practice however, I came across some issues. Here they are:&lt;/p&gt;
&lt;h2&gt;The soft keyboard never closes automatically&lt;/h2&gt;
&lt;p&gt;The keyboard cannot be opened programmatically. That&amp;rsquo;s a good thing. The keyboard opens only when the user taps on a text entry control (mostly a TextBox). Unfortunately the only way to indicate that he&amp;rsquo;s finished entering data, is to &amp;lsquo;tap somewhere else on the screen&amp;rsquo;. Depending on that &amp;lsquo;somewhere else on the screen&amp;rsquo; the soft keyboard will remain open, or it will disappear. Now some controls know very well when data entry is finished and should not require that extra tap. E.g. a box to enter a year or birth could (and in my opinion should) leave edit mode automatically when four digits are entered. In other controls, hitting the &amp;lsquo;Enter&amp;rsquo; key would be an intuitive action to indicate the end of data input. I implemented the latter behavior in my &lt;a href="http://blogs.u2u.be/diederik/post/2012/09/26/Enhancing-the-Win8-Slider-experience.aspx" target="_blank"&gt;EnhancedSlider&lt;/a&gt;, that&amp;rsquo;s a slider that comes with an extra TextBox to allow direct input. That TextBox becomes disabled when the user hits the &amp;lsquo;Enter&amp;rsquo; key in it.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;I believe that tapping that key on the keyboard is a lot more user friendly than letting the user search for a safe spot on the semi-obscured screen (remember: the soft keyboard covers half the screen) to close the keyboard.&lt;/p&gt;
&lt;p&gt;The &amp;lsquo;tap outside the control&amp;rsquo; philosophy also makes it impossible to make a full-screen text input control. Here's what happens if the screen is entirely filled by one or more textboxes:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f2%2fkeyboard_no_close.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;The user can enter some tekst, but he can't close the keyboard anymore. If the Windows8 App store testers&amp;nbsp;get stuck in&amp;nbsp;this scenario, they will not approve your app.&lt;/p&gt;
&lt;h2&gt;The next edit control is automatically focused&lt;/h2&gt;
&lt;p&gt;When the TextBox in the EnhancedSlider becomes disabled, the keyboard remains open if there are other text input controls on the page. I&amp;rsquo;m OK with that: we&amp;rsquo;re in edit mode, so it doesn&amp;rsquo;t make sense to distract our user by constantly flipping the keyboard up and down. But not all screens require the use to enter the data in a specific order. Allow me to illustrate this with an example. This is a screenshot of a user changing the weight of some business object through an EnhancedSlider (middle of the screen):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f2%2fkeyboard_slider_1.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what happens by default when the user finishes editing by hitting &amp;lsquo;Enter&amp;rsquo;. The keyboard remains open with the focus on the category ComboBox (I&amp;rsquo;m complaining about the focus here, not the ugly blue color &amp;ndash; the inappropriate color is clearly my fault):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f2%2fkeyboard_slider_2.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;There are no relationships between the fields, so there&amp;rsquo;s no required input order. The user just modifies what he needs to modify in any chosen order. There&amp;rsquo;s absolutely no need to automatically give the focus to any of the controls. It&amp;rsquo;s not like the user is going to use the soft keyboard to tab through the controls on the page. On the other hand: a user with a real keyboard may just want to tab through the screen, so setting the &lt;em&gt;IsTabStop&lt;/em&gt; property to false is not a viable solution. I believe that it should be possible for a developer to specify that the keyboard may remain open without a&amp;nbsp;particular control getting the focus. I have the impression that the soft keyboard paradigm in Windows 8 is based on archaic fill-out form logic.&lt;/p&gt;
&lt;p&gt;Up until now, you could say: &amp;ldquo;Hey, it&amp;rsquo;s your own fault. You&amp;rsquo;re using a custom control that violates the UX standards&amp;rdquo;. OK, I agree with that. But here&amp;rsquo;s an issue that has nothing to do with me trying to deliver user friendly controls:&lt;/p&gt;
&lt;h2&gt;The keyboard remains open on ListBoxItem&lt;/h2&gt;
&lt;p&gt;When the soft keyboard is open and the focus moves to another text input control, the keyboard remains open. I already mentioned that I&amp;rsquo;m OK with that. I just have a problem with the definition of &amp;lsquo;text input control&amp;rsquo;. This is the list from the mentioned white paper: Check box, Combo box, Radio button, Scroll bar, Tree, Tree item, Menu, Menu bar, Menu item, Toolbar, List, List item.&lt;/p&gt;
&lt;p&gt;That last control is the one that bothers me. In a tile-based store app &amp;ndash;and that&amp;rsquo;s the large majority- everything is hosted inside a ListItem. A lot of pages do nothing more than displaying a collection of business objects in an ItemsControl (ListView, VariableSizedGridView, SemanticZoom, etc.) The main navigation hub of single page apps (like the finance and weather app) uses a &lt;a href="http://blogs.u2u.be/diederik/post/2012/07/09/The-taming-of-the-Metro-GridView.aspx" target="_blank"&gt;GridView as main navigation panel&lt;/a&gt;. Here&amp;rsquo;s another example of a real app that has a horizontally scrolling page with several topics. That's a very common concept. Unfortunately, things go wrong when&amp;nbsp;you&amp;nbsp;request&amp;nbsp;the user to type in some tekst in such an app. I just wrote something in the text box&amp;nbsp;at the bottom of the&amp;nbsp;page,&amp;nbsp;and tapped inside the border:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f2%2fkeyboard_gridview_1.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s nothing special to see, except a blinking cursor in the text box (and the screenshot does not even show that). The app looks fully operational. But that&amp;rsquo;s only because I took the screenshot when a physical keyboard was attached to the tablet. This is how the same screen looks like in full touch mode:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f2%2fkeyboard_gridview_2.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;The keyboard remains open because the controls are hosted in a GridViewItem, which is a ListItem, which is in the keep-the-keyboard-open list. Tapping on the page does not close the keyboard, and the main navigation buttons are off-screen. The UI is blocked now, the app will be rejected. #FAIL&lt;/p&gt;
&lt;h2&gt;Easy work arounds&lt;/h2&gt;
&lt;p&gt;OK, here&amp;rsquo;s the good news: all these issues can be solved by adding one or two simple XAML controls on your data entry page. When fighting with the soft keyboard, you just&amp;nbsp;give one of these controls programmatically the focus, and the keyboard will obey your will.&lt;/p&gt;
&lt;p&gt;The first problem solver is a focusable control of the text input kind, without a user interface. When you give this one the focus, the keyboard will open without focusing one of the visible controls. That sounds easy: just create a text box with Visibility set to Collapsed, or Height or Width at zero. Unfortunately that does not the trick: the runtime will not give the focus to a control that does not consume screen infrastructure. But we know that templatability is a key concept in XAML, so let&amp;rsquo;s leverage it. The next control successfully fools the Windows RT runtime:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;!-- Opens the soft keyboard when it gets the focus --&amp;gt;
&amp;lt;TextBox x:Name="KeyboardOpener"&amp;gt;
    &amp;lt;TextBox.Template&amp;gt;
        &amp;lt;ControlTemplate /&amp;gt;
    &amp;lt;/TextBox.Template&amp;gt;
&amp;lt;/TextBox&amp;gt;&lt;/pre&gt;
&lt;p&gt;You can give this control the focus programmatically like this:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;this.KeyboardOpener.Focus(FocusState.Programmatic);&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;Or you could just place it at the right position. In the above screen I just added a KeyboardOpener next to the Enhanced Slider:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;local:EnhancedSlider Value="{Binding GrainGift.Weight.Value, Mode=TwoWay}"
                        Header="Weight"
                        ValueSuffix="{Binding GrainGift.Weight.UnitMeasure.Name, Converter={StaticResource StringFormatConverter}, ConverterParameter=' {0}'}"
                        Minimum="0"
                        Maximum="{Binding GrainGift.MaxWeight}"
                        StepSize="5" /&amp;gt;
&amp;lt;TextBox x:Name="FocusGrabber"&amp;gt;
    &amp;lt;TextBox.Template&amp;gt;
        &amp;lt;ControlTemplate /&amp;gt;
    &amp;lt;/TextBox.Template&amp;gt;
&amp;lt;/TextBox&amp;gt;&lt;/pre&gt;
&lt;p&gt;The Combo box does not turn blue anymore.&lt;/p&gt;
&lt;p&gt;If for some reason you want to programmatically close the soft keyboard, give this control the focus:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;!-- Closes the soft keyboard when it gets the focus --&amp;gt;
&amp;lt;Slider x:Name="KeyboardCloser"&amp;gt;
    &amp;lt;Slider.Template&amp;gt;
        &amp;lt;ControlTemplate /&amp;gt;
    &amp;lt;/Slider.Template&amp;gt;
&amp;lt;/Slider&amp;gt;&lt;/pre&gt;
&lt;p&gt;In the above example, I set the focus to this control in the &lt;em&gt;Tapped&lt;/em&gt; event of the GridViewItem:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;GridView SelectionMode="None"&amp;gt;
    &amp;lt;GridView.ItemsPanel&amp;gt;
        &amp;lt;ItemsPanelTemplate&amp;gt;
            &amp;lt;StackPanel Orientation="Horizontal" /&amp;gt;
        &amp;lt;/ItemsPanelTemplate&amp;gt;
    &amp;lt;/GridView.ItemsPanel&amp;gt;
    &amp;lt;Grid Tapped="Page_Unfocus"&amp;gt;
        &amp;lt;!-- Content, including edit controls --&amp;gt;
    &amp;lt;/Grid&amp;gt;
    &amp;lt;!-- Other pages --&amp;gt;
&amp;lt;/GridView&amp;gt;&lt;/pre&gt;
&lt;pre class="brush: c-sharp;"&gt;private void Page_Unfocus(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
    this.FocusGrabber.Focus(Windows.UI.Xaml.FocusState.Programmatic);
}&lt;/pre&gt;
&lt;h2&gt;A Close-the-keyboard Button&lt;/h2&gt;
&lt;p&gt;The problem in the first screenshot of this article can only be solved by adding a button to the page, a button to close the soft keyboard when it's open. That's exacly what I did. Here's the XAML:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Button x:Name="KeyboardCloser"
        Visibility="Collapsed"
        Style="{StaticResource HideKeyboardAppBarButtonStyle}" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;By default it is invisible. It should only appear when the soft keyboard is open. To achieve this, just register to the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.viewmanagement.inputpane.showing.aspx" target="_blank"&gt;InputPane.Showing&lt;/a&gt; event. Here's the code from the constructor of the page:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;var inputPane = InputPane.GetForCurrentView();
inputPane.Showing += InputPane_Showing;
inputPane.Hiding += InputPane_Hiding;&lt;/pre&gt;
&lt;p&gt;And here are the two event handlers:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;private void InputPane_Showing(InputPane sender, InputPaneVisibilityEventArgs args)
{
    this.KeyboardCloser.Visibility = Visibility.Visible;
}

private void InputPane_Hiding(InputPane sender, InputPaneVisibilityEventArgs args)
{
    this.KeyboardCloser.Visibility = Visibility.Collapsed;
}&lt;/pre&gt;
&lt;p&gt;That's it. When soft keyboard pops open, we show a button to close it. The button itself does not require a click event handler. Tapping it gives it the focus, and that's enough to close the keyboard:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f2%2fkeyboard_close.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;h2&gt;Demo time&lt;/h2&gt;
&lt;p&gt;As usual, I built a small sample project to illustrate these focus-and-keyboard issues. It shows that you can easily open and close the soft keyboard, and that not every ListboxItem keeps the keyboard open. Just check the comments in the code. Here are some screenshots:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f2%2fkeyboard.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f2%2fkeyboard_open.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;If you're not on a touch device, run the code in the simulator. Otherwise there's really not much to observe...&lt;/p&gt;
&lt;h2&gt;Code&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the full code of the sample. It was written with the free Visual Studio 2012 Express Edition: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2013%2f2%2fU2UConsult.Keyboard.Sample.V2.zip"&gt;U2UConsult.Keyboard.Sample.V2.zip (391.60 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.twitter.com/diederikkrols" target="_blank"&gt;Diederik&lt;/a&gt;&lt;/p&gt;</description><pubDate>Tue, 05 Feb 2013 06:35:00 -1200</pubDate><comments>http://blogs.u2u.be/diederik/post/2013/02/05/Avoiding-hard-times-with-the-soft-keyboard.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=bc7cbdc2-087d-4111-b5ef-54e952de9c5e</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=bc7cbdc2-087d-4111-b5ef-54e952de9c5e</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2013/02/05/Avoiding-hard-times-with-the-soft-keyboard.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=bc7cbdc2-087d-4111-b5ef-54e952de9c5e</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/u2u/post.aspx?id=1f955a70-6c82-4c87-93f4-beb4ef15b224</guid><link>http://blogs.u2u.be/u2u/post/2013/01/28/The-whole-world-in-a-SQL-Server-database.aspx</link><category>SQL Server</category><category>Integration Services</category><title>The whole world in a SQL Server database</title><description>&lt;p&gt;Some people have the whole world in their hand, but last weekend I tried something slightly less ambitious: Getting (part of) the whole world in a SQL Server database.&lt;/p&gt;  &lt;h3&gt;Loads of spatial data from OpenStreetMap&lt;/h3&gt;  &lt;p&gt;I’m always looking for interesting datasets. I was still lacking a large dataset with spatial data. The biggest public spatial dataset I’m aware of is &lt;a href="http://www.openstreetmap.org/" target="_blank"&gt;OpenStreetMap&lt;/a&gt; (OSM). It’s a map service comparable with Bing or Google Maps. But the data it uses is collected from public data: Some governments provide public location information, but there are also thousands of volunteers who help OSM in putting their street or village ‘on the map’. &lt;/p&gt;  &lt;p&gt;The resulting database is public as well. It is described in &lt;a href="http://wiki.openstreetmap.org/wiki/OSM_XML" target="_blank"&gt;XML format&lt;/a&gt;, and I found on the wiki also an &lt;a href="http://wiki.openstreetmap.org/wiki/API_v0.6/XSD_for_SSIS" target="_blank"&gt;OSM XSD schema&lt;/a&gt;. This allows me to load the data with SQL Server Integration Services, using the data flow XML data source. There might be faster solutions than this, but for the time being, SSIS does a rather good job with a very simple setup.&lt;/p&gt;  &lt;h3&gt;Creating the database&lt;/h3&gt;  &lt;p&gt;So, let’s create the database in which we want to store our data. Be sure to create a database with an initial size big enough to host the data you want to load. The OSM xml file with all the data from the whole planet is about 250 Gb at the time of writing, so It will probably take about 150 Gb in SQL Server (XML is not the most compact storage format). In this blog post example I will be loading a subset of the whole planet, so I create a much smaller database (just under 2 Gb):&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;DATABASE&lt;/span&gt; [OSM]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; ( NAME = N&lt;span style="color: #006080"&gt;'OSM'&lt;/span&gt;, FILENAME = N&lt;span style="color: #006080"&gt;'F:\Data\OSM.mdf'&lt;/span&gt; , &lt;span style="color: #0000ff"&gt;SIZE&lt;/span&gt; = 2048000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 512000KB )&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;  LOG &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; ( NAME = N&lt;span style="color: #006080"&gt;'OSM_log'&lt;/span&gt;, FILENAME = N&lt;span style="color: #006080"&gt;'F:\Data\OSM_log.ldf'&lt;/span&gt; , &lt;span style="color: #0000ff"&gt;SIZE&lt;/span&gt; = 3170880KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;If you really plan to create a much larger database, don’t forget to enable &lt;a href="http://www.sqlskills.com/blogs/kimberly/instant-initialization-what-why-and-how/" target="_blank"&gt;instant initialization&lt;/a&gt; to speed up the process of creating and extending the data file(s).&lt;/p&gt;

&lt;p&gt;Next I create all the tables to store the different pieces of information in the OSM XML files. Notice that I do not keep all the information in the XML files. I do not store the person who entered the data, and the date the data was entered. This reduces the amount of data to be stored, which speeds up the data loading. This is the code to create the necessary tables:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;USE&lt;/span&gt; [OSM]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GO&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TABLE&lt;/span&gt; [dbo].[Nodes](&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     [node_Id] [bigint] &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     [id] [bigint] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     [lat] [&lt;span style="color: #0000ff"&gt;float&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;     [lon] [&lt;span style="color: #0000ff"&gt;float&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     [geog] [geography] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;CONSTRAINT&lt;/span&gt; [PK_Nodes] &lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt; &lt;span style="color: #0000ff"&gt;KEY&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CLUSTERED&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; (&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     [node_Id] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt; )&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; (PAD_INDEX = &lt;span style="color: #0000ff"&gt;OFF&lt;/span&gt;, STATISTICS_NORECOMPUTE = &lt;span style="color: #0000ff"&gt;OFF&lt;/span&gt;, IGNORE_DUP_KEY = &lt;span style="color: #0000ff"&gt;OFF&lt;/span&gt;, ALLOW_ROW_LOCKS = &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;, ALLOW_PAGE_LOCKS = &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;FILLFACTOR&lt;/span&gt; = 80) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;] TEXTIMAGE_ON [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TABLE&lt;/span&gt; [dbo].[NodeTag](&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;     [&lt;span style="color: #0000ff"&gt;key&lt;/span&gt;] [nvarchar](250) &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;     [&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;] [nvarchar](3000) &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;     [node_Id] [bigint] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;];&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GO&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TABLE&lt;/span&gt; [dbo].[Relation](&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;     [relation_Id] [bigint] &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;     [id] [bigint] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;     [visible] [&lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;CONSTRAINT&lt;/span&gt; [PK_Relation] &lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt; &lt;span style="color: #0000ff"&gt;KEY&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CLUSTERED&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt; (&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;     [relation_Id] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt; )&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; (PAD_INDEX = &lt;span style="color: #0000ff"&gt;OFF&lt;/span&gt;, STATISTICS_NORECOMPUTE = &lt;span style="color: #0000ff"&gt;OFF&lt;/span&gt;, IGNORE_DUP_KEY = &lt;span style="color: #0000ff"&gt;OFF&lt;/span&gt;, ALLOW_ROW_LOCKS = &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;, ALLOW_PAGE_LOCKS = &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;FILLFACTOR&lt;/span&gt; = 80) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GO&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TABLE&lt;/span&gt; [dbo].[RelationMember](&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;     [type] [nvarchar](8) &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;     [&lt;span style="color: #0000ff"&gt;ref&lt;/span&gt;] [bigint] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;     [&lt;span style="color: #0000ff"&gt;role&lt;/span&gt;] [nvarchar](250) &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;     [relation_Id] [bigint] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;     [RelationPosition] [&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;IDENTITY&lt;/span&gt;(1,1) &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GO&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TABLE&lt;/span&gt; [dbo].[RelationTag](&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt;     [&lt;span style="color: #0000ff"&gt;key&lt;/span&gt;] [nvarchar](250) &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt;     [&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;] [nvarchar](3000) &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum43"&gt;  43:&lt;/span&gt;     [relation_Id] [bigint] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum44"&gt;  44:&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum45"&gt;  45:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum46"&gt;  46:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GO&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum47"&gt;  47:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TABLE&lt;/span&gt; [dbo].[Way](&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum48"&gt;  48:&lt;/span&gt;     [way_Id] [bigint] &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum49"&gt;  49:&lt;/span&gt;     [id] [bigint] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum50"&gt;  50:&lt;/span&gt;     [visible] [&lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum51"&gt;  51:&lt;/span&gt;  &lt;span style="color: #0000ff"&gt;CONSTRAINT&lt;/span&gt; [PK_Way] &lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt; &lt;span style="color: #0000ff"&gt;KEY&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CLUSTERED&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum52"&gt;  52:&lt;/span&gt; (&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum53"&gt;  53:&lt;/span&gt;     [way_Id] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum54"&gt;  54:&lt;/span&gt; )&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; (PAD_INDEX = &lt;span style="color: #0000ff"&gt;OFF&lt;/span&gt;, STATISTICS_NORECOMPUTE = &lt;span style="color: #0000ff"&gt;OFF&lt;/span&gt;, IGNORE_DUP_KEY = &lt;span style="color: #0000ff"&gt;OFF&lt;/span&gt;, ALLOW_ROW_LOCKS = &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;, ALLOW_PAGE_LOCKS = &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;FILLFACTOR&lt;/span&gt; = 80) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum55"&gt;  55:&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum56"&gt;  56:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum57"&gt;  57:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GO&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum58"&gt;  58:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TABLE&lt;/span&gt; [dbo].[WayNode](&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum59"&gt;  59:&lt;/span&gt;     [&lt;span style="color: #0000ff"&gt;ref&lt;/span&gt;] [bigint] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum60"&gt;  60:&lt;/span&gt;     [way_Id] [bigint] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum61"&gt;  61:&lt;/span&gt;     [WaiNodePosition] [bigint] &lt;span style="color: #0000ff"&gt;IDENTITY&lt;/span&gt;(1,1) &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum62"&gt;  62:&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum63"&gt;  63:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GO&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum64"&gt;  64:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TABLE&lt;/span&gt; [dbo].[WayTag](&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum65"&gt;  65:&lt;/span&gt;     [&lt;span style="color: #0000ff"&gt;key&lt;/span&gt;] [nvarchar](250) &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum66"&gt;  66:&lt;/span&gt;     [&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;] [nvarchar](3000) &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum67"&gt;  67:&lt;/span&gt;     [way_Id] [bigint] &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum68"&gt;  68:&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum69"&gt;  69:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum70"&gt;  70:&lt;/span&gt; GO&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;After the destination tables are created, it’s time to download an &lt;a href="http://wiki.openstreetmap.org/wiki/Planet.osm#Country_and_area_extracts" target="_blank"&gt;OSM xml file&lt;/a&gt;. I downloaded the file for Belgium from one of the mirror servers. After unzipping the file, it is about 2.4 Gb. All the remaining timings in this article are based on this file, but of course, feel free to experiment with data from other countries as well.&lt;/p&gt;

&lt;h3&gt;Loading the data with SSIS&lt;/h3&gt;

&lt;p&gt;Now it’s time to create an Integration Services package which uses an XML source to read the OSM xml file, parse it with the XSD file I mentioned earlier, and write the results to the corresponding tables. I used SQL Server destinations, but if you do be careful to set the destination timeout high enough, or your package will fail on this. You can reuse the &lt;a href="http://goo.gl/7aCJO" target="_blank"&gt;SSIS package&lt;/a&gt; I made on SQL Server 2012, but be sure to check and correct the pointers to the appropriate files.&lt;/p&gt;

&lt;p&gt;Fingers crossed, run the SSIS package and wait till the data is loaded. On my machine it took about 17 minutes. It loaded about 12 million coordinates (Nodes), and more than 1.5 million road segments and other combined objects (Way).&lt;/p&gt;

&lt;p&gt;The only table that really contains coordinates is the Nodes table. In order to use SQL Server’s spatial functions on these, we must first create geographical objects out of the latitude and longitude info. This can simply be done with this statement: 
  &lt;br /&gt;&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;UPDATE&lt;/span&gt; Nodes &lt;span style="color: #0000ff"&gt;SET&lt;/span&gt; geog = geography::Point(lat, lon, 4326)&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This took about 5 minutes on my machine. From now on, we can start querying this information is we want, but my Belgian OSM file contains about 12 million coordinates… without a decent index, every query is going to take forever, so let’s build a spatial index on this. In the next code example I use the new type of spatial index they introduced in SQL Server 2012, but feel free to try other types of spatial indexes as well. Spatial Ed has a short &lt;a href="http://social.technet.microsoft.com/wiki/contents/articles/9694.tuning-spatial-point-data-queries-in-sql-server-2012.aspx" target="_blank"&gt;‘getting started’ paper&lt;/a&gt; if you want to play with spatial indexes.&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; SPATIAL &lt;span style="color: #0000ff"&gt;INDEX&lt;/span&gt; [SpatialIndex-Nodes] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [dbo].[Nodes]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; (&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     [geog]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; )&lt;span style="color: #0000ff"&gt;USING&lt;/span&gt;  GEOGRAPHY_AUTO_GRID &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; (&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; CELLS_PER_OBJECT = 16) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; GO&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;After this index is created, we can get started querying this interesting data source. More on that (and how to create more advanced spatial objects to represent roads, areas etc.) in a later blog post.&lt;/p&gt;

&lt;p&gt;Happy querying! 
  &lt;br /&gt;Nico&lt;/p&gt;</description><pubDate>Mon, 28 Jan 2013 18:50:43 -1200</pubDate><comments>http://blogs.u2u.be/u2u/post/2013/01/28/The-whole-world-in-a-SQL-Server-database.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=1f955a70-6c82-4c87-93f4-beb4ef15b224</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/u2u/trackback.axd?id=1f955a70-6c82-4c87-93f4-beb4ef15b224</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/u2u/post/2013/01/28/The-whole-world-in-a-SQL-Server-database.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/u2u/syndication.axd?post=1f955a70-6c82-4c87-93f4-beb4ef15b224</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/u2u/post.aspx?id=c3def935-6610-46c3-933d-3734fcc12d63</guid><link>http://blogs.u2u.be/u2u/post/2013/01/21/Validation-sets-in-SQL-Server-Data-Mining.aspx</link><category>Analysis Services</category><category>SQL Server BI</category><category>Data Mining</category><title>Validation sets in SQL Server Data Mining</title><description>&lt;h2&gt;What are validation sets?&lt;/h2&gt;  &lt;h3&gt;Data Mining&lt;/h3&gt;  &lt;p&gt;Data mining analyses historical data to find patterns that might help us better understand how our business works, or might help predict how the business might evolve in the future: Instead of doing ‘traditional BI’, where we pick some attributes and ask for aggregated data (“show me the sum of sales amount by country per fiscal quarter”), in data mining we ask questions such as “what is typical for customers who buy bikes”, and we get answers (models, as we call them) that contain patterns such as “if the age of the customer is less than 29 and they live in the Netherlands they are more likely bike buyers”. This however results in a problem: how do we know if a model is ‘better’ than another model? Is the model “Young people are more frequent bike buyers” better than “People who do not own a car are bike buyers”?&lt;/p&gt;  &lt;h3&gt;Test set&lt;/h3&gt;  &lt;p&gt;The typical approach to test the quality of models is by testing how well they behave when we use them to predict the outcome (e.g. whether a customer buys a bike or not) on the historical data, for which we then already know the outcome. Models for which the predicted outcome more frequently corresponds with the actual outcome are better models. However, we need to be careful: if we would use as a test data set the same set of data we use to create the models, we run the risk of &lt;strong&gt;overfitting&lt;/strong&gt;. Overfitting means the model is so tuned on the training set, that the patterns are not general enough to be useful on new data. E.g. the model “If the customer name is Ben Carlson, Margareta Wuyts, … or Jeremy Frank then it is a bike buyer” might make perfect predictions in your historical data, but it is clear that it will be of little help in making predictions on new customers: it is heavily overfitted. This is why we split the historical data in two sets: training data, on which the system search for patterns, and test data, which we use to test the quality of the model. This is even &lt;a href="http://msdn.microsoft.com/en-us/library/bb895173.aspx" target="_blank"&gt;build-in in the SQL Server Analysis Services wizard&lt;/a&gt; to construct mining models: It by default proposes to keep 30% of the data separate for testing.    &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://blogs.u2u.be/u2u/image.axd?picture=image_1.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/u2u/image.axd?picture=image_thumb_1.png" width="405" height="367" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Validation set&lt;/h3&gt;  &lt;p&gt;But… also test data sets raise an issue: We often need to test a lot of different mining models with different parameter setting to find a near-optimal result. This is an iterative process, in which we create a few models, test them on the test set, see which data mining techniques and parameters work best, use that knowledge to setup a second iteration of models to be tested etc. But in this way, the data mining developer is introducing knowledge from the test set in the development process: Imagine that in our test set age is a strong indicator, than we will favor models which use this. The overall result is that the estimated quality of the predictions which are made on the test set are no longer a good estimate of the expected quality of the predictions on new data. They are already slightly biased towards our test set, and typically overestimate the predictive quality of our model.&lt;/p&gt;  &lt;p&gt;This is where validation sets come in: Before we got started with any data mining in the first place, we should have set some of our historical data (e.g. 20% of the data) apart in a validation set. The remaining 80% is then split apart in training and test data. Once we’re finished with our data mining, we test our model one last time, on data it has never seen, not as training data, not as test data. Our validation set is (from the data mining point of view) truly new data, and might give the best impression of the expected predictive quality of our mining model. &lt;/p&gt;  &lt;h2&gt;How do we create validation sets?&lt;/h2&gt;  &lt;p&gt;In contrast to test data sets, the mining wizard does not allow us to set apart a validation set. So we need to do this in the data preparation phase (see &lt;a href="http://en.wikipedia.org/wiki/Cross_Industry_Standard_Process_for_Data_Mining" target="_blank"&gt;CRISP-DM methodology&lt;/a&gt; for more info on the different phases in the data mining process). If you prefer to prepare your data with T-SQL statements, you can use &lt;a href="http://msdn.microsoft.com/en-us/library/cc441928.aspx" target="_blank"&gt;this approach based on NEWID()&lt;/a&gt; to randomly select a certain set of data, but be careful: if you rerun the statement, a different subset will be selected.&lt;/p&gt;  &lt;p&gt;Another approach is to use SSIS (Integration Services), which has a &lt;a href="http://msdn.microsoft.com/en-us/library/ms139864.aspx" target="_blank"&gt;percentage sampling transformation&lt;/a&gt; which is ideal for this job: it assigns each row an n% likelihood of being selected, so because of that it doesn’t need to cache all rows in memory (in contrast to the row sampling transformation). An advantage over the NEWID() approach is that we can set the seed for the random data generator, such that results are reproducible if we want.    &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://blogs.u2u.be/u2u/image.axd?picture=image_2.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/u2u/image.axd?picture=image_thumb_2.png" width="413" height="253" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;How do we use validation sets?&lt;/h2&gt;  &lt;p&gt;Using validation sets is easy. Just make sure that the table you created with the validation data is in the same data source as the data source you used for the SSAS project. Then in the Mining Accuracy Chart tab of the Mining model in SSAS, you select just the best performing model(s) and below you choose the radio button to use a different data set.   &lt;br /&gt;&lt;a href="http://blogs.u2u.be/u2u/image.axd?picture=ValidationSet.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="ValidationSet" border="0" alt="ValidationSet" src="http://blogs.u2u.be/u2u/image.axd?picture=ValidationSet_thumb.png" width="418" height="404" /&gt;&lt;/a&gt;&lt;/p&gt;        &lt;p&gt;Click the ellipsis button (…) and select the table or view which contains the validation set. Join the proper columns from the validation set with the mining model, and you’re set! Now you can create lift or profit charts and build a classification matrix against the validation set.&lt;/p&gt;  &lt;p&gt;Happy mining!   &lt;br /&gt;Nico&lt;/p&gt;</description><pubDate>Mon, 21 Jan 2013 21:04:27 -1200</pubDate><comments>http://blogs.u2u.be/u2u/post/2013/01/21/Validation-sets-in-SQL-Server-Data-Mining.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=c3def935-6610-46c3-933d-3734fcc12d63</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/u2u/trackback.axd?id=c3def935-6610-46c3-933d-3734fcc12d63</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/u2u/post/2013/01/21/Validation-sets-in-SQL-Server-Data-Mining.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/u2u/syndication.axd?post=c3def935-6610-46c3-933d-3734fcc12d63</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=869a4fe1-88b4-4eb2-ba55-816c5896c450</guid><link>http://blogs.u2u.be/diederik/post/2013/01/20/Printing-from-MVVM-XAML-Windows-8-Store-apps.aspx</link><category>WinRT</category><title>Printing from MVVM XAML Windows 8 Store apps - the final frontier</title><description>&lt;p&gt;This article describes a reusable way of implementing print support in a Windows 8 MVVM-and-XAML based Store app. I noticed on the MSDN forum that many developers have a problem with the XAML version of the &lt;a href="http://code.msdn.microsoft.com/windowsapps/Print-Sample-c544cce6" target="_blank"&gt;official printing sample&lt;/a&gt;&amp;nbsp;app. They find it too complex. So I originally wanted to create a simpler version of it. I realized very rapidly that these developers are actually wrong. The print sample is not too complex. On the contrary: the printing sample is missing many features that would make it useful in a production app:&lt;br /&gt;&amp;bull;&amp;nbsp;It does not support multiple types of print pages.&lt;br /&gt;&amp;bull;&amp;nbsp;The printed page only has flat text and images.&lt;br /&gt;&amp;bull;&amp;nbsp;The printed page does not support data binding.&lt;br /&gt;&amp;bull;&amp;nbsp;The printed page&amp;nbsp;contains a mix of content (text) and template (header, footer, margins)&amp;nbsp;elements - the template&amp;nbsp;elements&amp;nbsp;are not nicely encapsulated.&lt;br /&gt;&amp;bull;&amp;nbsp;The printed pages have no page number.&lt;/p&gt;
&lt;p&gt;So I put that sample on steroids to address these issues and make it work in a larger MVVM context, and here&amp;rsquo;s the result. O, I also simplified it a bit: I removed the need for&amp;nbsp;having two different print page classes: I merged&amp;nbsp;HeaderPage and ContinuationPage into a single PrintPage&amp;nbsp;(see comments below).&amp;nbsp;Let me tell you upfront: the code works, but I&amp;rsquo;m not proud of it. I sincerely hope that I missed a useful XAML feature or two, because the overall complexity level is just too high for something as basic as printing. I have a hunch that I&amp;nbsp;did boldly go where nobody should have gone before.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how&amp;nbsp;my sample app looks like. It has a main page with two buttons that talk to the print provider, and a ComboBox that&amp;rsquo;s populated by a ViewModel:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f1%2fprint_app.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;That's a simple start. Now hear the rest of the story.&lt;/p&gt;
&lt;h2&gt;&lt;br /&gt;The Framework&lt;/h2&gt;
&lt;p&gt;This is&amp;nbsp;the object model of the lightweight printing framework:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f2%2fprintingFrameworkV2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Most of the reusable functionality is&amp;nbsp;encapsulated in&amp;nbsp;the &lt;em&gt;PrintServiceProvider&lt;/em&gt;. It has methods to register and unregister the app for printing with Windows. If you don&amp;rsquo;t register, then the devices charm remains empty. It also has the required event handlers that are called by Windows to generate the pages to be displayed in the preview pane&amp;nbsp;and the actual pages to be printed. Just like in the official printing sample, the class inherits from &lt;em&gt;Page&lt;/em&gt;. That allows it to make use of&amp;nbsp;its &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.dependencyobject.dispatcher.aspx" target="_blank"&gt;Dispatcher&lt;/a&gt;&lt;/em&gt;.&lt;br /&gt;The printing framework also comes a&amp;nbsp;&amp;lsquo;real&amp;rsquo; page: the &lt;em&gt;PrintPage&lt;/em&gt; instances&amp;nbsp;appear in the preview pane and are sent to the device. It's just an&amp;nbsp;empty page with a header, a footer, and a &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.richtextblockoverflow.aspx" target="_blank"&gt;RichTextBlockOverflow&lt;/a&gt;&lt;/em&gt;. That overflow is crucial to the framework, because &lt;strong&gt;the biggest problem when printing XAML is&amp;nbsp;pagination&lt;/strong&gt;.&amp;nbsp;On top&amp;nbsp;of the print&amp;nbsp;page there's a&amp;nbsp;RichTextBlock&amp;nbsp;that receives all print content, but it's invisible itself. It lives in a Grid Row with Height 0, so all print content -except a dummy first paragraph- will be sent to the overflows.&lt;/p&gt;
&lt;p&gt;The responsibilities of these core classes in the framework are based on the original printing sample and further elaborated in &lt;a href="http://www.jeffblankenburg.com/2012/11/20/31-days-of-windows-8-day-20-printing" target="_blank"&gt;this excellent article&lt;/a&gt; from&amp;nbsp;the popular&amp;nbsp;&lt;a href="http://31daysofwindows8.com/" target="_blank"&gt;31 days of Windows 8&lt;/a&gt; series.&lt;/p&gt;
&lt;p&gt;The last class in the framework is an &lt;em&gt;EventArgs&lt;/em&gt; class that carries a message to the subscribers of the &lt;em&gt;StatusChanged&lt;/em&gt; event.&lt;/p&gt;
&lt;h2&gt;The Caller&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;Although the framework is reusable, there are some constraints on the caller. Any page in a Store app that wants to be printed should have a printable version of it. Typically a page on paper will look different from its version on screen (starting with size and orientation). The print page only contains a &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.richtextblock.aspx" target="_blank"&gt;RichTextBlock&lt;/a&gt;&lt;/em&gt; with paragraphs. Some of these contain just text, but most of these will host an &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.documents.inlineuicontainer.aspx" target="_blank"&gt;InlineUIContainer&lt;/a&gt;&lt;/em&gt; which can contain anything &amp;ndash; including a databound control. You should prefer a Grid inside the&amp;nbsp;inlines to layout the content, other controls -like StackPanel- will&amp;nbsp;be truncated.&amp;nbsp;This is how a print page looks like:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Page&amp;gt;
    &amp;lt;RichTextBlock&amp;gt;
        &amp;lt;Paragraph&amp;gt;Some Text&amp;lt;/Paragraph&amp;gt;
        &amp;lt;Paragraph /&amp;gt;
        &amp;lt;Paragraph&amp;gt;
            &amp;lt;InlineUIContainer&amp;gt;
                &amp;lt;!-- Any (data bound) Control--&amp;gt;
            &amp;lt;/InlineUIContainer&amp;gt;
        &amp;lt;/Paragraph&amp;gt;
        &amp;lt;!-- ... --&amp;gt;
    &amp;lt;/RichTextBlock&amp;gt;
&amp;lt;/Page&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;Since the &lt;em&gt;PrintServiceProvider&lt;/em&gt; needs to make use of real screen infrastructure to physically measure&amp;nbsp;the elements, we require each printable page to come with an (invisible) Canvas in its visual tree. That canvas should be called &amp;lsquo;printingRoot&amp;rsquo;.&amp;nbsp;Alternatively, the printing framework itself&amp;nbsp;could&amp;nbsp;inject this element into the page. Here&amp;rsquo;s how the &lt;em&gt;PrintingRoot&lt;/em&gt; of the main page in the sample app looks like:&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Grid&amp;gt;
    &amp;lt;Canvas x:Name="printingRoot"
            Opacity="0" /&amp;gt;
    &amp;lt;!-- Real content --&amp;gt;
    &amp;lt;!-- ... --&amp;gt;
&amp;lt;/Grid&amp;gt;&lt;/pre&gt;
&lt;h2&gt;The process&lt;/h2&gt;
&lt;p&gt;When you navigate to a page in an app that supports printing, you call the &lt;em&gt;RegisterForPrinting&lt;/em&gt; method of the &lt;em&gt;PrintServiceProvider&lt;/em&gt;. This can be done in the &lt;em&gt;OnNavigatedTo&lt;/em&gt;, or from a Button (like in the sample). The Visual Studio templates deliberately don&amp;rsquo;t have a &lt;em&gt;PrintAppBarButtonStyle&lt;/em&gt;, and the Segoe Symbol UI font&amp;nbsp;does not come with a print icon. That's because Micrsosoft wants you to use the Device Charm to start printing. I agree with that, but just in case, here&amp;rsquo;s a print button style:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Style x:Key="PrintAppBarButtonStyle"
        TargetType="ButtonBase"
        BasedOn="{StaticResource AppBarButtonStyle}"&amp;gt;
    &amp;lt;Setter Property="AutomationProperties.AutomationId"
            Value="PrintAppBarButton" /&amp;gt;
    &amp;lt;Setter Property="AutomationProperties.Name"
            Value="Print" /&amp;gt;
    &amp;lt;Setter Property="FontFamily"
            Value="Wingdings 2" /&amp;gt;
    &amp;lt;Setter Property="Content"
            Value="x36;" /&amp;gt;
&amp;lt;/Style&amp;gt;&lt;/pre&gt;
&lt;p&gt;I used a button event handler instead of a command binding to the ViewModel.&amp;nbsp;In most apps, printing&amp;nbsp;is a GUI responsibility, so I don't feel&amp;nbsp;guilty about the code behind.&amp;nbsp;When registering, the page should provide a reference to itself (to find the PrintingRoot), and it should provide the type of print page as well as&amp;nbsp;the viewModel or Model that will be bound to the print pages, like this:&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;this.printServiceProvider.RegisterForPrinting(this, typeof(MainPrintPage), this.DataContext);&lt;/pre&gt;
&lt;p&gt;The &lt;em&gt;PrintServiceProvider&lt;/em&gt; first checks the presence of a &lt;em&gt;PrintingRoot&lt;/em&gt;, then prepares the print output, and finally hooks event handlers to the events that will be raised by Windows to create the preview pages and to start printing, as explained in the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh465204.aspx" target="_blank"&gt;Printing Quickstart&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The beef of the code is in the &lt;em&gt;PreparePrintContent&lt;/em&gt; method. Here&amp;rsquo;s a detailed overview of what&amp;rsquo;s happening over there.&lt;br /&gt;First it creates an instance of the print page, and applies the (view-) model to it:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;var printPage = Activator.CreateInstance(this.printPageType) as Page;
printPage.DataContext = this.DataContext;&lt;/pre&gt;
&lt;p&gt;The&amp;nbsp;forst page is created, and an empty paragraph is injected into an invisible RichTextBlock. That makes sure that all &amp;lsquo;real&amp;rsquo; print content will overflow to the RichTextBlockOverflow:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;firstPage = new PrintPage();
firstPage.AddContent(new Paragraph());&lt;/pre&gt;
&lt;p&gt;Then we loop over all paragraphs in the print page. We remove each paragraph, and hook it in the PrintingRoot to be measured. The actual height of the element will be used as &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.documents.block.lineheight.aspx" target="_blank"&gt;LineHeight&lt;/a&gt;&lt;/em&gt; of the paragraph, because that&amp;rsquo;s the property that defines whether or not the element still fits on the current page. Then the paragraph is added to the&amp;nbsp;first page.&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;// Move content from print page to print template - paragraph by paragraph.
var printPageRtb = printPage.Content as RichTextBlock;
while (printPageRtb.Blocks.Count &amp;gt; 0)
{
    var paragraph = printPageRtb.Blocks.First() as Paragraph;
    printPageRtb.Blocks.Remove(paragraph);

    var container = paragraph.Inlines[0] as InlineUIContainer;
    if (container != null)
    {
        // Place the paragraph in a new textblock, and measure it.
        var measureRtb = new RichTextBlock();
        measureRtb.Blocks.Add(paragraph);
        PrintingRoot.Children.Clear();
        PrintingRoot.Children.Add(measureRtb);
        PrintingRoot.InvalidateMeasure();
        PrintingRoot.UpdateLayout();
        measureRtb.Blocks.Remove(paragraph);

        // Apply line height to trigger overflow.
        paragraph.LineHeight = measureRtb.ActualHeight;
    }

    firstPage.AddContent(paragraph);
};&lt;/pre&gt;
&lt;p&gt;&lt;span style="background-color: #ffff99;"&gt;Update&lt;/span&gt;: a Performance Analysis session on a remote Surface RT machine revealed that&amp;nbsp;ARM devices have a big problem with&amp;nbsp;the following line of code in the previous script:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;measureRtb.Blocks.Remove(paragraph);&lt;/pre&gt;
&lt;p&gt;You should replace it by this:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;measureRtb.Blocks.Clear();&lt;/pre&gt;
&lt;p&gt;&lt;span style="background-color: #ffff99;"&gt;End of Update.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When the user opens the print charm -by swiping on the right or by pressing the button- the printers are added to the list of devices in the devices charm. When the user taps on a device, the OS asks the app to generate its print (preview) pages. This is done by the &lt;em&gt;PrintDocument_Paginate&lt;/em&gt; method. It produces output pages by adding these one by one to the collection as long as there&amp;rsquo;s content that overflows to the next page.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;while (lastRTBOOnPage.HasOverflowContent &amp;amp;&amp;amp; lastRTBOOnPage.Visibility == Windows.UI.Xaml.Visibility.Visible)
{
    lastRTBOOnPage = AddOnePrintPreviewPage(lastRTBOOnPage, pageDescription);
}&lt;/pre&gt;
&lt;p&gt;The core logic of the loop is in the &lt;em&gt;AddOnePrintPreview&lt;/em&gt; method. It applies a physical size to the print content by assigning a margin, and then sends it to the &lt;em&gt;PrintingRoot&lt;/em&gt; to be measured. This triggers the overflow mechanism. Elements that don&amp;rsquo;t fit the page, are routed to the next one.&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;// Set paper width
page.Width = printPageDescription.PageSize.Width;
page.Height = printPageDescription.PageSize.Height;

Grid printableArea = (Grid)page.FindName("printableArea");

// Get the margins size
// If the ImageableRect is smaller than the app provided margins use the ImageableRect
double marginWidth = Math.Max(printPageDescription.PageSize.Width - printPageDescription.ImageableRect.Width, printPageDescription.PageSize.Width * HorizontalPrintMargin * 2);
double marginHeight = Math.Max(printPageDescription.PageSize.Height - printPageDescription.ImageableRect.Height, printPageDescription.PageSize.Height * VerticalPrintMargin * 2);

// Set-up "printable area" on the "paper"
printableArea.Width = page.Width - marginWidth;
printableArea.Height = page.Height - marginHeight;

// Add the (newly created) page to the printing root which is part of the visual tree and force it to go
// through layout so that the linked containers correctly distribute the content inside them.            
PrintingRoot.Children.Add(page);
PrintingRoot.InvalidateMeasure();
PrintingRoot.UpdateLayout();

// Find the last text container and see if the content is overflowing
textLink = (RichTextBlockOverflow)page.FindName("continuationPageLinkedContainer");&lt;/pre&gt;
&lt;p&gt;This routine also adds a page number to each page:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;this.pageNumber += 1;
TextBlock pageNumberTextBlock = (TextBlock)page.FindName("pageNumber");
if (pageNumberTextBlock != null)
{
    pageNumberTextBlock.Text = string.Format("- {0} -", this.pageNumber);
}&lt;/pre&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s an example of the framework in action. I created a ListBox bound to a list from the ViewModel. It renders nice, even in a more advanced version with a data template and a converter:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;!-- Databound content with data template and converter --&amp;gt;
&amp;lt;Paragraph&amp;gt;
    &amp;lt;InlineUIContainer&amp;gt;
        &amp;lt;Border BorderBrush="Green"
                BorderThickness="2"
                Margin="0 4"&amp;gt;
            &amp;lt;ListBox ItemsSource="{Binding TrekkieQuotes}"&amp;gt;
                &amp;lt;ListBox.Resources&amp;gt;
                    &amp;lt;local:StringFormatConverter x:Key="sfc" /&amp;gt;
                &amp;lt;/ListBox.Resources&amp;gt;
                &amp;lt;ListBox.ItemTemplate&amp;gt;
                    &amp;lt;DataTemplate&amp;gt;
                        &amp;lt;TextBlock Text="{Binding Converter={StaticResource sfc}, ConverterParameter='* {0}'}"
                                    Margin="0" /&amp;gt;
                    &amp;lt;/DataTemplate&amp;gt;
                &amp;lt;/ListBox.ItemTemplate&amp;gt;
            &amp;lt;/ListBox&amp;gt;
        &amp;lt;/Border&amp;gt;
    &amp;lt;/InlineUIContainer&amp;gt;
&amp;lt;/Paragraph&amp;gt;&lt;/pre&gt;
&lt;p&gt;Here you see at the bottom of the print preview page that the ListBox is overflown to the next one, and the resulting XPS document:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f1%2fprint_preview2.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f1%2fprint_preview3.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f1%2fprint_page.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;h2&gt;&amp;nbsp;Strange new worlds, still to explore&lt;/h2&gt;
&lt;p&gt;I know that there are still a couple of issues with this code. If a single inline element is higher than the printed page, then it&amp;rsquo;s not rendered and you end up with an empty page.&amp;nbsp;A future version of the PrintServiceProvider should e.g. wrap it in a&amp;nbsp;Grid.&amp;nbsp;In the current version, the measurement is&amp;nbsp;done very early in the workflow: when registering. So when the user, before he prints, changes a bound value that has an impact on the height of the element, then the new height is probably ignored. I've written the code this way, because calls to the &lt;em&gt;PreparePrintContent&lt;/em&gt; in the event handlers (e.g. during pagination)&amp;nbsp;were causing&amp;nbsp;cross-threading issues (probably caused by the fact that the print service provider is actually a &lt;em&gt;DependencyObject&lt;/em&gt; since it inherits from &lt;em&gt;Page&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;The current version however seems to cover all printing needs for the Store apps I&amp;rsquo;m currently working on.&amp;nbsp;That's good enough. After all, I just lost two weeks to do something that I expected to deliver in two hours. Anyway, I promise to update the code here whenever I have a new version.&lt;/p&gt;
&lt;h2&gt;Code&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the code, it was written with Visual Studio 2012 Express (well, except for the class diagram): &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2013%2f2%2fU2UConsult.Win8.PrintingSample.v2.zip"&gt;U2UConsult.Win8.PrintingSample.v2.zip (170.55 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy and ... live long and prosper,&lt;br /&gt;&lt;a href="http://twitter.com/diederikkrols" target="_blank"&gt;Diederik&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Sun, 20 Jan 2013 20:39:00 -1200</pubDate><comments>http://blogs.u2u.be/diederik/post/2013/01/20/Printing-from-MVVM-XAML-Windows-8-Store-apps.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=869a4fe1-88b4-4eb2-ba55-816c5896c450</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">11</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/diederik/trackback.axd?id=869a4fe1-88b4-4eb2-ba55-816c5896c450</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2013/01/20/Printing-from-MVVM-XAML-Windows-8-Store-apps.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=869a4fe1-88b4-4eb2-ba55-816c5896c450</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=2dc761df-c206-4e80-99ca-8cd4fda58abe</guid><link>http://blogs.u2u.be/diederik/post/2013/01/08/Using-Dynamic-XAML-in-Windows-8-Store-Apps.aspx</link><category>WinRT</category><title>Using Dynamic XAML in Windows 8 Store Apps</title><description>&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;This article describes a couple of techniques that you can apply to dynamically change the look-and-feel of data-bound XAML controls in a Windows 8 Store App. You&amp;rsquo;ll be introduced to value converters, style selectors, template selectors, and the XamlReader class. I created a light-weight MVVM app that displays a list of beers. Although all items belong to the same class &amp;ndash;Beer- they will be displayed differently. Here&amp;rsquo;s how the sample app looks like:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2013%2f1%2fStoreAppDynamicXaml.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Using a Value Converter&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Dependency properties of a XAML control can be directly bound to properties of the ViewModel. Sometimes a conversion of value and/or data type needs to take place; and that&amp;rsquo;s exactly what a ValueConverter does. A value converter is a class that implements the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.data.ivalueconverter.aspx" target="_blank"&gt;IValueConverter&lt;/a&gt; interface, with just &lt;em&gt;Convert&lt;/em&gt; and &lt;em&gt;ConvertBack&lt;/em&gt; functions. Here's an example of a string-to-string converter that translates official beer colors into HTML named colors (the &lt;a href="http://apps.microsoft.com/windows/en-US/app/beer-color-meter/6fc147c0-bc97-4b30-a136-ef86aea8de52" target="_blank"&gt;Beer Color Meter&lt;/a&gt; app in the Windows Store has a much more advanced version of this):&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public class BeerColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        switch (value.ToString())
        {
            case "Yellow":
                return "LemonChiffon";
            case "Straw":
                return "Wheat";
            case "Gold":
                return "GoldenRod";
            case "Amber":
            case "LightCopper":
            case "Copper":
                return "Peru";
            case "LightBrown":
                return "Chocolate";
            case "Brown":
                return "Brown";
            case "DarkBrown":
                return "darkRed";
            case "VeryDarkBrown":
                return "SaddleBrown";
            case "Black":
                return "Black";
            default:
                return "Lime";
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return value;
    }
}&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&amp;nbsp;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Just define an instance of the converter as a resource:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Page.Resources&amp;gt;
    &amp;lt;local:BeerColorConverter x:Key="BeerColorConverter" /&amp;gt;
&amp;lt;/Page.Resources&amp;gt;&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&amp;nbsp;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;And use it in the Binding:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;DataTemplate&amp;gt;
    &amp;lt;TextBlock Foreground="{Binding Color, Converter={StaticResource BeerColorConverter}}"
                FontWeight="SemiBold"
                Margin="2"&amp;gt;
            &amp;lt;Run Text="{Binding Name}" /&amp;gt;
            &amp;lt;Run Text=" is "
                    Foreground="Silver"
                    FontWeight="Normal" /&amp;gt;
            &amp;lt;Run Text="{Binding Category}"
                    Foreground="Silver"
                    FontWeight="Normal" /&amp;gt;
    &amp;lt;/TextBlock&amp;gt;
&amp;lt;/DataTemplate&amp;gt;&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&amp;nbsp;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Unfortunately the Store App Runtime doesn't ship with &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.multibinding.aspx" target="_blank"&gt;MultiBinding&lt;/a&gt;, and bindings don't come with a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.bindingbase.stringformat.aspx" target="_blank"&gt;StringFormat option&lt;/a&gt;. That restricts the usage of a value converter, at least when compared to WPF. When populating a TextBlock, you can avoid some of these restrictions by cutting it up in individual &lt;a href="http://msdn.microsoft.com/en-US/library/windows/apps/windows.ui.xaml.documents.run" target="_blank"&gt;Run&lt;/a&gt; elements.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Using a Style Selector&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;One way of dynamically styling items in a XAML items control, is with a &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.styleselector.aspx" target="_blank"&gt;StyleSelector&lt;/a&gt;. This allows you to apply a style for each item in a collection, based on custom logic. This seems to be the only way to create a dynamic style in Metro, due to the absence of &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.datatrigger.aspx" target="_blank"&gt;DataTriggers&lt;/a&gt;. All you need to do is create a subclass of the StyleSelector class and implement the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.styleselector.selectstylecore.aspx" target="_blank"&gt;SelectStyleCore&lt;/a&gt; method. The bound item is the first parameter, the item's style is the return value. Here's a small example on how to modify the style for a list view item. Belgian beers (category name contains &amp;lsquo;Belgian&amp;rsquo; or &amp;lsquo;Flemish&amp;rsquo;) will be decorated with a golden border:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public class BeerStyleSelector : StyleSelector
{
    protected override Style SelectStyleCore(object item, DependencyObject container)
    {
        Beer beer = item as Beer;

        // Default Style
        if (!(beer.Category.Contains("Belgian") || beer.Category.Contains("Flemish")))
        {
            return null;
        }

        // Custom Style
        Style style = new Style(typeof(ListViewItem));
        style.Setters.Add(new Setter(ListViewItem.BorderBrushProperty, new SolidColorBrush(Colors.Gold)));
        style.Setters.Add(new Setter(ListViewItem.BorderThicknessProperty, new Thickness(2.0)));
        return style;
    }
}&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&amp;nbsp;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Again, the class containing the logic should be defined as a resource:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Page.Resources&amp;gt;
    &amp;lt;DataTemplate x:Key="DefaultDataTemplate"&amp;gt;
        &amp;lt;StackPanel Background="DimGray"
                    Height="160"
                    Width="160"
                    Margin="4"&amp;gt;
            &amp;lt;TextBlock Text="{Binding Name}"
                        Foreground="{Binding Color, Converter={StaticResource BeerColorConverter}}"
                        FontWeight="SemiBold"
                        FontSize="18"
                        HorizontalAlignment="Center"
                        Margin="4" /&amp;gt;
            &amp;lt;TextBlock Text="{Binding Category}"
                        Foreground="Silver"
                        FontSize="18"
                        HorizontalAlignment="Center"
                        TextAlignment="Center"
                        TextWrapping="Wrap"
                        Margin="2" /&amp;gt;
        &amp;lt;/StackPanel&amp;gt;
    &amp;lt;/DataTemplate&amp;gt;
    &amp;lt;local:BeerStyleSelector x:Key="BeerStyleSelector" /&amp;gt;
&amp;lt;/Page.Resources&amp;gt;&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&amp;nbsp;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;You can then assign the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.itemscontrol.itemcontainerstyleselector.aspx" target="_blank"&gt;ItemContainerStyleSelector&lt;/a&gt; to an instance of it:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ListView ItemsSource="{Binding BelgianBeers}"
            ItemContainerStyleSelector="{StaticResource BeerStyleSelector}"&amp;gt;
    &amp;lt;!-- ... --&amp;gt;
&amp;lt;/ListView&amp;gt;&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&amp;nbsp;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;When using a Style Selector, you&amp;rsquo;re restricted to modifying Dependency Properties.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Using a Data Template Selector&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;With a DataTemplate you can assign a look-and-feel to an item based on its type. Sometimes that&amp;rsquo;s just not good enough. Using a &lt;a href="http://msdn.microsoft.com/library/windows/apps/windows.ui.xaml.controls.datatemplateselector" target="_blank"&gt;DataTemplateSelector&lt;/a&gt; you can choose or generate a DataTemplate based on the entire data object and its container &amp;ndash; not just on its type. To create a template selector, create a class that inherits from DataTemplateSelector and override the &lt;a href="http://msdn.microsoft.com/en-US/library/windows/apps/windows.ui.xaml.controls.datatemplateselector.selecttemplatecore" target="_blank"&gt;SelectTemplateCore&lt;/a&gt; method. Once your class is defined you can assign an instance of the class to the template selector property of your element.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;The business logic could be as simple a selecting an existing template from a resource, like &lt;em&gt;this.DefaultTemplate&lt;/em&gt; in the following code snippet. But the entire template could also be generated on the spot through a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.markup.xamlreader.aspx" target="_blank"&gt;XamlReader&lt;/a&gt;. This class allows you create a XAML element by concatenating it into a string; in many cases that&amp;rsquo;s a lot more convenient than talking to the object model in C#. The following code creates a colored stackpanel including a Belgian flag for the Belgian beers, and applies the default template to the rest. It also shows how to use a value converter programmatically:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public class BeerTemplateSelector : DataTemplateSelector
{
    public DataTemplate DefaultTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        Beer beer = item as Beer;

        // Default Template
        if (!(beer.Category.Contains("Belgian") || beer.Category.Contains("Flemish")))
        {
            return this.DefaultTemplate;
        }

        // Custom Template
        BeerColorConverter converter = new BeerColorConverter();
        string backGroundColor = converter.Convert((item as Beer).Color, null, null, null).ToString();

        string template = @"
            &amp;lt;DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'&amp;gt;
                &amp;lt;Grid Background='" + backGroundColor + @"' Width='160' Height='160' Margin='4'&amp;gt;
                    &amp;lt;StackPanel&amp;gt;        
                        &amp;lt;TextBlock Text='{Binding Name}' FontWeight='SemiBold' FontSize='18' Margin='4' Foreground='White' HorizontalAlignment='Center' /&amp;gt;
                        &amp;lt;TextBlock Text='{Binding Category}' Margin='2' FontSize='18' Foreground='White' HorizontalAlignment='Center' /&amp;gt;
                    &amp;lt;/StackPanel&amp;gt;
                        &amp;lt;Image Source='../Assets/belgianFlag.png' Margin='4' HorizontalAlignment='Right' Stretch='None' VerticalAlignment='Bottom' /&amp;gt;
                &amp;lt;/Grid&amp;gt;
            &amp;lt;/DataTemplate&amp;gt;";
        return XamlReader.Load(template) as DataTemplate;
    }
}&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&amp;nbsp;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Again, register the class containing the logic as a resource:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Page.Resources&amp;gt;
    &amp;lt;local:BeerTemplateSelector x:Key="BeerTemplateSelector"
                                DefaultTemplate="{StaticResource DefaultDataTemplate}" /&amp;gt;
&amp;lt;/Page.Resources&amp;gt;&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&amp;nbsp;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Then use an instance as &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.itemscontrol.itemtemplateselector.aspx" target="_blank"&gt;ItemTemplateSelector&lt;/a&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ItemsControl ItemsSource="{Binding BelgianBeers}"
                ItemTemplateSelector="{StaticResource BeerTemplateSelector}"&amp;gt;
    &amp;lt;!-- ... --&amp;gt;
&amp;lt;/ItemsControl&amp;gt;&lt;/pre&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Source Code&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Here&amp;rsquo;s the sample project, it was written with Visual Studio 2012 Express Edition: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2013%2f1%2fU2UConsult.Win8.DynamicXaml.zip"&gt;U2UConsult.Win8.DynamicXaml.zip (89.56 kb)&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language: EN-US;" lang="EN-US"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Enjoy!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0cm 0cm 10pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;a href="http://www.twitter.com/diederikkrols" target="_blank"&gt;Diederik&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Tue, 08 Jan 2013 01:47:00 -1200</pubDate><comments>http://blogs.u2u.be/diederik/post/2013/01/08/Using-Dynamic-XAML-in-Windows-8-Store-Apps.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=2dc761df-c206-4e80-99ca-8cd4fda58abe</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=2dc761df-c206-4e80-99ca-8cd4fda58abe</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2013/01/08/Using-Dynamic-XAML-in-Windows-8-Store-Apps.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=2dc761df-c206-4e80-99ca-8cd4fda58abe</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=a4b019d1-3feb-4da2-885a-76108eae0008</guid><link>http://blogs.u2u.be/diederik/post/2012/12/06/Building-Custom-Controls-for-Windows-8-Store-apps.aspx</link><category>Metro</category><category>WinRT</category><title>Building Custom Controls for Windows 8 Store apps</title><description>&lt;p&gt;This article explains how to build custom controls for Windows Store apps, using XAML and C#. Custom controls are the most powerful controls in the XAML department. Once you know how to design and build these, you&amp;rsquo;ll have no problems with their alternatives: user controls, derived controls, and extended controls. Let&amp;rsquo;s start with a definition: a custom control is a reusable templatable control that comes with a generic.xaml file and some code behind. Generally a custom control is stored in its own assembly to make it reusable in multiple apps. As a developer, you decorate a custom control with properties, methods, events, and a default style. The users of the control &amp;ndash;developers who use your custom control in their apps- should live with the code behind, but are free to completely restyle the XAML part.&lt;/p&gt;
&lt;h2&gt;Hello again, Simple Slider&lt;/h2&gt;
&lt;p&gt;Almost a year ago, I built a &lt;a href="http://blogs.u2u.be/diederik/post/2012/01/21/Building-C-custom-controls-in-WinRT-Metro.aspx" target="_blank"&gt;custom slider control&lt;/a&gt; in an earlier version of Visual Studio and the Windows Runtime. A lot has changed since then &amp;ndash; fortunately for the better. For this article, I decided to redo that slider. I&amp;rsquo;ll stick to its original anatomy: a horizontal slider is just a draggable Thumb in a Border.&amp;nbsp; While dragging, a Rectangle is drawn to fill the space at the left side of the Thumb:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f12%2fcustomcontrols0.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;Recent versions of Visual Studio 2012 &amp;ndash;including the free Express edition- come with a template to create a custom control. All you need to do to get started is adding a new item of the type &amp;lsquo;Templated Control&amp;rsquo; to your project:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f12%2fcustomcontrolsVS.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;It will create the code behind file as well as the generic.xaml in the Templates folder.&lt;/p&gt;
&lt;h2&gt;Properties&lt;/h2&gt;
&lt;p&gt;A custom control directly inherits from &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.control.aspx" target="_blank"&gt;Control&lt;/a&gt; itself, the mother of all controls. It immediately comes with a couple of useful properties like Height, Width, and Visibility. Of course you would want to add your own properties. A slider control e.g. should have at least properties to represent its minimum, maximum and current value. Since we&amp;rsquo;re interested in data binding, we will implement these as &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh700353.aspx" target="_blank"&gt;DependencyProperty&lt;/a&gt; instances. Using the &lt;em&gt;propdp&lt;/em&gt; code snippet, you can rapidly define a property and provide its name, type, default value, and the function that will be called when the value changes. In the case of our slider, we are definitely interested in knowing when the value changed: it&amp;rsquo;s the sign to redraw the control. Here&amp;rsquo;s how the definition of the Value property looks like:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
    "Value", typeof(double), typeof(Slider), new PropertyMetadata(0.0, OnValueChanged));

public double Value
{
    get { return (double)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

private static void OnValueChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
    // Recalculate part sizes.
    // ...
}&lt;/pre&gt;
&lt;h2&gt;Styling&lt;/h2&gt;
&lt;p&gt;The generic.xaml file will contain the default style for the control. While typing in that code, you have intellisense but no designer support. Here&amp;rsquo;s how the basic slider style looks like in XAML.&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Style TargetType="local:Slider"&amp;gt;
    &amp;lt;Setter Property="Template"&amp;gt;
        &amp;lt;Setter.Value&amp;gt;
            &amp;lt;ControlTemplate TargetType="local:Slider"&amp;gt;
                &amp;lt;Grid&amp;gt;
                    &amp;lt;Border Height="40"
                            VerticalAlignment="Stretch"
                            Background="Gray"
                            Margin="0"
                            Padding="0"
                            BorderThickness="0" /&amp;gt;
                    &amp;lt;Canvas Margin="0"
                            Height="40"&amp;gt;
                        &amp;lt;Rectangle x:Name="PART_Rectangle"
                                    Height="38"
                                    Fill="SlateBlue"
                                    Margin="0 1" /&amp;gt;
                        &amp;lt;Thumb x:Name="PART_Thumb"
                                Background="LightSteelBlue"
                                Width="40"
                                Height="40"
                                Margin="0" /&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;The default style is assigned to the control in its constructor:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public Slider()
{
    this.DefaultStyleKey = typeof(Slider);
}&lt;/pre&gt;
&lt;p&gt;This is a screenshot of the custom slider:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f12%2fcustomcontrols1.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;In the style definition, the Thumb and Rectangle controls were given an x:Name value. This is because we need to manipulate them when (re)drawing the slider from code behind. That puts some constraints on the &amp;lsquo;templatability&amp;rsquo; of the custom control: no matter how the designer wants to make the control look like, he or she needs to make sure that the template contains a Thumb and a Rectangle with the expected name. Fortunately you have some ways to notify these constraints to the designer. First there is a naming convention that specifies that the element&amp;rsquo;s name should start with &amp;lsquo;PART_&amp;rsquo;. More important is the fact that you can decorate the class with &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.templatepartattribute.aspx" target="_blank"&gt;TemplatePart&lt;/a&gt; attributes. These will be recognized by tools like Expression Blend. Here&amp;rsquo;s the definition in C#:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;[TemplatePart(Name = ThumbPartName, Type = typeof(Thumb))]
[TemplatePart(Name = RectanglePartName, Type = typeof(Rectangle))]
public sealed class Slider : Control
{    
    private const string ThumbPartName = "PART_Thumb";
    private const string RectanglePartName = "PART_Rectangle";
        
    // ...
}&lt;/pre&gt;
&lt;p&gt;You find the named parts with the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.control.gettemplatechild.aspx" target="_blank"&gt;GetTemplateChild&lt;/a&gt; method. When using your control, a designer could have ignored the expected parts, so make sure you look them up defensively:&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;protected override void OnApplyTemplate()
{
    this.thumb = this.GetTemplateChild(ThumbPartName) as Thumb;
    if (this.thumb != null)
    {
        this.thumb.DragDelta += this.Thumb_DragDelta;
    }

    // ...

    base.OnApplyTemplate();
}&lt;/pre&gt;
&lt;p&gt;This code is typically written in an override of the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.frameworkelement.onapplytemplate.aspx" target="_blank"&gt;OnApplyTemplate&lt;/a&gt; method. Don&amp;rsquo;t use the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.frameworkelement.loaded.aspx" target="_blank"&gt;Loaded&lt;/a&gt; event. The visual tree of a templated control might be still incomplete at that stage.&lt;/p&gt;
&lt;h2&gt;Visual State Management&lt;/h2&gt;
&lt;p&gt;Depending on its state (enabled, disabled, focused, snapped, etc.) a control will look and feel slightly or drastically different. This is where the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.visualstatemanager.aspx" target="_blank"&gt;VisualStateManager&lt;/a&gt; comes in action. The visual state manager invokes transformations when the state of the control changes. E.g. if the control is disabled, it will recolor it in fifty shades of gray. The states and transformations can be described declaratively in XAML:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;VisualStateManager.VisualStateGroups&amp;gt;
    &amp;lt;VisualStateGroup x:Name="CommonStates"&amp;gt;
        &amp;lt;VisualState x:Name="Normal"&amp;gt;
            &amp;lt;Storyboard&amp;gt;
                &amp;lt;ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Thumb"
                                                Storyboard.TargetProperty="Background"&amp;gt;
                    &amp;lt;DiscreteObjectKeyFrame KeyTime="0"
                                            Value="LightSteelBlue" /&amp;gt;
                &amp;lt;/ObjectAnimationUsingKeyFrames&amp;gt;
                &amp;lt;ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Rectangle"
                                                Storyboard.TargetProperty="Fill"&amp;gt;
                    &amp;lt;DiscreteObjectKeyFrame KeyTime="0"
                                            Value="SlateBlue" /&amp;gt;
                &amp;lt;/ObjectAnimationUsingKeyFrames&amp;gt;
            &amp;lt;/Storyboard&amp;gt;
        &amp;lt;/VisualState&amp;gt;
        &amp;lt;VisualState x:Name="Disabled"&amp;gt;
            &amp;lt;Storyboard&amp;gt;
                &amp;lt;ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Thumb"
                                                Storyboard.TargetProperty="Background"&amp;gt;
                    &amp;lt;DiscreteObjectKeyFrame KeyTime="0"
                                            Value="LightGray" /&amp;gt;
                &amp;lt;/ObjectAnimationUsingKeyFrames&amp;gt;
                &amp;lt;ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Rectangle"
                                                Storyboard.TargetProperty="Fill"&amp;gt;
                    &amp;lt;DiscreteObjectKeyFrame KeyTime="0"
                                            Value="DimGray" /&amp;gt;
                &amp;lt;/ObjectAnimationUsingKeyFrames&amp;gt;
            &amp;lt;/Storyboard&amp;gt;
        &amp;lt;/VisualState&amp;gt;
    &amp;lt;/VisualStateGroup&amp;gt;
&amp;lt;/VisualStateManager.VisualStateGroups&amp;gt;&lt;/pre&gt;
&lt;p&gt;When the control is used inside a LayoutAwarePage, then it will listen automagically to state changes. But we can&amp;rsquo;t make assumptions on how and where our control is going to be used. Fortunately, in code behind it is possible to trigger the visual state manager programmatically. Here&amp;rsquo;s an example where we disable the control from C#:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;private void Slider_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if (this.IsEnabled)
    {
        VisualStateManager.GoToState(this, "Normal", true);
    }
    else
    {
        VisualStateManager.GoToState(this, "Disabled", true);
    };
}&lt;/pre&gt;
&lt;p&gt;Here's the result when the app is running:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f12%2fcustomcontrols2.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;Again, this puts some constraints on the templatability of the control: the designer has to make sure that the visual states that we invoke programmatically exist in the overridden style. Again we as developer can document these constraints by decorating the class with &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.templatevisualstateattribute.aspx" target="_blank"&gt;TemplateVisualState&lt;/a&gt; attributes:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;[TemplateVisualState(Name = "Normal", GroupName = "CommonStates")]
[TemplateVisualState(Name = "Disabled", GroupName = "CommonStates")]
public sealed class Slider : Control
{ 
   // ...
}&lt;/pre&gt;
&lt;h2&gt;Templating&lt;/h2&gt;
&lt;p&gt;The style in the generic.xaml is just a default style. It can be completely overridden, as long as the TemplatePart and VisualState constraints are respected. Here&amp;rsquo;s an example of how to give the default slider a brand new jacket:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;cc:Slider&amp;gt;
    &amp;lt;cc:Slider.Template&amp;gt;
        &amp;lt;ControlTemplate TargetType="cc:Slider"&amp;gt;
            &amp;lt;Grid&amp;gt;
                &amp;lt;Border Height="80"
                        VerticalAlignment="Stretch"
                        Background="Transparent" /&amp;gt;
                &amp;lt;Line VerticalAlignment="Center"
                        X1="0"
                        Y1="0"
                        X2="3000"
                        Y2="0"
                        StrokeThickness="7"
                        Stroke="White"
                        StrokeDashArray="1" /&amp;gt;
                &amp;lt;Canvas Margin="0"
                        Height="80"&amp;gt;
                    &amp;lt;Rectangle x:Name="PART_Rectangle"
                                Height="12"
                                Canvas.Top="34"
                                Fill="DarkSlateBlue" /&amp;gt;
                    &amp;lt;Thumb x:Name="PART_Thumb"
                            Width="80"
                            Height="80"&amp;gt;
                        &amp;lt;Thumb.Template&amp;gt;
                            &amp;lt;ControlTemplate&amp;gt;
                                &amp;lt;Image Source="Assets/Pacman.png"
                                        Height="80" /&amp;gt;
                            &amp;lt;/ControlTemplate&amp;gt;
                        &amp;lt;/Thumb.Template&amp;gt;
                    &amp;lt;/Thumb&amp;gt;
                &amp;lt;/Canvas&amp;gt;
            &amp;lt;/Grid&amp;gt;
        &amp;lt;/ControlTemplate&amp;gt;
    &amp;lt;/cc:Slider.Template&amp;gt;
&amp;lt;/cc:Slider&amp;gt;&lt;/pre&gt;
&lt;p&gt;Here&amp;rsquo;s how it looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f12%2fcustomcontrols4.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;h2&gt;Events&lt;/h2&gt;
&lt;p&gt;To add an event to your control, just declare it and raise it at the appropriate time. I have decorated the slider with an event &amp;lsquo;BoundHit&amp;rsquo; that is raised when the value hits minimum or maximum:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public event EventHandler BoundHit;

private void OnBoundHit(EventArgs e)
{
    if (this.BoundHit != null)
    {
        this.BoundHit(this, e);
    }
}

private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
{
    // ...
    this.OnBoundHit(EventArgs.Empty);
    // ...
}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;The page that hosts the slider can now react to it:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;cc:Slider BoundHit="ccSlider_BoundHit" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;This is what it does in the attached sample project:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f12%2fcustomcontrols3.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;Admit it: you never saw a slider do this ;-)&lt;/p&gt;
&lt;h2&gt;From Slider to Gauge&lt;/h2&gt;
&lt;p&gt;This is basically all you need to know to roll your own custom controls. If you don&amp;rsquo;t believe me, feel free to dive into the attached source code of the following Radial Gauge control. It&amp;rsquo;s a new version of a control I built some months ago: you find its story &lt;a href="http://blogs.u2u.be/diederik/post/2012/03/08/A-Radial-Gauge-custom-control-for-Windows-8-Metro.aspx" target="_blank"&gt;here&lt;/a&gt;. Since then the .NET framework improved and so did my code. Now the radial gauge may be a bit more complex than the slider: there are some animations and converters involved. But apart from that, it only contains stuff we covered in this article: a default style in generic.xaml, an override of OnApplyTemplate, and a TemplatePart - no visual states. Functionally all that a radial gauge does is rotating a needle when its value changes. That basically makes it a templated &amp;hellip; slider. Anyway if you&amp;rsquo;re looking for a basic radial gauge with a color scale, here you have one:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f12%2fcustomcontrols5.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;h2&gt;Alternatives&lt;/h2&gt;
&lt;h3&gt;User Controls&lt;/h3&gt;
&lt;p&gt;Custom controls are the most powerful controls to build, although not always the most developer-friendly: you don&amp;rsquo;t have support from Visual Studio&amp;rsquo;s designer when defining the style. Fortunately this is not the case with User Controls. For more details, check my &lt;a href="http://blogs.u2u.be/diederik/post/2012/11/07/Building-User-Controls-for-Windows-8-Store-apps.aspx" target="_blank"&gt;previous blog item&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Derived Controls&lt;/h3&gt;
&lt;p&gt;Another alternative is to create a Derived Control, by creating a subclass of an existing control. You can then add properties, methods, and events at will, or override some of its methods. You find examples of derived controls in the &lt;a href="https://github.com/timheuer/callisto" target="_blank"&gt;Callisto&lt;/a&gt; framework. Among other useful controls, that framework&amp;nbsp; contains the &lt;a href="https://github.com/timheuer/callisto/blob/master/src/Callisto/Controls/DynamicTextBlock/DynamicTextBlock.cs" target="_blank"&gt;DynamicTextBlock&lt;/a&gt; control, a textblock that does trimming at word boundary. It inherits from ContentControl:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public class DynamicTextBlock : ContentControl
{
    // ...
}&lt;/pre&gt;
&lt;p&gt;Another example of a derived control can be found in the &lt;a href="http://winrtxamltoolkit.codeplex.com/" target="_blank"&gt;WinRT XAML Toolkit&lt;/a&gt;: the &lt;a href="http://winrtxamltoolkit.codeplex.com/SourceControl/changeset/view/fe0226ad68bb#WinRTXamlToolkit%2fControls%2fWatermarkTextBox.cs" target="_blank"&gt;WatermarkTextBox&lt;/a&gt; inherits from the native TextBox, and adds a watermark.&lt;/p&gt;
&lt;h3&gt;Extended Controls&lt;/h3&gt;
&lt;p&gt;Using Attached Properties, you can add extra properties to existing instances, e.g. of controls. This allows you to create new controls without defining control subclasses. Again Callisto as well as WinRt XAML Toolkit have examples of such extensions. You&amp;rsquo;ll remember the &lt;a href="http://winrtxamltoolkit.codeplex.com/SourceControl/changeset/view/fe0226ad68bb#WinRTXamlToolkit%2fControls%2fExtensions%2fTextBoxValidationExtensions.cs" target="_blank"&gt;TextBoxValidationExtensions&lt;/a&gt; from my &lt;a href="http://blogs.u2u.be/diederik/post/2012/10/09/Input-Validation-in-Windows-8-Store-apps.aspx" target="_blank"&gt;blog post on input validation&lt;/a&gt;. These extensions allow you to add validation logic to a native textbox:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;TextBox ext:TextBoxValidationExtensions.Format="NonEmptyNumeric"
            ext:TextBoxValidationExtensions.InvalidBrush="Salmon" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;You can take the concept of attached properties one step further to create a Behavior, like the &amp;lsquo;select-all-on-focus&amp;rsquo; from &lt;a href="http://blogs.u2u.be/diederik/post/2012/10/28/Using-Behaviors-in-Windows-8-Store-Apps.aspx" target="_blank"&gt;another previous blog post&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;TextBox Text="Eh~ Sexy lady. Op op op op oppan Gangnam Style."&amp;gt;
    &amp;lt;WinRtBehaviors:Interaction.Behaviors&amp;gt;
        &amp;lt;local:SelectAllOnFocusBehavior SelectAllOnFocus="True" /&amp;gt;
    &amp;lt;/WinRtBehaviors:Interaction.Behaviors&amp;gt;
&amp;lt;/TextBox&amp;gt;&lt;/pre&gt;
&lt;p&gt;The attached solution contains the source code for all mentioned alternative controls. Here&amp;rsquo;s how the corresponding sample page looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f12%2fcustomcontrols6.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;h2&gt;Code Code Code&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the full source code of all the featured controls in this article (o, and a free forward-button style). It was written in Visual Studio 2012 Ultimate, without SP1: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2012%2f12%2fU2UConsult.CustomControls.Sample.zip"&gt;U2UConsult.CustomControls.Sample.zip (256.78 kb)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://twitter.com/diederikkrols" target="_blank"&gt;Diederik&lt;/a&gt;&lt;/p&gt;</description><pubDate>Thu, 06 Dec 2012 06:51:00 -1200</pubDate><comments>http://blogs.u2u.be/diederik/post/2012/12/06/Building-Custom-Controls-for-Windows-8-Store-apps.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=a4b019d1-3feb-4da2-885a-76108eae0008</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=a4b019d1-3feb-4da2-885a-76108eae0008</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2012/12/06/Building-Custom-Controls-for-Windows-8-Store-apps.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=a4b019d1-3feb-4da2-885a-76108eae0008</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/diederik/post.aspx?id=b07dd509-4ce5-4ab4-8c09-7ffbfa610d1b</guid><link>http://blogs.u2u.be/diederik/post/2012/11/07/Building-User-Controls-for-Windows-8-Store-apps.aspx</link><category>Metro</category><category>WinRT</category><title>Building User Controls for Windows 8 Store apps</title><description>&lt;p&gt;This article describes how to build user controls for XAML-based Windows 8 Store apps. User controls &amp;ndash;or composite controls-&amp;nbsp;are the easiest controls that you can roll yourself, since&amp;nbsp;they're defined in plain XAML and&amp;nbsp;come with design-time support in Visual Studio. Basically&amp;nbsp;a user control is&amp;nbsp;just a XAML panel on which you drag and drop a group of controls that belong together. You create a user control only if you want to reuse that XAML panel in multiple places in your app. If you want to reuse the group of controls in more than one app, then you store the user control in a separate library. Typical examples of user controls are a media player button bar (with &lt;em&gt;play&lt;/em&gt;, &lt;em&gt;pause&lt;/em&gt; and &lt;em&gt;stop&lt;/em&gt; buttons), a paging control (with &lt;em&gt;next&lt;/em&gt;, &lt;em&gt;previous&lt;/em&gt;, &lt;em&gt;goto&lt;/em&gt; buttons etc.) and an address panel (with labels, textboxes, and comboboxes for &lt;em&gt;street&lt;/em&gt;, &lt;em&gt;number&lt;/em&gt;, &lt;em&gt;zip code&lt;/em&gt;, &lt;em&gt;city&lt;/em&gt;, &lt;em&gt;country&lt;/em&gt;, and so on).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;The sample control for this article&amp;nbsp;will be a&amp;nbsp;new version of my&amp;nbsp;&lt;a href="http://blogs.u2u.be/diederik/post/2012/09/26/Enhancing-the-Win8-Slider-experience.aspx" target="_blank"&gt;EnhancedSlider&lt;/a&gt;. It's&amp;nbsp;a plain vanilla slider that is&amp;nbsp;surrounded with some extra textblocks. The slider comes with support for direct input through a textbox that is&amp;nbsp;enabled by a button. I've been using that group of controls&amp;nbsp;quite often lately, so I decided to package it as a reusable user control. Here's how the original looks like, it started as&amp;nbsp;a non-reusable bunch of controls on the main page of an app:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f11%2fUserControl_OriginalSlider.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how to roll your own user control.&lt;/p&gt;
&lt;p&gt;In a Windows Store app project &amp;ndash;or a separate library- add an item of the type &amp;lsquo;User Control&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f11%2fAddUserControl.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Visual Studio will create a class for you. It inherits from &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.usercontrol.aspx" target="_blank"&gt;UserControl&lt;/a&gt;&amp;nbsp;and comes with a XAML file and an associated&amp;nbsp;code behind file. You can drag and drop individual controls into the XAML design surface. Here's how the simplified XAML for the enhanced slider looks like:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;UserControl x:Class="U2UConsult_UserControls.EnhancedSlider"&amp;gt;
    &amp;lt;Grid&amp;gt;
        &amp;lt;TextBlock HorizontalAlignment="Left" /&amp;gt;
        &amp;lt;StackPanel HorizontalAlignment="Right"&amp;gt;
            &amp;lt;Button Style="{StaticResource EditRoundButtonStyle}" /&amp;gt;
            &amp;lt;TextBox /&amp;gt;
            &amp;lt;TextBlock /&amp;gt;
        &amp;lt;/StackPanel&amp;gt;
        &amp;lt;Slider Grid.Row="1" /&amp;gt;
        &amp;lt;TextBlock HorizontalAlignment="Left" Grid.Row="2" /&amp;gt;
        &amp;lt;TextBlock HorizontalAlignment="Right" Grid.Row="2" /&amp;gt;
    &amp;lt;/Grid&amp;gt;
&amp;lt;/UserControl&amp;gt;&lt;/pre&gt;
&lt;p&gt;With a little luck the Visual Studio Designer will support you, but don't expect too much from it. In many cases you'll end up with a blank surface - but at least you have IntelliSense in the XAML and an operational&amp;nbsp;properties editor:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f11%2fUserControl_Design1.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;Your next step is to&amp;nbsp;connect&amp;nbsp;control properties&amp;nbsp;through bindings. Use the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.data.binding.elementname.aspx" target="_blank"&gt;ElementName&lt;/a&gt; property to define the source of the binding. In the EnhancedSlider, I hooked&amp;nbsp;the &lt;em&gt;Text&lt;/em&gt; property of the surrounding&amp;nbsp;text controls to the corresponding&amp;nbsp;properties of the&amp;nbsp;central slider:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Slider x:Name="slider" /&amp;gt;
&amp;lt;TextBlock Text="{Binding Minimum, ElementName=slider}"  /&amp;gt;
&amp;lt;TextBlock Text="{Binding Maximum, ElementName=slider}" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;The XAML is ready. Time to focus on the code behind. We embrace encapsulation, so your user control should behave as a black box to&amp;nbsp;its hosting page or control.&amp;nbsp;That page shouldn't see the individual controls, but only talk to the composite.&amp;nbsp;In code behind, decorate&amp;nbsp;your user control&amp;nbsp;with the appropriate properties. Regular properties don't interact with the binding engine,&amp;nbsp;you have to use &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.dependencyproperty.aspx" target="_blank"&gt;Dependency Properties&lt;/a&gt;.&amp;nbsp;The EnhancedSlider has the following properties: &lt;em&gt;Minimum&lt;/em&gt;, &lt;em&gt;Maximum&lt;/em&gt;, &lt;em&gt;Value&lt;/em&gt;, &lt;em&gt;Header&lt;/em&gt;, and &lt;em&gt;ValueSuffix&lt;/em&gt;.&amp;nbsp;&lt;em&gt;ValueSuffix&lt;/em&gt; represents the unit measure and is&amp;nbsp;displayed in a separate textblock in the upper right corner of the control. I&amp;rsquo;ve been trying very hard to use a &lt;a href="http://blogs.u2u.be/diederik/post/2012/03/19/A-StringFormat-converter-for-Windows-8-Metro.aspx" target="_blank"&gt;StringFormatConverter&lt;/a&gt; in the textbox displaying the &lt;em&gt;Value&lt;/em&gt;. That value should only be formatted when the texbox is disabled (when it looks like a label), not when the user is typing in it. Unfortunately,&amp;nbsp;changing the converter or even the converter parameter programmatically doesn't work because&amp;nbsp;bindings are immutable. So I had to pull the formatting out of the textbox and into an other control as a suffix. It will stil do the job in most scenario's...&lt;/p&gt;
&lt;p&gt;Anyway, here&amp;rsquo;s one example of a dependency property (tip: use the &lt;em&gt;propdp&lt;/em&gt; code snippet to create these):&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;public static readonly DependencyProperty MinimumProperty =
    DependencyProperty.Register("Minimum", typeof(int), typeof(EnhancedSlider), new PropertyMetadata(0));

public int Minimum
{
    get { return (int)GetValue(MinimumProperty); }
    set { SetValue(MinimumProperty, value); }
}&lt;/pre&gt;
&lt;p&gt;All you need to do now is to bind the subcontrol&amp;rsquo;s properties to the user control's dependency properties. You may be tempted to set the &lt;em&gt;DataContext&lt;/em&gt; of the control to itself (with &lt;em&gt;RelativeSource&lt;/em&gt; &lt;em&gt;Self&lt;/em&gt; as binding source) to get this done, but then you loose the ability to bind it to something else (e.g. a ViewModel)&lt;em&gt;. &lt;/em&gt;It's better to&amp;nbsp;give the control a name, and use&amp;nbsp;yet another&amp;nbsp;&lt;em&gt;ElementName&lt;/em&gt; in the binding:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;UserControl x:Class="U2UConsult_UserControls.EnhancedSlider" x:Name="userControl"&amp;gt;
...
    &amp;lt;Slider x:Name="slider"
        Minimum="{Binding Minimum, ElementName=userControl}"
        Maximum="{Binding Maximum, ElementName=userControl}"
        Value="{Binding Value, Mode=TwoWay, ElementName=userControl}" /&amp;gt;
...
&amp;lt;/UserControl&amp;gt;&lt;/pre&gt;
&lt;p&gt;And there we are: we just built our own a reusable composite control.&lt;/p&gt;
&lt;p&gt;If you want to use the control inside a page or another control, all you need to do is declare the namespace in the hosting container:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Page x:Class="U2UConsult.UserControls.Sample.MainPage"
         xmlns:uc="using:U2UConsult_UserControls" &amp;gt;
...
&amp;lt;/Page&amp;gt;&lt;/pre&gt;
&lt;p&gt;You're ready to use the control in the page. Don&amp;rsquo;t forget to set the bindings with the ViewModel:&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;uc:EnhancedSlider Value="{Binding Roasted, Mode=TwoWay}"
                           Header="Roasted"
                           Maximum="1000"
                           Foreground="Orange"
                           ValueSuffix=" civilizations" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;Again, don't expect too much help from the Visual Studio Designer. Here's how my main page looks at design time:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f11%2fUserControl_Design2.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;Fortunately at runtime everything comes through. Here&amp;rsquo;s a screen shot of the attached sample application:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f11%2fUserControls.png" alt="" width="100%" /&gt;&lt;/p&gt;
&lt;p&gt;The app contains two projects: a GUI, and a library with the user control.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.u2u.be/diederik/image.axd?picture=2012%2f11%2fVS_UserControl.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Oh, there&amp;rsquo;s something you should know about storing user controls in a separate assembly: that &lt;a href="http://support.microsoft.com/kb/2739194" target="_blank"&gt;assembly may not have dots in its name&lt;/a&gt;. I assume that&amp;rsquo;s a bug that will be fixed very soon.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Here&amp;rsquo;s the code for the sample solution. It was written in Visual Studio 2012 Express: &lt;a href="http://blogs.u2u.be/diederik/file.axd?file=2012%2f11%2fU2UConsult.UserControls.Sample.zip"&gt;U2UConsult.UserControls.Sample.zip (132.73 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.twitter.com/diederikkrols" target="_blank"&gt;Diederik&lt;/a&gt;&lt;/p&gt;</description><pubDate>Wed, 07 Nov 2012 06:00:00 -1200</pubDate><comments>http://blogs.u2u.be/diederik/post/2012/11/07/Building-User-Controls-for-Windows-8-Store-apps.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=b07dd509-4ce5-4ab4-8c09-7ffbfa610d1b</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/diederik/trackback.axd?id=b07dd509-4ce5-4ab4-8c09-7ffbfa610d1b</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/post/2012/11/07/Building-User-Controls-for-Windows-8-Store-apps.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/diederik/syndication.axd?post=b07dd509-4ce5-4ab4-8c09-7ffbfa610d1b</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=849a9920-810f-42a3-9963-a6215869581b</guid><link>http://blogs.u2u.be/michael/post/2012/08/27/Creating-updatable-Live-Tile-from-A-to-Z-(part-2).aspx</link><category>Windows Phone</category><title>Creating updatable Live Tile from A to Z (part 2)</title><description>&lt;p&gt;At last, part 2 of this blogpost. In part 1, we created an updatable Live Tile. We still need to update it with a Background task. We start by adding a Windows Phone Scheduled Task Agent, which is a projecttype added with the devtools for the Mango-version. This type allows you to ask tasks to be performed in the background. By default the task will run every 30 minutes (It can take longer depending on the memorypressure of the device). In here you can have an override of OnInvoke, that should perform the actual backgroundtask of your app. &lt;/p&gt;  &lt;p&gt;The control (Indicator) whom I am using for creating a WriteableBitmap with, needs to be accessible from within the app ánd from within the backgroundtask. Since the app already needs a reference to the BackgroundTask, we cannot create a reference in the opposite direction. So we need to move the Indicator into a separate class-library. &lt;/p&gt;  &lt;p&gt;You’ll probably see that this works quiet nicely, until all of a sudden your solution no longer builds. In your code all of the Indicator-properties seems to be absent. I presume it’s a bug in Visual Studio, but from time to time the BuildAction-property for Indicator.xaml changes, which prevents your solution from building. If it happens to you: change it back to “Page” :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_19.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_19.png" width="269" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Let’s do a little update of the tile we created : &lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;Deployment.Current.Dispatcher.BeginInvoke(() =&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;                Indicator indicator = &lt;span class="kwrd"&gt;new&lt;/span&gt; Indicator();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                indicator.KPI1Brush = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Magenta);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                indicator.KPI2Brush = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Orange);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                indicator.KPI3Brush = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Red);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                indicator.KPI4Brush = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Yellow);&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;                indicator.Measure(&lt;span class="kwrd"&gt;new&lt;/span&gt; Size(173, 173));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                indicator.Arrange(&lt;span class="kwrd"&gt;new&lt;/span&gt; Rect(0, 0, 173, 173));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                &lt;span class="kwrd"&gt;string&lt;/span&gt; indic = &lt;span class="str"&gt;&amp;quot;/Shared/ShellContent/indicator.jpg&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                WriteableBitmap bm = &lt;span class="kwrd"&gt;new&lt;/span&gt; WriteableBitmap(indicator, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                IsolatedStorageFile isolated = IsolatedStorageFile.GetUserStoreForApplication();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (isolated.FileExists(indic))&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;                    isolated.DeleteFile(indic);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                IsolatedStorageFileStream stream = isolated.CreateFile(indic);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                bm.SaveJpeg(stream, 50, 50, 0, 100);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                stream.Flush();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                stream.Close();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                ShellTile tile = ShellTile.ActiveTiles.FirstOrDefault();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                ShellTileData data = &lt;span class="kwrd"&gt;new&lt;/span&gt; StandardTileData()&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;                    BackContent = &lt;span class="str"&gt;&amp;quot;Sober at 18:23&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                    BackBackgroundImage = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;&amp;quot;isostore:/Shared/ShellContent/indicator.jpg&amp;quot;&lt;/span&gt;, UriKind.Absolute),&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                    BackTitle = &lt;span class="str"&gt;&amp;quot;0.123&amp;quot;&lt;/span&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;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;                tile.Update(data);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &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;This is of course very similar to the code in the first part of this blogpost. You can see that in here we also store the bitmap in isolated storage. The nice thing here is that the isolated storage is being shared between the backgroundtask, and the application for which you create the task. So it could also be used for transferring data from the app to the task.&lt;/p&gt;

&lt;p&gt;Actually we’re changing stuff on the GUI Thread from a background thread, that’s why we need the dispatcher-object here.&lt;/p&gt;

&lt;p&gt;One little problem remains : I would like to set one of the KPI-colors of my indicator to the PhoneForeGroundColor. In the app I do as such :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush((Color)App.Current.Resources[&lt;span class="str"&gt;&amp;quot;PhoneForegroundColor&amp;quot;&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;(Or use “PhoneForegroundBrush” for getting a Brush-object) But what to do in the BackgroundTask, since I do not have access to the App-class in there ? No problem: you can also access the system-resources through objects inheriting from FrameworkElement : &lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush((Color) indicator.Resources[&lt;span class="str"&gt;&amp;quot;PhoneForegroundColor&amp;quot;&lt;/span&gt;]);&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Cool: ready to deploy ! &lt;/p&gt;</description><pubDate>Mon, 27 Aug 2012 23:15:00 -1200</pubDate><comments>http://blogs.u2u.be/michael/post/2012/08/27/Creating-updatable-Live-Tile-from-A-to-Z-(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=849a9920-810f-42a3-9963-a6215869581b</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=849a9920-810f-42a3-9963-a6215869581b</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2012/08/27/Creating-updatable-Live-Tile-from-A-to-Z-(part-2).aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=849a9920-810f-42a3-9963-a6215869581b</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=9679978c-8144-41cb-bfa4-e058b44aec00</guid><link>http://blogs.u2u.be/michael/post/2012/05/08/Creating-updatable-Live-Tiles-from-A-to-Z-(part-1).aspx</link><title>Creating updatable Live Tiles from A to Z (part 1)</title><description>&lt;p&gt;Something I haven’t found on the webs, is a nice overview of how to create updatable live tiles. Sure, you can gather all the data, but all the do’s and gotcha’s in one article would be nice. So I decided to get everything together myself. &lt;/p&gt;  &lt;p&gt;OK: here’s the scenario. We need an app that visually shows information. Think about e.g. the mail-app that shows how many unread mails you have. Or a very nice one: Amazing Weather, which shows current weather conditions, and predictions. In our app we’ll show four arbitrary KPI’s on the tile, which will be updated in the background.&lt;/p&gt;  &lt;h3&gt;Step 1 : simple Tile&lt;/h3&gt;  &lt;p&gt;Your application can have one or several tiles on the start page( several if you implemented Deep link in your app), which can be reached by using the ShellTile.ActiveTiles collection. In my example there’s no deep link, so I should always get one tile, or none when not pinned to start. The Tile can be modified by passing it a ShellTileData-object. This way you can change front (Title, Count, BackgroundImage) and back (BackTitle, BackContent, BackBackgroundImage) of the tile. I will change the time whenever my app closes or deactivates :&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;ShellTile tile = ShellTile.ActiveTiles.FirstOrDefault();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (tile!=&lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    ShellTileData data = &lt;span class="kwrd"&gt;new&lt;/span&gt; StandardTileData()&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;        Title = &lt;span class="str"&gt;&amp;quot;12345&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        Count = 5,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        BackContent = &lt;span class="str"&gt;&amp;quot;Some message...&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        BackBackgroundImage = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;&amp;quot;http://mw2.google.com/mw-panoramio/photos/medium/33672781.jpg&amp;quot;&lt;/span&gt;),&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        BackTitle = &lt;span class="str"&gt;&amp;quot;ABCDEF&amp;quot;&lt;/span&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;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    tile.Update(data);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &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;This gives me following result :&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="200"&gt;Front :&lt;/td&gt;

      &lt;td valign="top" width="200"&gt;Back :&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="200"&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=1.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="1" border="0" alt="1" src="http://blogs.u2u.be/michael/image.axd?picture=1_thumb.png" width="219" height="363" /&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=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="2" border="0" alt="2" src="http://blogs.u2u.be/michael/image.axd?picture=2_thumb.png" width="222" height="367" /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Although this can already be handy for some scenario’s, it’s not enough. The count does not appear like in the mail-hub. Unfortunately. And I could show my KPI’s with text, but my Tile will be full of text, and maybe I’ll have more text than can fit on the Tile.&lt;/p&gt;

&lt;h3&gt;Step 2 : not so simple Tile&lt;/h3&gt;

&lt;p&gt;Remember my blogpost about saving pictures to the PicturesHub (&lt;a href="http://blogs.u2u.be/michael/post/2011/04/28/Saving-an-Image-to-the-Pictures-Hub.aspx" target="_blank"&gt;over here&lt;/a&gt;) ? In there I showed you can create bitmapimages from any control. This is also what we’ll be doing when creating our tile-images. I start by creating a usercontrol. Best is to give it height and width equal to 173. This is the height/width for the tile. This will allow you to easily create your tile in a WYSIWYG-way. The usercontrol simply shows my four KPI’s by using “Trafficlights”, showing red, orange or green. I will also add white (or black if the light theme is being used) for “disaster”. Let’s start creating our usercontrol : &lt;/p&gt;
&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_18.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_18.png" width="188" height="186" /&gt;&lt;/a&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;UserControl&lt;/span&gt; &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PhoneApp1.Indicator&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="attr"&gt;xmlns:d&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/expression/blend/2008&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="attr"&gt;xmlns:mc&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="attr"&gt;mc:Ignorable&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;d&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="attr"&gt;FontFamily&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource PhoneFontFamilyNormal}&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;FontSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource PhoneFontSizeNormal}&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;Foreground&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource PhoneForegroundBrush}&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="attr"&gt;d:DesignHeight&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;480&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;d:DesignWidth&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;480&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;173&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;173&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;  11:  &lt;/span&gt;&amp;#160;&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;Grid&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;LayoutRoot&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Background&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource PhoneAccentBrush}&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;&amp;#160;&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;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="lnum"&gt;  15:  &lt;/span&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;=&amp;quot;2*&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;  16:  &lt;/span&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;=&amp;quot;*&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;Grid.RowDefinitions&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;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="lnum"&gt;  19:  &lt;/span&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColumnDefinition&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2*&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;ColumnDefinition&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;*&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;  21:  &lt;/span&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="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Rectangle&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;KPI1Indicator&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Stroke&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource PhoneBorderBrush}&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;StrokeThickness&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Fill&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Red&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;80,80,10,10&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;RadiusX&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;20&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;RadiusY&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;20&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;  23:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Rectangle&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;KPI2Indicator&amp;quot;&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;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Stroke&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource PhoneBorderBrush}&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;StrokeThickness&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Fill&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Green&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;3,80,30,10&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;RadiusX&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;20&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;RadiusY&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;20&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;Rectangle&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;KPI3Indicator&amp;quot;&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;Stroke&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource PhoneBorderBrush}&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;StrokeThickness&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Fill&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Orange&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;80,3,10,30&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;RadiusX&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;20&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;RadiusY&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;20&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;  25:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Rectangle&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;=&amp;quot;1&amp;quot;&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;KPI4Indicator&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Stroke&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource PhoneBorderBrush}&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;StrokeThickness&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&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="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;3,3,30,30&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;RadiusX&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;20&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;RadiusY&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;20&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;  26:  &lt;/span&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 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;UserControl&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;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;The four KPI-indicators need to be exposed to the outside word, so let’s add some properties for that :&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; Brush KPI1Brush&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;    get { &lt;span class="kwrd"&gt;return&lt;/span&gt; KPI1Indicator.Fill; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    set { KPI1Indicator.Fill = &lt;span class="kwrd"&gt;value&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;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Brush KPI2Brush&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;    get { &lt;span class="kwrd"&gt;return&lt;/span&gt; KPI2Indicator.Fill; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    set { KPI2Indicator.Fill = &lt;span class="kwrd"&gt;value&lt;/span&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;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Brush KPI3Brush&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;    get { &lt;span class="kwrd"&gt;return&lt;/span&gt; KPI3Indicator.Fill; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    set { KPI3Indicator.Fill = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&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;&amp;#160;&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; Brush KPI4Brush&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    get { &lt;span class="kwrd"&gt;return&lt;/span&gt; KPI4Indicator.Fill; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    set { KPI4Indicator.Fill = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &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;When closing/deactivating the app, I will set the KPI-colors, and use this controls as image for the back of my tile. First, setting the colors:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;Indicator indicator = &lt;span class="kwrd"&gt;new&lt;/span&gt; Indicator();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;indicator.KPI1Brush = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Black);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;indicator.KPI2Brush = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Blue);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;indicator.KPI3Brush = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Cyan);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;indicator.KPI4Brush = &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Green);&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;&lt;/p&gt;

&lt;p&gt;And then making a WriteableBitmap with it :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;indicator.Measure(&lt;span class="kwrd"&gt;new&lt;/span&gt; Size(173, 173));
indicator.Arrange(&lt;span class="kwrd"&gt;new&lt;/span&gt; Rect(0, 0, 173, 173));

WriteableBitmap bm = &lt;span class="kwrd"&gt;new&lt;/span&gt; WriteableBitmap(indicator, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&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;&lt;/p&gt;

&lt;p&gt;The Measure and Arrange-stuff is for making the control fit into a 173 by 173 square. Finally I need to save my image to Isolated Storage. Inside isolated storage I can store things in the Shared/Shellcontent-folder. This will also make it accessible by my tiles (&lt;a href="http://msdn.microsoft.com/en-us/library/ff402541(v=VS.92).aspx" target="_blank"&gt;info here&lt;/a&gt;).&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;string&lt;/span&gt; indic = &lt;span class="str"&gt;&amp;quot;/Shared/ShellContent/indicator.jpg&amp;quot;&lt;/span&gt;;&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;IsolatedStorageFile isolated = 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; (isolated.FileExists(indic))&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;    isolated.DeleteFile(indic);&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;IsolatedStorageFileStream stream = isolated.CreateFile(indic);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;bm.SaveJpeg(stream, 173, 173, 0, 100);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;stream.Flush();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;stream.Close();&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;And finally, I update my Tile to show the image from isolated storage :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;ShellTile tile = ShellTile.ActiveTiles.FirstOrDefault();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (tile!=&lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    ShellTileData data = &lt;span class="kwrd"&gt;new&lt;/span&gt; StandardTileData()&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;        Title = &lt;span class="str"&gt;&amp;quot;12345&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        Count = 5,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        BackContent = &lt;span class="str"&gt;&amp;quot;Some message...&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        BackBackgroundImage = &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;&amp;quot;isostore:/Shared/ShellContent/indicator.jpg&amp;quot;&lt;/span&gt;, UriKind.Absolute),&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        BackTitle = &lt;span class="str"&gt;&amp;quot;ABCDEF&amp;quot;&lt;/span&gt;&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;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    tile.Update(data);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &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;and there you go :&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=1_1.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="1" border="0" alt="1" src="http://blogs.u2u.be/michael/image.axd?picture=1_thumb_1.png" width="219" height="362" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In next blogpost I’ll tell you about updating the tile with a backgroundtask, which also has some gotcha’s you need to know.&lt;/p&gt;
&lt;br/&gt;
&gt;&lt;a class="twitter-follow-button" href="https://twitter.com/PiekenPuil" data-size="large" data-show-count="false"&gt;Follow @PiekenPuil&lt;/a&gt; &lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");&lt;/script&gt;

&lt;br /&gt;

&lt;br /&gt;

&lt;p&gt;&lt;a class="twitter-share-button" href="https://twitter.com/share" data-count="horizontal" data-via="PiekenPuil"&gt;Tweet&lt;/a&gt;&lt;/p&gt;</description><pubDate>Tue, 08 May 2012 03:57:53 -1200</pubDate><comments>http://blogs.u2u.be/michael/post/2012/05/08/Creating-updatable-Live-Tiles-from-A-to-Z-(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=9679978c-8144-41cb-bfa4-e058b44aec00</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=9679978c-8144-41cb-bfa4-e058b44aec00</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2012/05/08/Creating-updatable-Live-Tiles-from-A-to-Z-(part-1).aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=9679978c-8144-41cb-bfa4-e058b44aec00</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=d4200174-6f0f-4424-b347-a63b6525fd66</guid><link>http://blogs.u2u.be/michael/post/2012/04/25/Using-a-Sterling-database-in-Windows-Phone-as-alternative-to-SQL-CE.aspx</link><category>Windows Phone</category><category>databases</category><category>Sterling</category><title>Using a Sterling-database in Windows Phone as alternative to SQL CE</title><description>&lt;p&gt;I you remember my blogpost from a very long time ago, I wrote about using SQL CE with Windows Phone (you can find it &lt;a href="http://blogs.u2u.net/michael/post/2011/08/11/The-return-of-SQL-CE.aspx" target="_blank"&gt;here&lt;/a&gt;). SQL CE can be queried with LINQ to SQL, making it interesting for storing relational data. Recently I came in contact with the Sterling-database (check it &lt;a href="http://sterling.codeplex.com/" target="_blank"&gt;here&lt;/a&gt;), an Object-database which can be used in .NET, Silverlight and Windows Phone ! You can add “SterlingPhone” to your project by using NuGet. Just like SQL CE I can use Sterling for storing data in Isolated Storage.&lt;/p&gt;  &lt;p&gt;I’ll show you how to use it with a “fake” Northwind-database, but it can also be used for persisting full Viewmodels when using MVVM. In my fake Northwind-database I will use Products and Categories, so I simply start by creating classes for these two entities :&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; Product&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;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; ProductId { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;#160;&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;string&lt;/span&gt; ProductName { get; set; }&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;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt;? UnitPrice { get; set; }&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;public&lt;/span&gt; Category Category { get; set; }&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;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Category &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;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CategoryId { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CategoryName { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Product&amp;gt; Products { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &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;These classes are pure and simple POCO-classes, no specific classes to inherit from or a bunch of attributes to use. &lt;/p&gt;

&lt;p&gt;Second step is to create our “database-class”, which inherits from BaseDatabaseInstance : &lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; FakeNorthWindDatabase : BaseDatabaseInstance&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;In here I will register my tables by overriding RegisterTables :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; System.Collections.Generic.List&amp;lt;ITableDefinition&amp;gt; RegisterTables()
{
    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;ITableDefinition&amp;gt;() 
    {
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.CreateTableDefinition&amp;lt;Product,&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;(p=&amp;gt;p.ProductId)
            .WithIndex&amp;lt;Product,Category,&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;(&lt;span class="str"&gt;&amp;quot;IX_ProductCategory&amp;quot;&lt;/span&gt;,p=&amp;gt;p.Category),
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.CreateTableDefinition&amp;lt;Category,&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;(c=&amp;gt;c.CategoryId)
    };
}&lt;/pre&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;&lt;/p&gt;

&lt;p&gt;In here I create the table Category and Products, which are respectively using the CategoryId and ProductId-properties as identifiers. The WithIndex-option creates a relationship between these two entities. &lt;/p&gt;

&lt;p&gt;This database also needs to be registered. I do that in the Application_Launching:&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; SterlingEngine engine;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; SterlingDefaultLogger logger;&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;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; ISterlingDatabaseInstance DB { get; set; }&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;&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 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;    InitDB();&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;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InitDB()&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;    engine = &lt;span class="kwrd"&gt;new&lt;/span&gt; SterlingEngine();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    engine.SterlingDatabase.RegisterSerializer&amp;lt;DefaultSerializer&amp;gt;();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    engine.Activate();&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;    DB = engine.SterlingDatabase.RegisterDatabase&amp;lt;FakeNorthWindDatabase&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    FakeNorthWindDatabase.Init(DB);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &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;One of the things we need to do is to specify which serializer will be used for writing and reading data. At this moment we only have the DefaultSerializer and AggregateSerializer, but you could create your own classes here, as long as they inherit from BaseSerializer.&lt;/p&gt;

&lt;p&gt;At the end I call the init-method of the FakeNorthWindDatabase, which I implemented as follows :&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;internal&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Init(Wintellect.Sterling.ISterlingDatabaseInstance DB)&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;if&lt;/span&gt; (!DB.Query&amp;lt;Category,&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;().Any())&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;        Category c1 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Category() { CategoryId=1, CategoryName = &lt;span class="str"&gt;&amp;quot;Beverages&amp;quot;&lt;/span&gt;};&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        Category c2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Category() { CategoryId = 2, CategoryName = &lt;span class="str"&gt;&amp;quot;Cheese&amp;quot;&lt;/span&gt; };&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        Category c3 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Category() { CategoryId = 3, CategoryName = &lt;span class="str"&gt;&amp;quot;Seafood&amp;quot;&lt;/span&gt; };&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;        Product p11 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product() { ProductId = 1, ProductName = &lt;span class="str"&gt;&amp;quot;WestVleteren 12&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            UnitPrice = 3, Category = c1 };&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        Product p12 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product() { ProductId = 2, ProductName = &lt;span class="str"&gt;&amp;quot;Rochefort 10&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            UnitPrice = 3, Category = c1 };&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        Product p13 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product() { ProductId = 3, ProductName = &lt;span class="str"&gt;&amp;quot;Maredsous 8&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            UnitPrice = 2.5, Category = c1 };&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        Product p21 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product() { ProductId = 4, ProductName = &lt;span class="str"&gt;&amp;quot;Maredsous&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            UnitPrice = 3, Category = c2 };&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        Product p22 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product() { ProductId = 5, ProductName = &lt;span class="str"&gt;&amp;quot;Gouda&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            UnitPrice = 3, Category = c2 };&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        Product p23 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product() { ProductId = 6, ProductName = &lt;span class="str"&gt;&amp;quot;Cambozola&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            UnitPrice = 2.5, Category = c2 };&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        Product p31 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product() { ProductId = 7, ProductName = &lt;span class="str"&gt;&amp;quot;Shrimps&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            UnitPrice = 3, Category = c3 };&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        Product p32 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product() { ProductId = 8, ProductName = &lt;span class="str"&gt;&amp;quot;Tuna Fish&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            UnitPrice = 3, Category = c3 };&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        Product p33 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product() { ProductId = 9, ProductName = &lt;span class="str"&gt;&amp;quot;Calamares&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            UnitPrice = 2.5, Category = c3 };&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        DB.Save(c1);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        DB.Save(c2);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        DB.Save(c3);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        DB.Save(p11);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        DB.Save(p12);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        DB.Save(p13);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;        DB.Save(p21);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        DB.Save(p22);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;        DB.Save(p23);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;        DB.Save(p31);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;        DB.Save(p32);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;        DB.Save(p33);&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;}&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;This code first checks if there is already categories present, and if not starts filling the database with some sample-data. We can now use our data: let’s simply show the name of a Category. The Sterling-database has a load-function that can be passed the key-value of the entity to find :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre&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; button1_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    Category c= App.DB.Load&amp;lt;Category&amp;gt;(1);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    MessageBox.Show(c.CategoryName);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &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;Simple. Retrieving a list is also simple :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;listBox1.ItemsSource = App.DB.Query&amp;lt;Category, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;().Select(c =&amp;gt; c.LazyValue.Value);&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;The select-method uses a delegate that takes a TableKey&amp;lt;Category,int&amp;gt; and returns an object, in this case the Category-entity. By using LINQ I can get the products for a specific category :&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; catId = Convert.ToInt32(NavigationContext.QueryString[&lt;span class="str"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;]);
listBox1.ItemsSource = (from p &lt;span class="kwrd"&gt;in&lt;/span&gt; App.DB.Query&amp;lt;Product, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;()
                        &lt;span class="kwrd"&gt;where&lt;/span&gt; p.LazyValue.Value.Category.CategoryId == catId
                       select p.LazyValue.Value).ToList();&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;Let’s add a new Category and product :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;Category c = &lt;span class="kwrd"&gt;new&lt;/span&gt; Category()&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;    CategoryId = 4,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    CategoryName = &lt;span class="str"&gt;&amp;quot;Condiments&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;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;Product p = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product()&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;    ProductId = 10,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    ProductName = &lt;span class="str"&gt;&amp;quot;Aniseed Syrup&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    UnitPrice = 12.2,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    Category = c&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;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;App.DB.Save&amp;lt;Product&amp;gt;(p);&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;Saving the product also saves the category. Save checks the Id-field to know if it should do an update or an insert. Unfortunately there’s no autonumber-functionality, but Sterling also allows me to create triggers, with which I could create autonumber-functionality myself.&lt;/p&gt;

&lt;p&gt;This blogpost just scratches the surface of Sterling, there’s lots more fun stuff you can do with it, so check it out if you need to store persistant data.&lt;/p&gt;

&lt;br /&gt;&lt;a class="twitter-follow-button" href="https://twitter.com/PiekenPuil" data-size="large" data-show-count="false"&gt;Follow @PiekenPuil&lt;/a&gt; &lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");&lt;/script&gt;

&lt;br /&gt;

&lt;br /&gt;

&lt;p&gt;&lt;a class="twitter-share-button" href="https://twitter.com/share" data-count="horizontal" data-via="PiekenPuil"&gt;Tweet&lt;/a&gt;&lt;/p&gt;</description><pubDate>Wed, 25 Apr 2012 03:23:00 -1200</pubDate><comments>http://blogs.u2u.be/michael/post/2012/04/25/Using-a-Sterling-database-in-Windows-Phone-as-alternative-to-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=d4200174-6f0f-4424-b347-a63b6525fd66</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=d4200174-6f0f-4424-b347-a63b6525fd66</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2012/04/25/Using-a-Sterling-database-in-Windows-Phone-as-alternative-to-SQL-CE.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=d4200174-6f0f-4424-b347-a63b6525fd66</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/michael/post.aspx?id=ba391850-e76a-471a-ab16-a76e45f890d2</guid><link>http://blogs.u2u.be/michael/post/2012/03/29/Using-Reactive-extensions-for-feeding-test-sensor-reading-in-Windows-Phone.aspx</link><category>Reactive Extensions</category><category>Rx</category><category>sensors</category><category>testing</category><category>Windows Phone</category><title>Using Reactive extensions for feeding test sensor-readings in Windows Phone</title><description>&lt;p&gt;An interesting technology you might have heard of is Reactive Extension (&lt;a href="http://msdn.microsoft.com/en-us/data/gg577609" target="_blank"&gt;MSDN Rx Site&lt;/a&gt;). It’s available for different types of applications, although&amp;#160; you may need to add the necessary assemblies through NuGet. But in WP7.5 it’s included in the SDK. The only thing you need are references to Microsoft.Phone.Reactive and System.Observable.&amp;#160; Let’s start with a very simple scenario : simulating the PositionChanged-event of the GeoCoordinateWatcher. I know that the Mango-emulator allows me to simulate Geographical position, but it’s a nice starting point.&lt;/p&gt;  &lt;p&gt;My application consists out of a very simple Page which shows a Bing mapcontrol. I set the Zoomlevel to 10, and we’re set to go. The code is fairly simple : &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; PhoneApplicationPage_Loaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs 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;    GeoCoordinateWatcher watcher = &lt;span class="kwrd"&gt;new&lt;/span&gt; GeoCoordinateWatcher();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    watcher.MovementThreshold = 1;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    watcher.PositionChanged += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;GeoPositionChangedEventArgs&amp;lt;GeoCoordinate&amp;gt;&amp;gt;(watcher_PositionChanged);&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;    watcher.Start();&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;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; watcher_PositionChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, GeoPositionChangedEventArgs&amp;lt;GeoCoordinate&amp;gt; e)&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;    map1.Dispatcher.BeginInvoke(()=&amp;gt; map1.Center = e.Position.Location);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &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;Now let’s try to simulate some changes in our position: Let’s travel from South England to France, passing Dover and Calais. Let’s start by creating a simple function that gives me back an GeoPositionEventArgs every 50 ms :&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="preproc"&gt;#if&lt;/span&gt; DEBUG&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; l = 0;&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;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IEnumerable&amp;lt;GeoPositionChangedEventArgs&amp;lt;GeoCoordinate&amp;gt;&amp;gt; GetLocations() &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;    &lt;span class="kwrd"&gt;while&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;   7:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        System.Threading.Thread.Sleep(50);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        l += .001;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;yield&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; GeoPositionChangedEventArgs&amp;lt;GeoCoordinate&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            (&lt;span class="kwrd"&gt;new&lt;/span&gt; GeoPosition&amp;lt;GeoCoordinate&amp;gt;(DateTimeOffset.Now, &lt;span class="kwrd"&gt;new&lt;/span&gt; GeoCoordinate(51, l)));&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="preproc"&gt;#endif&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;&lt;/p&gt;

&lt;p&gt;Now let’s create a Thread that calls this functions, and uses Rx for feeding the eventargs to the eventhandler :&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; PhoneApplicationPage_Loaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs 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;    GeoCoordinateWatcher watcher = &lt;span class="kwrd"&gt;new&lt;/span&gt; GeoCoordinateWatcher();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    watcher.MovementThreshold = 1;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    watcher.PositionChanged += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;GeoPositionChangedEventArgs&amp;lt;GeoCoordinate&amp;gt;&amp;gt;(watcher_PositionChanged);&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;    &lt;span class="preproc"&gt;#if&lt;/span&gt; DEBUG&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    System.Threading.Thread thr = &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Threading.Thread(() =&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;        var test = GetLocations().ToObservable();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        test.Subscribe(ea =&amp;gt; watcher_PositionChanged(&lt;span class="kwrd"&gt;null&lt;/span&gt;, ea));&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;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    thr.Start();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="preproc"&gt;#endif&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;    watcher.Start();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &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;The ToObservable-function turns my IEnumerable&amp;lt;T&amp;gt; into an IObservable&amp;lt;T&amp;gt;. The Subscribe-function binds it with the eventhandler. Run the app (in debug-mode, of course), and you’ll see the map slowly moving East passing from England to France.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.u2u.be/michael/image.axd?picture=image_17.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_17.png" width="237" height="444" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let’s try to use the same concept with the Accelerometer. I create a simple page with three TextBlock-controls for displaying the X,Y and Z-components of my accelaration. In here we’ll have to do similar stuff with SensorReadingEventArgs&amp;lt;AccelerometerReading&amp;gt;. In AccelerometerReading I need to set the Acceleration-property which is of type Vector3 (with X,Y,Z). The problem that arrises here is that the setter of Accelartion is declared as internal, so I cannot use this from my code. The solution can be found at Microsoft Patterns and Practices site, which has some recipes for creating alternatives for the sensor-classes (&lt;a href="http://msdn.microsoft.com/en-us/library/hh830876.aspx" target="_blank"&gt;here&lt;/a&gt;). Instead of the AccelerometerReading-class I can use AccelerometerSensorReading-class and the SettableAccelerometerSensorReading-class. The name of the latter already describes it : it will allow me to set the Acceleration-property. Let’s have a look at the result : &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; PhoneApplicationPage_Loaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs 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;    AccelerometerAdapter acc = &lt;span class="kwrd"&gt;new&lt;/span&gt; AccelerometerAdapter();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    acc.TimeBetweenUpdates = TimeSpan.FromSeconds(1);&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;    acc.CurrentValueChanged += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;SensorReadingEventArgs&amp;lt;AccelerometerSensorReading&amp;gt;&amp;gt;(acc_CurrentValueChanged)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    acc.Start();&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="preproc"&gt;#if&lt;/span&gt; DEBUG&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    System.Threading.Thread thr = &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Threading.Thread(() =&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;        var test = GetReadings().ToObservable();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        test.Subscribe(ea =&amp;gt; acc_CurrentValueChanged(&lt;span class="kwrd"&gt;null&lt;/span&gt;, ea));&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;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    thr.Start();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&lt;span class="preproc"&gt;#endif&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;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; acc_CurrentValueChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, SensorReadingEventArgs&amp;lt;AccelerometerSensorReading&amp;gt; e)&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;    ContentPanel.Dispatcher.BeginInvoke(() =&amp;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;        textBlock1.Text = e.SensorReading.Acceleration.X.ToString();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        textBlock2.Text = e.SensorReading.Acceleration.Y.ToString();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        textBlock3.Text = e.SensorReading.Acceleration.Z.ToString();&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;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;&lt;span class="preproc"&gt;#if&lt;/span&gt; DEBUG&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; f = 0f;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IEnumerable&amp;lt;SensorReadingEventArgs&amp;lt;AccelerometerSensorReading&amp;gt;&amp;gt; GetReadings()&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;while&lt;/span&gt; (&lt;span class="kwrd"&gt;true&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;        System.Threading.Thread.Sleep(500);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        var acc = &lt;span class="kwrd"&gt;new&lt;/span&gt; SettableAccelerometerSensorReading();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;        acc.SetAcceleration(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(f, 0f, 0f));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;        f += .1f;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (f &amp;gt; Math.PI)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;            f = (&lt;span class="kwrd"&gt;float&lt;/span&gt;)-Math.PI;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;        var reading = &lt;span class="kwrd"&gt;new&lt;/span&gt; SensorReadingEventArgs&amp;lt;AccelerometerSensorReading&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;        &lt;span class="kwrd"&gt;yield&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; SensorReadingEventArgs&amp;lt;AccelerometerSensorReading&amp;gt;() { SensorReading = acc }; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;}&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;&lt;span class="preproc"&gt;#endif&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;And there you go. Also tried it with the virtual Motion-sensor, unfortunately I got stuck there. I’m missing a SettableAttitudeReading-class, and I’ve been trying to create it since a few days, but I’m close to giving up. I guess there’s a reason for not having it in the patterns-library.&lt;/p&gt;
&lt;br/&gt;
&lt;a href="https://twitter.com/PiekenPuil" class="twitter-follow-button" data-show-count="false" data-size="large"&gt;Follow @PiekenPuil&lt;/a&gt;
&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");&lt;/script&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;p&gt;&lt;a class="twitter-share-button" href="https://twitter.com/share" data-via="PiekenPuil" data-count="horizontal"&gt;Tweet&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Thu, 29 Mar 2012 09:27:00 -1200</pubDate><comments>http://blogs.u2u.be/michael/post/2012/03/29/Using-Reactive-extensions-for-feeding-test-sensor-reading-in-Windows-Phone.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=ba391850-e76a-471a-ab16-a76e45f890d2</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=ba391850-e76a-471a-ab16-a76e45f890d2</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/post/2012/03/29/Using-Reactive-extensions-for-feeding-test-sensor-reading-in-Windows-Phone.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/michael/syndication.axd?post=ba391850-e76a-471a-ab16-a76e45f890d2</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 -1200</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/">1</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 -1200</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/">9</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="https://twitter.com/PiekenPuil" class="twitter-follow-button" data-show-count="false" data-size="large"&gt;Follow @PiekenPuil&lt;/a&gt;
&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");&lt;/script&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 -1200</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 -1200</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/">62</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 -1200</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/">9</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 -1200</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/">55</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 -1200</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/">18</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 -1200</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/">68</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 -1200</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/">16</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 -1200</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/">70</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 -1200</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/">16</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 -1200</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/">50</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 -1200</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/">55</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 -1200</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/">7</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 -1200</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/">1</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 -1200</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/">0</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 -1200</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/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 -1200</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/">89</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/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 -1200</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/">232</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 -1200</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/">324</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 -1200</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/">82</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 -1200</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/">223</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="color: #2b91af"&gt;ClientBaseExtensions&lt;/span&gt;.traceSource.TraceEvent(
                                &lt;span style="color: #2b91af"&gt;TraceEventType&lt;/span&gt;.Error, 
                                0, 
                                &lt;span style="color: #a31515"&gt;&amp;quot;Could not close client proxy, reason: {0}&amp;quot;&lt;/span&gt;, 
                                ex.Message);
                            &lt;span style="color: blue"&gt;this&lt;/span&gt;.proxy.Abort();
                        }
                    }
                    &lt;span style="color: blue"&gt;else
                    &lt;/span&gt;{
                        &lt;span style="color: blue"&gt;this&lt;/span&gt;.proxy.Abort();
                    }

                    &lt;span style="color: blue"&gt;this&lt;/span&gt;.proxy = &lt;span style="color: blue"&gt;null&lt;/span&gt;;
                }
            }
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;</description><pubDate>Tue, 28 Sep 2010 09:34:37 -1200</pubDate><comments>http://blogs.u2u.be/kris/post/2010/09/28/Safe-disposal-of-WCF-proxies.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=08608f9b-06a9-4e1c-b335-e01c388bb4e3</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">295</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/kris/trackback.axd?id=08608f9b-06a9-4e1c-b335-e01c388bb4e3</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/kris/post/2010/09/28/Safe-disposal-of-WCF-proxies.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/kris/syndication.axd?post=08608f9b-06a9-4e1c-b335-e01c388bb4e3</wfw:commentRss></item><item><guid isPermaLink="false">http://blogs.u2u.be/kris/post.aspx?id=8f797c0e-a04e-4ed8-9693-b2b96578f932</guid><link>http://blogs.u2u.be/kris/post/2010/05/24/Lambda-Curry.aspx</link><category>.NET</category><title>Lambda Curry</title><description>&lt;p&gt;&lt;em&gt;Note: if you’re looking for &lt;a href="http://www.google.co.uk/search?hl=en&amp;amp;q=lamb+curry" target="_blank"&gt;lamb curry&lt;/a&gt;, you came to the wrong place. This post is about C# programming techniques.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Currying" target="_blank"&gt;Currying&lt;/a&gt; a function is a technique named after &lt;a href="http://en.wikipedia.org/wiki/Haskell_Curry" target="_blank"&gt;Haskell Curry&lt;/a&gt;, to transform a function with multiple parameters into a series of functions having one parameter each. The technique is important, because it opens the door to an optimization technique called partial evaluation. Let’s look at an example.&lt;/p&gt;  &lt;p&gt;Let’s say you need to write a program that sums a two-dimensional function f(x,y) over a two-dimensional range, e.g. –1000 ≤ x ≤ 1000 and –1000 ≤ y ≤ 1000.&lt;/p&gt;  &lt;p&gt;Such a two-dimensional function, assuming double parameters and result, can be represented by &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt;, and we can sum it using the following method:&lt;/p&gt;  &lt;pre style="font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;double&lt;/span&gt; Sum(&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt; f)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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: blue"&gt;double&lt;/span&gt; sum = 0;&lt;br /&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: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; x = -1000; x &amp;lt;= 1000; x++)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; y = -1000; y &amp;lt;= 1000; y++)&lt;br /&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;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sum += f(x, y);&lt;br /&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;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&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: blue"&gt;return&lt;/span&gt; sum;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

&lt;pre style="font-family: consolas"&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;We can apply this to an arbitrary function, for example:&lt;/p&gt;

&lt;pre style="font-family: consolas"&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;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt; f = (x, y) =&amp;gt; &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(x) * &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(y);&lt;br /&gt; &lt;br /&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: blue"&gt;double&lt;/span&gt; result = Sum(f);&lt;/pre&gt;

&lt;pre style="font-family: consolas"&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;Currying this is now a simple textual transformation. Instead of defining f as &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt;, we define it as &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt;&amp;gt;. &lt;/p&gt;

&lt;pre style="font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;internal&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;Curried&lt;/span&gt;&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;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; Main()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt;&amp;gt; f = x =&amp;gt; y =&amp;gt; &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(x) * &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(y);&lt;br /&gt; &lt;br /&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: blue"&gt;double&lt;/span&gt; result = Sum(f);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;double&lt;/span&gt; Sum(&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt;&amp;gt; f)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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: blue"&gt;double&lt;/span&gt; sum = 0;&lt;br /&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: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; x = -1000; x &amp;lt;= 1000; x++)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; y = -1000; y &amp;lt;= 1000; y++)&lt;br /&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;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sum += f(x)(y);&lt;br /&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;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&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: blue"&gt;return&lt;/span&gt; sum;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

&lt;pre style="font-family: consolas"&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;Effectively, a function that took two parameters and returned a result is replaced by a function that takes one parameter and returns a function that takes the second parameter and returns the result. It looks a lot simpler than it sounds. Instead of writing f = (x, y) =&amp;gt; &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(x) + &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(y), we write f = x =&amp;gt; y =&amp;gt; &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(x) + &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(y). And when calling it, instead of writing f(x, y), we write f(x)(y). Simple.&lt;/p&gt;

&lt;p&gt;Unfortunately, every call to f(x) now allocates a new &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt; object, and that can become quite expensive. But that can be fixed easily, so here is a smarter solution:&lt;/p&gt;

&lt;pre style="font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;internal&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;Smarter&lt;/span&gt;&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;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; Main()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt;&amp;gt; f = x =&amp;gt; y =&amp;gt; &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(x) * &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(y);&lt;br /&gt; &lt;br /&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: blue"&gt;double&lt;/span&gt; result = Sum(f);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;double&lt;/span&gt; Sum(&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt;&amp;gt; f)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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: blue"&gt;double&lt;/span&gt; sum = 0;&lt;br /&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: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; x = -1000; x &amp;lt;= 1000; x++)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; fx = f(x);&lt;br /&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;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; y = -1000; y &amp;lt;= 1000; y++)&lt;br /&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;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sum += fx(y);&lt;br /&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;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&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: blue"&gt;return&lt;/span&gt; sum;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

&lt;pre style="font-family: consolas"&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;I ran a little benchmark on this code. The benchmark executes the main function 20 times, and measures the shortest execution time. It also measures the number of generation 0 garbage collections. This is the result:&lt;/p&gt;

&lt;pre&gt;Naive: 261 msec, 0 collections&lt;br /&gt;Curried: 340 msec, 733 collections&lt;br /&gt;Smarter: 254 msec, 0 collections&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;As we can see, the curried version was initially slower due to all the memory allocations, but when we fixed that, the smarter version was as fast as the original. In fact is was just a little bit faster, though nothing to get existed about.&lt;/p&gt;

&lt;p&gt;However, this is where partial evaluation kicks in. Currently, we are calculating the sinus of x over one million times, not taking advantage of the fact that we could reuse each calculated value a thousand times! So let’s change our definition of f as follows:&lt;/p&gt;

&lt;pre style="font-family: consolas"&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;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt;&amp;gt; f = x =&amp;gt; { &lt;span style="color: blue"&gt;var&lt;/span&gt; sinx = &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(x); &lt;span style="color: blue"&gt;return&lt;/span&gt; y =&amp;gt; sinx * &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(y); };&lt;/pre&gt;

&lt;pre style="font-family: consolas"&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;Now the benchmark shows a completely different result:&lt;/p&gt;

&lt;pre&gt;Optimized: 143 msec, 0 collections&lt;/pre&gt;

&lt;pre&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;We went from 261 milliseconds in the original version to 143 milliseconds in this version, in fact almost dividing execution time by two! That’s because, to be precise, in the original version we had two times 2001 * 2001 = 8,008,002 Math.Sin calls, and in the optimized version we have 1 time 2001 plus 1 time 2001 * 2001 = 4,006,002 Math.Sin calls. That is a division by a factor of 1.999, yielding a total execution time reduction by a factor of 1.825 (there is some overhead of course).&lt;/p&gt;

&lt;p&gt;Of course, the technique is very much related to loop invariant code motion in imperative programming. For example, imagine a Sum function hardcoded for Sin(x) + Sin(y). Would you write is like this?&lt;/p&gt;

&lt;pre style="font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;double&lt;/span&gt; SumSinSin()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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: blue"&gt;double&lt;/span&gt; sum = 0;&lt;br /&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: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; x = -1000; x &amp;lt;= 1000; x++)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; y = -1000; y &amp;lt;= 1000; y++)&lt;br /&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;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sum += &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(x) * &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(y);&lt;br /&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;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&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: blue"&gt;return&lt;/span&gt; sum;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;Of course not! At least you would move the calculation of Sin(x) out of the loop over y:&lt;/p&gt;

&lt;pre style="font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;double&lt;/span&gt; SumSinSin()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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: blue"&gt;double&lt;/span&gt; sum = 0;&lt;br /&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: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; x = -1000; x &amp;lt;= 1000; x++)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; sinx = &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(x);&lt;br /&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;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;int&lt;/span&gt; y = -1000; y &amp;lt;= 1000; y++)&lt;br /&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;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sum += sinx * &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(y);&lt;br /&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;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&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: blue"&gt;return&lt;/span&gt; sum;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

&lt;pre style="font-family: consolas"&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;And that is exactly what we did, except of course that the sum function is parameterized and not hardcoded.&lt;/p&gt;

&lt;p&gt;So when would you apply this technique? You would apply it when performance matters, and you have a function that you need to call a lot, that takes more than one parameter, where one parameter varies more than another one (in our example, x remained the same for a long time, while y was different on every call), and part of the function can be evaluated knowing only the value of the parameter that varies the least.&lt;/p&gt;

&lt;p&gt;In our example above, we could go even further. For example, we could eliminate the multiplication and even the Sin(y) calculation completely is case Sin(x) is 0 (which would be the case in our example only for x == 0).&lt;/p&gt;

&lt;pre style="font-family: consolas"&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;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;double&lt;/span&gt;, &lt;span style="color: blue"&gt;double&lt;/span&gt;&amp;gt;&amp;gt; f = x =&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;br /&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;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (x != 0.0)&lt;br /&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;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; sinx = &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(x);&lt;br /&gt; &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; y =&amp;gt; sinx * &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sin(y);&lt;br /&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;&amp;#160;&amp;#160; }&lt;br /&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;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;br /&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;&amp;#160;&amp;#160; {&lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; y =&amp;gt; 0.0;&lt;br /&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;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };&lt;/pre&gt;

&lt;pre style="font-family: consolas"&gt;&amp;#160;&lt;/pre&gt;

&lt;p&gt;That is not worth it in this scenario (because the special case applies to less than 0.05 % of all cases), but in some scenarios &lt;a href="http://en.wikipedia.org/wiki/Run-time_algorithm_specialisation" target="_blank"&gt;runtime algorithm specialization&lt;/a&gt; can be very significant.&lt;/p&gt;</description><pubDate>Mon, 24 May 2010 05:20:23 -1200</pubDate><comments>http://blogs.u2u.be/kris/post/2010/05/24/Lambda-Curry.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=8f797c0e-a04e-4ed8-9693-b2b96578f932</pingback:target><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">176</slash:comments><trackback:ping xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">http://blogs.u2u.be/kris/trackback.axd?id=8f797c0e-a04e-4ed8-9693-b2b96578f932</trackback:ping><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/kris/post/2010/05/24/Lambda-Curry.aspx#comment</wfw:comment><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.u2u.be/kris/syndication.axd?post=8f797c0e-a04e-4ed8-9693-b2b96578f932</wfw:commentRss></item></channel></rss>