Dear visitor, thanks for stopping by! If you want, you can follow all updates on Snowball.be via RSS. You can also follow me on Twitter or Facebook. More interesting posts from other Microsoft Regional Directors can be found at The Region.
Gill Cleeren     .net | .NET 4 | Efficiency | Silverlight | sl4 | VS2010     September 4, 2010    

In April, I was in the UK for speaking at the VBUG conference and I was impressed by a demo given by Josh Twist. He built using MEF and WPF a “marketplace” application. The goal of the application was mainly showing the dynamic capabilities of adding new functionality to an application through MEF (or in full, the Managed Extensibility Framework for Silverlight 4).

For a presentation I’m giving shortly, I rebuilt something similar but in Silverlight: the MEF Marketplace in Silverlight. The setup is the following: a user gets an overview of apps he purchased in the market place and can run these on demand. The market place app will download the applications available to the user after the application has started, so this app mainly is a hosting shell for the other ‘purchased” applications to run in. Of course, the sample is a demo and can be extended quite a lot. For example, in the current implementation, I hard-coded the list of purchased apps and there’s no option to buy new ones. Also, it could be extended so that when new apps are purchased, a duplex service notifies the client of this and MEF downloads the new app in the background.

But, instead of talking of what could be added, let’s take a look at what I currently built already! Here’s a screenshot of the application showing the "purchased” applications.

SNAGHTMLaf6bd

And here’s one of the apps (the Flickr Image search) running inside the "market place shell”.

SNAGHTMLb8796

Time for some code. Let’s begin with the market place itself.

I defined a contract interface for all applications that can be loaded in the market place, IMarketPlaceApplication.

public interface IMarketPlaceApplication
{
    string ApplicationName { get; }
    FrameworkElement MarketPlaceIcon { get; }
    FrameworkElement MainView { get; }
}
This interface defines that all my apps will (of course) have a name, a default view which will load as the landing screen when the app is loaded (MainView.xaml) and an icon to show in the list (MarketPlaceIcon.xaml). As these 2 latest ones are XAML files, you can put in whatever you like.

A very easy application that will be possible to load from MEF is the HelloWorldApplication. The project structure of this app is as follows:

image

As you can see, there’s a class called HelloWorldApplication, which implements the IMarketPlaceApplication and 2 xaml files. The HelloWorldApplication code is shown below:

[Export(typeof(IMarketPlaceApplication))]
public class HelloWorldApplication: IMarketPlaceApplication
{
 
    #region IMarketPlaceApplication Members
 
    public string ApplicationName
    {
        get { return "Hello MEF world"; }
    }
 
    [Import(typeof(Icon))]
    public FrameworkElement MarketPlaceIcon
    {
        get;
        set;
    }
 
    [Import(typeof(HelloWorldView))]
    public FrameworkElement MainView
    {
        get;
        set;
    }
 
    #endregion
}

This is our first encounter with MEF. The first line uses the Export attribute. This class is saying that it is available for someone to use, when someone requests an instance of IMarketPlaceApplication. A bit further, we are using the Import attribute on both the MarketPlaceIcon and the MainView. Here we are saying: MEF, search us a class that’s exporting itself as type Icon and HelloWorldView respectively.

These 2 latter instances will be inserted by MEF upon executing the application, that is, if MEF finds the corresponding export. These exports can be found in the 2 XAML files (in the code-behind). The HelloWorldView.xaml.cs code is shown next. Note the Export attribute: we’re telling to MEF that this type can be used where an Import is requested of the HelloWorldView type.

[Export]
public partial class HelloWorldView : UserControl
{
    
    public HelloWorldView()
    {
        InitializeComponent();
    }
}

The Icon.xaml.cs is pretty similar code-behind-wise (I think I invented that term here): here alse we are adding an Export attribute.

[Export]
public partial class Icon : UserControl
{
    public Icon()
    {
        InitializeComponent();
    }
}

The HelloWorldApplication is at this point a stand-alone application (it compiles to its own XAP file), but we’ll now build the Market Place shell that will host this app. The code download at the end of the article contains several sample applications (a Flickr app and a Facebook app).

Similar to a real market place application, our implementation will get a list of apps you purchased previously. Only these are available to you and will be shown. To get this list, I wrote a basic Silverlight-enabled WCF service that fetches this list of available applications. This service is hosted in this case in the hosting website. The code below shows this service, which in this case returns a hard-coded list of apps (note that I have some more apps already added here).

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = 
    AspNetCompatibilityRequirementsMode.Allowed)]
public class MarketPlaceService
{
    [OperationContract]
    public List<MefApplication> GetAvailableApplicationsForUser()
    {
        return new List<MefApplication>()
        {
            new MefApplication(){ApplicationName="Flickr Image Search", 
                XapFileName="FlickImageSearch.xap"}, 
            new MefApplication(){ApplicationName="Hello World", 
                XapFileName="HelloWorldApplication.xap"},
            new MefApplication(){ApplicationName="MEFacebook", 
                XapFileName="FacebookApplication.xap"}
        };
    }
 
    // Add more operations here and mark them with [OperationContract]
}
 
[DataContract]
public class MefApplication
{
    [DataMember]
    public string ApplicationName { get; set; }
 
    [DataMember]
    public string XapFileName { get; set; }
}

The service uses the MefApplication class as a helper class: it contains the name of the application and more importantly, the name of the XAP file (this could easily be replaced with a Uri to the XAP file).

In the MefMarketPlace, the Silverlight Market Place application, we can create a web reference to this service. In the App.xaml.cs, I add a call to a new method, DownloadMyApplicationList():

private void Application_Startup(object sender, StartupEventArgs e)
{
    DownloadMyApplicationsList();
    this.RootVisual = new MainPage();
}

This new method makes the service call to get a list of available XAPs that I can use (apps that I purchased).

void DownloadMyApplicationsList()
{
    AggregateCatalog = new AggregateCatalog();
 
    container = new CompositionContainer(this.AggregateCatalog);
    CompositionHost.Initialize(container);
 
    MarketPlaceService.MarketPlaceServiceClient client = 
        new MarketPlaceService.MarketPlaceServiceClient();
    client.GetAvailableApplicationsForUserCompleted += 
        new EventHandler<MarketPlaceService.GetAvailableApplicationsForUserCompletedEventArgs>
            (client_GetAvailableApplicationsForUserCompleted);
    client.GetAvailableApplicationsForUserAsync();
}
 
void client_GetAvailableApplicationsForUserCompleted(object sender, 
    MarketPlaceService.GetAvailableApplicationsForUserCompletedEventArgs e)
{
    if (e.Error == null)
    {
        AvailableApplicationsForUser = e.Result;
        InitializeCatalog();
    }
}

In the callback method of the service, I call InitializeCatalog(). MEF has the concept of Catalogs: a Catalog can be used to tell MEF where it has to look for Parts. Several types of catalogs exist in MEF for Silverlight: the TypeCatalog, the AssemblyCatalog, the DeploymentCatalog and the AggregateCatalog. A TypeCatalog basically allows us to register a specific type with MEF: if I want MEF to know about a certain Export, I can register it in a TypeCatalog. An AssemblyCatalog tells MEF to look for parts in a specific assembly. The DeploymentCatalog allows us to specify a XAP file and MEF will look in the assemblies therein for parts. It also allows us to asynchronously download a XAP file. An AggregateCatalog can contain any number of other catalogs and more catalogs can be added at any time.

By default, if we don’t specify a Catalog for our application, MEF looks at the current XAP file and for each assembly it finds, it creates an AssemblyCatalog. It then combines these with an AggregateCatalog. That means that we can omit creating a catalog in our application: in this case, MEF will create a default one for us, with something similar to this code:

void InitializeCatalog()
{
    AggregateCatalog catalog = new AggregateCatalog();
 
    foreach (var deployedPart in Deployment.Current.Parts)
    {
        StreamResourceInfo resourceInfo = 
            Application.GetResourceStream(new Uri(deployedPart.Source, UriKind.Relative));
 
        Assembly assembly = deployedPart.Load(resourceInfo.Stream);
        catalog.Catalogs.Add(new AssemblyCatalog(assembly));
    }
 
    CompositionHost.Initialize(catalog);
}

Back to our application. If we look at the available catalogs in MEF, we can see that the DeploymentCatalog is a good candidate for what we need: we can use it to download a XAP file (the application that we want to load). After that, we can add each DeploymentCatalog to an AggregateCatalog. MEF will then make these available in our application and we can run the downloaded applications.

In code, this gives the following:

private CompositionContainer container;
void InitializeCatalog()
{
 
    foreach (var item in AvailableApplicationsForUser)
    {
        DeploymentCatalog deploymentCatalog = 
            new DeploymentCatalog(item.XapFileName);
        this.AggregateCatalog.Catalogs.Add(deploymentCatalog);
 
        deploymentCatalog.DownloadCompleted += (s, e) =>
        {
            //extend to give meaningful error handling
            if (e.Error != null)
                MessageBox.Show(e.Error.Message);
        };
 
        deploymentCatalog.DownloadAsync();
    }
 
    container.ComposeParts(this);
}

You can see that I use a CompositionContainer here. The container is well, like the word says it, a container where MEF puts all the parts, shakes it up and creates/composes parts.

We now have the code that runs when we start the application: it gets a list of all the applications we can use over the service and then it downloads the XAP files of these apps asynchronously. Each XAP file is downloaded using a DeploymentCatalog and these are added to an AggregateCatalog. This now makes our downloaded applications available to run.

Let’s now take a look at the UI where we’ll run the apps from. The following screenshot shows the UI:

image

The “Load my apps'” button on the top right will execute a command on the viewmodel that will load all available applications in the ListBox on the left.

image

When clicking on the “Load app” button, the selected application (here the Flickr app) is loaded:

image

Clicking the “Home” button unloads the app and returns us to the list screen.

The complete XAML listing can be found in the code download. The most important part is shown below. Note that there’s a ContentPresenter used here and it’s bound to the MainView property of the SelectedApplication. The latter is a property exposed on the viewmodel (see further). If no view/app is selected, this ContentPresenter won’t be visible and we’ll see the default UI again.

<Grid x:Name="LayoutRoot" Background="Black">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"></RowDefinition>
        <RowDefinition Height="60"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid>
        ...
    </Grid>
 
    <ContentPresenter Content="{Binding SelectedApplication.MainView}">
    </ContentPresenter>
    <Button Grid.Row="1" Content="Home" Margin="10" Background="#FFABE3FF" 
            Command="{Binding HomeCommand}" BorderBrush="#FF00AAFF" 
            Style="{StaticResource ButtonStyle1}" 
            Width="130" Height="40" HorizontalAlignment="Center" 
            VerticalAlignment="Center"></Button>
</Grid>

Time to look at the viewmodel now. Probably the most important part here is the ObservableCollection<IMarketPlaceApplication>:

[ImportMany(AllowRecomposition=true)]
public ObservableCollection<IMarketPlaceApplication> Applications
{
    get
    {
        return _applications;
    }
}

The ListBox in the UI is bound to this collection and since it’s an ObservableCollection, the UI will reflect changes to this collection. That’s important here, since the list of available apps won’t be known after the shell contacted the service. Note that the collection property is attributed with the ImportMany attribute. This is a sign for MEF that more than one part that is exposing itself with the same Export attribute (same type) is allowed. By default, this isn’t allowed since MEF wouldn’t know which one to use. Here, we want the ImportMany since we know that more than one app will be available and they all need to be exported as an IMarketPlaceApplication. Another important thing to note here is the AllowRecomposition option we used here. AllowRecomposition tells MEF that if during the run of the app more Exports become available for this Import, it’s OK to add them, in other words, to rebuild the composition.

The ContentPresenter in the UI bound to SelectedApplication.MainView. The SelectedApplication property is shown next.

private IMarketPlaceApplication _selectedApplication;
 
public IMarketPlaceApplication SelectedApplication 
{
    get
    {
        return _selectedApplication;
    }
    set
    {
        _selectedApplication = value;
        NotifyPropertyChanged("SelectedApplication");
    }
}

NotifyPropertyChanged is a simple method that raises the PropertyChanged event of the INotifyPropertyChanged interface.

private void NotifyPropertyChanged(string p)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(p));
    }
}

The “Load apps” button in the UI is bound to the LoadAppsCommand. I use the MVVM Light RelayCommand here. In the execute code of the ICommand, I ask MEF to satisfy the Imports of the current class (the viewmodel). This basically tells MEF to look at the catalogs and bring all the Export(typeof(IMarketPlaceApplication)) into the ImportMany.

public RelayCommand LoadAppsCommand
{
    get
    {
        if (_loadAppsCommand == null)
        {
            _loadAppsCommand = new RelayCommand(
                    () =>
                    {
                        CompositionInitializer.SatisfyImports(this);
                        loaded = true;
                    },
                    () =>
                    {
                        if (loaded)
                            return false;
                        return true;
                    }
                );
        }
        return _loadAppsCommand;
    }
}

The LoadSelectedApplicationCommand and the HomeCommand respectively set the SelectedApplication property to the selected application in the list or null.

public RelayCommand<IMarketPlaceApplication> LoadSelectedAppCommand
{
    get
    {
        if (_loadSelectedAppCommand == null)
        {
            _loadSelectedAppCommand = new RelayCommand<IMarketPlaceApplication>(
                    (a) => 
                    { 
                        SelectedApplication = a; 
                    }
                );
        }
        return _loadSelectedAppCommand;
    }
}
 
 
public RelayCommand HomeCommand
{
    get
    {
        if (_homeCommand == null)
        {
            _homeCommand = new RelayCommand(
                    () =>
                    {
                        SelectedApplication = null;
                    }
                );
        }
        return _homeCommand;
    }
}

With that, we have successfully implemented the MEF Marketplace. As said in the very beginning, this can be extended quite a lot. Add a duplex service and a buying system that pushes a message to the client and trigger the client to download the linked XAP file is a nice way to start. The complete file can be downloaded below.

Enjoy!

Code download: MefMarketPlace.zip (868.99 KB)

  Posted on: Saturday, September 04, 2010 11:25:11 PM (Romance Daylight Time, UTC+02:00)   |   Comments [2]
         
Gill Cleeren     .net | .NET 4 | C# | Silverlight | sl4 | VS2010     April 12, 2010    

After beta’s and one RC release, starting today, we can get our hands on Visual Studio 2010 RTM. Just hours ago, Microsoft held a keynote on the release of their flagship IDE, Visual Studio 2010. This release coincides with the release of .NET 4.0 and of course Silverlight 4, which has its official launch event tomorrow. This marks probably the largest release ever for developers from Microsoft.

 image

I need it badly

Visual Studio 2010 is like honey, developers swarm to it. It’s understandable that you want to get your hands on the bits. Where can you get them?
If you’re an MSDN subscriber, you’re in luck, as you can get all the bits from the MSDN subscription site. (http://msdn.microsoft.com/subscriptions)
If you are not, you have the following options:

image

 

Why you need it

If I wanted to make a list of reasons why you should be upgrading to Visual Studio 2010, I would be up all night I think. Since it’s quite late already, I’m going to make an all-but-complete list with my top features that make Visual Studio 2010 an not-to-miss upgrade. (For the complete list – you’re warned, it’s very complete – take a look here: http://msdn.microsoft.com/en-us/library/bb386063(VS.100).aspx)

The IDE looks really stylish!

Upon opening Visual Studio 2010 for the first time, you’ll immediately notice that something happened… Something big. No longer the traditional grey interface, but an exciting new look for the place you spend all your development hours in. Built entirely in WPF, the new shell offers plenty of extension points so you can make it feel even more like home.

image

New IDE features

I personally like the Navigate To function a lot (I blogged about it yesterday here: Visual Studio 2010 Tip- Navigate to functionality). Another one I like is the zoom in/out we can now do in the code editor. This is a real life-saver when doing demos on stage or when showing someone some code. Simply keep CTRL key pressed and rotate that mouse wheel of yours. For people who work on multiple monitors, Visual Studio now supports this much better!

Some other nice features:

  • Improved IntelliSense
  • Highlight references
  • Stub generation

New framework and languages

Visual Studio 2010 comes packed with new releases.

  • Silverlight 4 :) More on this at the launch event tomorrow!
  • C# 4.0 adds interesting new features to the language (more here). Also VB.net developers aren’t left outside in the cold, their favorite language gets an upgrade as well to Visual Basic 2010.
  • ASP.NET 4.0 as well as MVC 2 are born! If you want to get an overview of what’s new, download my talk of DevDays 2010 here. Most striking new features in WebForms 4 are client IDs, control over ViewState and more control over the HTML that’s being rendered.
  • Entity Framework makes a jump and goes straight to v4.
  • WCF and WF both get an upgrade to v4 as well.
  • TFS installation gets really simple using TFS Basic.
  • F# is now available for the functional programming needs.
  • SharePoint templates!

I want more

Not enough reading material for your brain? A free ebook is made available “Moving to Visual Studio 2010” here.

Warnings here!

Something to watch out for: currently, the Windows Phone 7 tools do not work with the RTM version of 2010. Read more on this here: http://forums.silverlight.net/forums/t/175181.aspx 

image

  Posted on: Monday, April 12, 2010 11:54:13 PM (Romance Daylight Time, UTC+02:00)   |   Comments [1]
         
Gill Cleeren     .NET 4 | Efficiency | VS2010     April 11, 2010    

Very often, you need to navigate to a class while coding. Perhaps a class you wrote yourself, perhaps you just want to see the members of a type of the .NET framework.

Visual Studio 2010 has THE ultimate feature for this, namely the Navigate To function. What you do, is hit CTRL + , (yes, indeed the comma) and it will open the Navigate To window, as shown below.

image

This window follows the same rules as the new IntelliSense: if I’m searching for a property “OverPaid”, I can search by typing Over… or just use OP.

image

If you have some text already selected in the code editor, the window will perform its search from there.

image

  Posted on: Monday, April 12, 2010 12:04:55 AM (Romance Daylight Time, UTC+02:00)   |   Comments [0]
         
Gill Cleeren     .NET 4 | VS2010     October 21, 2009    

The new shell written in WPF in VS2010 opens a whole set of options. Take for example the Recent Projects module. In previous versions, it always showed the last opened projects, without giving us any influence on what it should be displaying. It happened to me a lot that I’m working on a project, but by giving a session with some demos, my “real” projects were removed from the list.

In VS2010, we now have the option to tweak it like we want.

image

For example, we can pin a project, so that it isn’t removed anymore, like so:

image

Or we can remove any temporary or old projects as shown below:

image

  Posted on: Wednesday, October 21, 2009 11:31:03 PM (Romance Daylight Time, UTC+02:00)   |   Comments [0]
         
Gill Cleeren     Microsoft | VS2010     October 20, 2009    

Not only does the new MSDN site look a lot cleaner, it’s also adaptive to your browsing needs.

Head to any page in the MSDN library and at the bottom, you should see a floating Switch block.

image

This gives you the option to switch to a lightweight version…

image

or a script-free version, handy for mobile devices.

image

  Posted on: Tuesday, October 20, 2009 2:37:50 PM (Romance Daylight Time, UTC+02:00)   |   Comments [0]
         
Gill Cleeren     .NET 4 | TFS | Visual Studio.net | VS2010     October 20, 2009    

One of the new features of the 2010 platform, is the ability to install Team Foundation Server on a client OS, like Vista or Windows 7, 32 or 64 bit. It runs on SQL Express as database, which if not installed on your machine, will be installed by the setup configuration of TFS.

My personal setup is going to be a virtual machine in which I install TFS Basic. From my host OS, which has VS2010 installed along with Team Explorer, I can easily connect to it.

In this post, I wanted to show how easy it is to get things running on a Windows 7 (virtual) machine.

1. Installing Team Foundation Server

The installation for TFS basic is the same as for the fully-featured version. Run setup.exe from the disk (32bit or 64bit, depending on your OS).

You should see the following wizard.

1

2

By default, nothing is checked. Check the Team Foundation components checkbox.

3

4

5

2. Configuration of TFS so that it will become TFS Basic

At this point, things have been installed, but nothing is running yet. The configuration wizard should start up, as shown in the following screenshot.

6

Now we get the choice to either install basic, advanced, application tier or upgrade. Select upgrade and click on Start Wizard. This wizard will now guide you through the required steps. On my machine, SQL Server Express 2008 was already installed, so the wizard skipped this installation.

7

8

 9

 10

The wizard will now check if all my selections are possible with my config. If so, we can continue.

11 

Success, we’re good to go!

12

Installation has started.

 13

Finished setting up everything…

 14

TFS Basic is ready, here’s the address of your personal TFS Basic server.

 15

3. Team Explorer is called to the scene

To use my TFS instance from Visual Studio, I need to install Team Explorer. It can be found on the installation iso from TFS. Run its setup.

 16

 17

Installing…

18

And complete!

 19

4. Visual Studio 2010 now with Team Explorer

In Visual Studio’s Team Explorer, click on Connect with Team Project. Add your server as shown below:

20

From File > New Team Project, you can start a new team project.

21

And there we have it, a completely configured system with Visual Studio 2010 and TFS Basic!

22

  Posted on: Tuesday, October 20, 2009 1:50:00 PM (Romance Daylight Time, UTC+02:00)   |   Comments [0]
         
Gill Cleeren     Efficiency | VS2010     January 1, 2009    

For an article I'm writing on C# 4.0, I really need the Visual Studio 2010 CTP (September release). However, as you may have experienced today, January 1st, the CTP is expiring: Visual Studio 2010's "trial period" has expired. The CTP is only available as a Virtual PC image, and a VPC image by default will take the date settings from the host OS.

Now, I found there's a settings in the *.vmc (Virtual Machine configuration) file that disables the synchronization between the host and the guest OS. By activating this setting, the VPC's time will only advance when it's powered on. When extracting the VPC the first time, the time is set to October 10th 2008, giving you all the time you need to play with the VPC.

Here's how to apply the setting. Open the *.vmc file and look for the <mouse> tag.
<mouse>
     <allow type="boolean">true</allow>
</mouse>
<video>
     <user_selected>
     .....


Between the </mouse> and <user_selected>, add the following tag:

<components>
     <host_time_sync>
          <enabled type="boolean">false</enabled>
     </host_time_sync>
</components>

Now, boot the VPC and it will now stop syncing the two clocks.

  Posted on: Thursday, January 01, 2009 8:37:47 PM (Romance Standard Time, UTC+01:00)   |   Comments [4]
         
Gill Cleeren     VS2010     October 2, 2008    

You may already have heard about this one, but this week is really Visual Studio 2010 week!.
Every day of the week, a bunch of new videos is added on Channel9. The one thing they have in common: VS 2010!

Here's the current list:

Announcement:
Announcing Visual Studio Team System 2010

Architecture:
Cameron Skinner: Visual Studio Team System 2010 - Architecture
"Top-down" design with Visual Studio Team System 2010
"Bottom-up" Design with Visual Studio Team System 2010 Architect
ARCast.TV - Peter Provost on what’s coming for Architects in Visual Studio Team System

Business Alignment:
Achieving Business Alignment with Visual Studio Team System 2010
Agile Planning Templates in Visual Studio Team System 2010
Enterprise Project Management with Visual Studio Team System 2010
Requirements Management and Traceability with Visual Studio Team System 2010

More videos will be added on Thursday and Friday. Exactly when I'm going away for the weekend... :(

  Posted on: Thursday, October 02, 2008 6:11:29 PM (Romance Daylight Time, UTC+02:00)   |   Comments [0]
         
2/4/2012   4:29:48 PM
 Welcome to Snowball.be
Hello and welcome to snowball.be!

My name is Gill Cleeren, I'm a Microsoft Regional Director and an MVP ASP.NET.
On Snowball.be, you'll find all kind news and articles on .net, ASP.NET, WPF, Silverlight and Microsoft in general.
More on me can be found on my about page.

Should you have any questions, don't hesitate to contact me by Send mail to the author(s) .

 Partner sites
 Most popular tags
.net (124) .net 3.0 (6) .net 3.5 (18) .NET 4 (18) .NET Show (1) ADO.net (4) ASP.net (53) ASP.net AJAX (4) ASP.NET MVC (3) Atlas (12) Azure (2) Blend (2) Book (5) Book review (4) C# (43) Case studies (1) Chopsticks (3) Community (10) Community Day (15) Consoles (1) Database (1) DevDays09 (4) DotNetNuke (4) Efficiency (57) Enterprise Library (5) Events (60) Expression (7) Games (3) Hardware (9) Internet (18) IT (1) jQuery (1) LightSwitch (3) Links (11) LINQ (4) Mac (2) Metro (1) Microsoft (75) Mix 07 (6) Mix 08 (4) Mix 09 (1) Mix 11 (1) Movies (4) MVP (5) MVP Summit 2008 (3) mvvm (1) Office 2007 (10) Other (8) PDC (22) PDC2008 (10) Personal (36) ppt (9) Programming (52) Programming tools (22) Regional Director (2) Silverlight (142) Silverlight Advent Calendar (24) sl4 (44) Slide decks (13) Snowball (13) Software (20) Microsoft (25) Speaking (14) SQL Server (10) TechDays (13) TechEd (14) telerik (6) Telerik (6) TFS (1) Twitter (1) Vista (73) Vista Tricks (9) Visual Studio.net (38) Visug (33) VS2010 (8) Wallpaper (2) WCF (2) Webcasts (9) Webinars (5) Windows (41) Windows 7 (5) Windows 8 (1) Windows Azure (2) Windows Mobile (3) Windows Phone 7 (2) WinFX (17) WinRT (1) WP7 (2) WPF (40) XAML (24)

 On this page
 This site
 Archives
Navigation
 Sitemap
 Blogroll OPML
 Disclaimer

All content is property of www.snowball.be. Nothing on this site can be copied or published elsewhere, unless otherwise stated.

This site is made by Gill Cleeren.

Questions? Opinions? Send mail to the author(s) E-mail