.NET RIA Services Validation and Authentication Talk (Code)

November 26, 2009

Last month I did a presentation at SDDN in Melbourne on RIA Services and it’s in built authentication and validation features.

The code is posted here:

<Sample Code>

.NET Ria Services Authentication and Validation Demo Code

</Sample Code>

The talk started off by running through the UserDTO object – under Services/DomainObjects. This object is exposed through the UserRegistrationService under /Services.

Next you’ll want to familiarise with the LoginManager in the Silverlight project (under Model/LoginManager.cs).

I then added some custom validation to the UserDTO object.

Next I created a UserValitator.shared.cs file under Services/DomainObjects and applied a metadata attribute to UserDTO to connect the two. .shared.cs files will be automatically made available to Silverlight by RIA Services.

The login stuff is built using the standard ASP.NET membership SQL provider, and the built in RIA Services abilities around this.

Read through LoginManager.cs see how the forms authentication object is created, and how the system uses the AuthenciationDomainContext, which is created on the sever in Services/DomainObjects. AuthenticationDomainService on the server contains the goods to validate a user and also provides a User class, which you can extend.

There is also a UserRegistration context in LoginManager which allows you to create a new user. See UserRegistrationService.cs on the server (under Services/DomainObjects) to see how this works (by using the MembershipHelper class).

See the Web.config to note how the system is configured to use the SQL connection, and in the membership section note that it is configured to use this same SQL connection.
You’ll need to configure your SQL database as well – to create the ASP.NET membership tables… run aspnet_regsql.exe (in C:\Windows\Microsoft.NET\Framework\v2.0.50727) from an elevated prompt to start the wizard.

This should be enough to get you started.

BTW, there is some great doco on this in the .NET RIA Services PDF file…

Enjoy!


Silverlight Code Camp 30/31 Jan 2010 – Melbourne

November 24, 2009

The first Silverlight Code Camp is being held in Melbourne on the weekend of Jan 30 and 31 2010 in Melbourne!

Split in to two distinct tracks, Beginner and Advanced there will be something for everyone. Each track will contain 10 sessions split over the two days, for a massive total of 20 unique sessions all based on Silverlight!

For more information see http://sddn.org.au/news/silverlight-code-camp-30-31-jan-2010-melbourne/

See you there!


Next Melbourne SDDN Meeting – 29th Oct

October 22, 2009

Hey all!

After a short hiatus we’re back with more meetings. We’ve had a break due to a mixture of Tech.Ed, holidays and – would you belive – jury duty.

We’ve got two great talks lined up – from Phil Beadle on Unit Testing in Silverlight and from myself on .NET RIA Services validation.

How I unit test a Silverlight application – Phil Beadle

This session will cover how to architect a Silverlight application so that it can be thoroughly tested.

Time: ~1 hour.

Phil will cover:

  • The MVVM pattern
  • How to unit test the View Model
  • Using unity as an IoC
  • Using Moq to mock out the Model
  • Using the Silverlight Unit test framework to test the UI
  • Using a Mock domain client to mock out the calls to the database from a RIA service

Philip has extensive experience using these techniques in production projects, so this will be a talk not to be missed.

Philip is a DotNetNuke Trustee and works for Readily as a Principal Consultant specialising in Silverlight, DotNetNuke and ASP.Net. Philip has a large amount of experience building all sorts of online properties ranging from small personal sites to massive traffic sites such as the AFL website. Philip is also known for his passion for testing and is the lead for the new QA Team on DotNetNuke which will implement unit testing and integration testing in the coming months

.NET RIA Services Validation – Jordan Knight

Time: ~30 minutes.

This session will cover some basic .NET RIA Services concepts before delving in to to world of validations.

See how easy it is to create shared custom validation code in your applications (run on client and server).

Jordan is a Senior Consultant at Readify and is a regular on the Silverlight scene in Australia, having presented at a number of conferences including ReMix and Tech.Ed Australia and New Zealand.

Late Addition!

David Burela asked if he could give a quick 10 minute demo on some Bing Maps stuff he has been working on… why of course David!

The new Bing Maps virtual earth control lacks basic databinding, you have to manualy add pushpins and map shapes. This quick demo will demonstrate how you can import a single library to enable databinding to the bing maps control, and then create the datatemplates you need to databind your shapes directly to the map.

David is a Senior Developer at Readify who last year won the Microsoft imagine cup for his work on SOAK.

When: Thursday October 29, 5:30 for 6:00 start

Where: Microsoft Theatre, Level 5, 4 Freshwater Place, Southbank

Pizza will be provided to keep those tummies from rumbling.

Attendance is FREE but please register using the tool on the SDDN Site so we can figure how much PIZZA to get!


Tech.Ed Australia and New Zealand Code

September 28, 2009

Exploding elements, MVVM, Prism, Unity, RIA Service and offline apps!

Well the Tech.Ed time of year is over and let me tell you I had a fantastic time!

I was lucky enough to be asked to present a number of sessions in both Australia and New Zealand:

  • Going Deeper in Silverlight 3 (AU WEB309, NZ WUX301)
  • Architectural Considerations for Silverlight (AU ARC401, NZ ARC301)
  • Live Meeting stream of Going Deeper in Silverlight 3
  • Silverlight Birds of a Feather Lunch
  • A panel discussion on Rich vs Reach in Australia
  • A panel discussion on Designer and Developer workflow in New Zealand

All in all it was a massive fortnight and I’m only starting to catch up with the real world now!

As promised I’m releasing the code from my talks here.

The Architectural Considerations demo code should just start… but the Going Deeper code may need some “jiggling” as it is using IIS to run (so you can start and stop IIS to see server ping working).

<Sample Code>

TechEd 09 Australia and New Zealand Demo Code

</Sample Code>

  • Make sure you run VS as elevated
  • Once the IIS site has been created, go to IIS settings, create a new app pool. Run this app pool as local system (never do this in production!!). Make sure you set your site to use the new app pool. Without this the database would not load for me
  • Ensure you set the web project and sample ASPX file as start up

Both my talks take the real world approach – I didn’t want to just talk about stuff you can easily find by searching the ‘net – I wanted to show methods that I would employ in a real world application if asked to use these features.

The Architecture talk also concentrated heavily on how you can set up your project to make it nice and easy for developers to extend and maintain the application using Prism and MVVM.

This said, keep in mind this *is* demo code :)

Going Deeper in Silverlight 3

This session was split in to two sections – first we talked about some of the UI enhancements in Silverlight 3 then on to some of the more business style enhancements.

Perspective 3D

For perspective 3d and plane projection I demonstrated how to create a control based on ItemsControl to convert a standard boring old items list in to a fully 3d tag cloud complete with mouse interaction to move the items around the screen.

This can be found under Controls/3D/TagCloud and TagCloud item.

The ItemsControl (TagCloud) creates the item wrapper control (TagCloudItem). This is required for all items controls. For comparison ListBox control uses ListBoxItem <- each item in the list is wrapped in in a ListBoxItem, to which the DataTemplate is applied. A few methods are overridden in TagCloud, including GetContainerForItemOverride (create the TagCloudItem), IsItemItsOwnContainerOverride (to check that the user didn’t add TagCloudItems to the ItemsSource of the TagCloud) and PrepareContainerForItemOverride (which isn’t used, but gives you the chance to do something with the TagCloudItem and the data that will be applied to it).

The TagCloudItem is then responsible for making itself 3d. This is a great approach because you can template each item like normal, but the TagCloudItem brings the extra 3d behaviour – staying completely away from template modification and it will work straight out of the box when inserted in to a page.

The TagCloud is applied in MainPage.xaml.

Animation Easing

After a quick introduction to animation easing in Blend, I demonstrated how to create a custom animation easing function. The function is called RandomEase and can be found in Controls/Easing/RandomEase.cs.

This easing function basically takes any animation and randomises it – the best way to see this in action is to just run the app, 1000 words and all that. You will see my blog url in the bottom right of the app going crazy :)

The easing function is applied to the animations in MainPage.xaml in the UserControl.Resources section.

Behaviours, WritableBitmap and Perspective 3D

To demonstrate behaviours I created a special behavior called SuperVortex (Controls/Behavior/SuperVortex). There are two versions of this control, one which targets my custom control called TimerContentControl and one which can target any panel (Canvas, Grid etc).

The TimerControlControl is a cool little control I created which has a couple of states – one for when it’s content is null and one for when it’s content is set. This control is then bound to a property in the ViewModel, and when that property changes the control switches states allowing it to be shown on the screen. The control will show for a number of seconds before timing out the hiding itself again.

The SuperVortex behavior is then added to this control. A few seconds after the TimerContentControl is shown the SuperVortex kicks in and breaks the control in to a number of separate tiles, makes them spin around the screen before disappearing off in to the ether.

It achieves this by calculating a range of 50×50 tiles, then using the WritableBitmap control it splits it up by taking multiple snapshots of the control. Each snapshot uses a TranslateTransform to position itself to take a snapshot of the control in the right spot, creating a 50×50 tile. This snapshot is then added to a dynamically created image which is in turn added to the page (once again using another translate transform to reposition it where the original snapshot was crated).

Once all the tiles are created and overlaid, the original control is hidden. PlaneProjection is then used to spin the image tiles around of off the screen.

OOB and Network Detection

This is my favourite part of the talk – it revolves around using real world network detection, a service manager, a service locator and dependency injection to create a nice little loosely coupled network dection and management of online and offline services solution.

All data access in the application is performed through “repositories”. A repository is a small class which contains all the operations required to get data from the server. Each repository only contains methods to get a particular entity type. In this case we are getting Player entities from the server, so our repositories are called PlayerRespoistory. There are two PlayerRepositories, one for Online and for Offline.

The PlayerRepositories implement IPlayerRepository. When using a repository in code the app always references IPlayerRepository.

It all starts with the NetworkManagementService (Model\AppServices\NetworkStatusManager.cs). This service starts with the application (it implements IApplicationService). It then hooks up to the network changed events. Then it checks to see if the network adaptor is available. If it isn’t then it sets itself to be offline (firing events too). If the network adaptor is available, it will start a timer which will ping the server (using .NET RIA Services) to see if it is available. It then fires events based on whether the server is there or not.

These network events are detected by the ServiceManager. The ServiceManager is provided an instance of the Unity IOC Container. The Unity IOC container allows you to configure which concrete class will be resolved at a given time. As the network state changes from NetworkManagementService, the ServiceManager changes Unity to resolve a different version of the PlayerRepository by configuring IPlayerRepository to resolve to the online or offline version.

The ViewModel then asks the ServiceLocator for the IPlayerRepository. The ServiceLocator also uses Unity – this time to resolve the dependency. The ServiceLocator can just ask Unity to resolve the IPlayerRepository without having to know about the NetworkManagementService or the ServiceManager (i.e. it is loosely coupled). This is great as it makes it very easy to alter the behavior of the network and service management stuff without the rest of the application worrying about it.

Online and Offline

The two repositories operate different to each other. They both have to same methods to please the IPlayerRepository interface, but internally they do different things. First, the online version will serialise the retrieved entities to Isolated Storage for later retrieval, and the offline version will check for these saved entities, and deserialise them if available.

Once the application is running if you stop IIS the system will automatically switch between online and offline versions of the repositories, allowing offline data access.

Architectural Considerations for Silverlight

In this talk I (with Mahesh in Australia!) demonstrated more real world scenarios, this time around Prism (Composite UI) and MVVM (Model-View-ViewModel).

This talk takes the approach of creating good Silverlight architecture around these concepts to assist developers in working on the code on a day to day basis. It hides the complexity of using MVVM and Prism in a set of self documenting base classes. Developers that use these classes will find it very easy to create new Prism modules and ViewModels.

Prism

First up the Prism stuff. I demonstrated how easy it can be to create a new module with Prism with a simple Module base class, ViewModel base class and an interface for your views (called IView). The ViewModelBase base class takes the IView in its constructor and then using this interface is able to apply itself to the DataContext of the View (through the only method, ApplyModel). So now the ViewModelBase class will automatically do View hookup for us.

Then you create a new Prism module class and base it on ModuleBase. This class has one abstract method called Initialize. It also requires IUnityContainer and IRegionManager in its constructor (these are used by the base class).

In the Initialize method we call Register<ViewType, ViewModelType>(“RegionName”);. This makes it very easy for developers to create a view and view model, have the view model married up to the view and then register them in to a region. It uses Unity to create the instances (check out the Register method to see how). Because of the generic method, it is very self documenting and developers will be able to follow this without any extra instruction.

MVVM

For the last part of this talk I demonstrated a series of ViewModel base classes that I’ve been working on and improving for a while now.

The basic idea is that I wanted to create ViewModel base classes to encapsulate CRUD operations for both single entities and lists of entities.

EditableEntityViewModelBase

This view model class has all the commands and operations required to edit a single entity. It is based on ViewModelBase so can do to auto view model hookup talked about above. This class contains Commands which can be bound to buttons in the UI to allow the Save and Cancel edit of entities. What’s cool here is that using RIA Services, cancel will automatically roll back the edit of the entity. It also contains things like validation, logs errors in to an ObservableCollection for easy binding to the UI etc.

EditableCollectionViewModelBase

This view model allows for the editing of multiple items in a list. It is based on EditableEntityViewModelBase. This means that it can be used to edit the collection and also single items in the collection.

What’s cool here is that you can add new items, edit existing items, then click cancel – the new items will be removed again and the existing items will be reverted.

CharacterEditViewModel

This view model is based on EditableCollectionViewModel. It basically only has to get a list of the characters from the repository, other than this all other functionality is gained from the base classes.

As the base classes are once again generic they are self documenting to the developer – the developer cannot implement these classes wrong without getting a compiler error.

DataForm Commands

The edit screens use the Silverlight ToolKits DataForm. This control allows you to create edit forms for entities, complete with validation. The problem is that when the save or cancel buttons are pressed you need a way to inform the ViewModel that something happened. You don’t want to create any code behind in your view to do this or you are breaking the MVVM pattern.

To solve this I created a custom command handler that hooks up to the DataForm and allows commands to be bound that will fire when the DataForm Saves or Cancels. These commands are then bound up to the Commands from EditableEntityViewModel base… a nice solution all round.

Thanks!

As always if you have any questions or comments please don’t hesitate to ping me a comment, or contact me on twitter (@jakkaj).

Cheers!

Jordan.


Tech.Ed 2009 – Gold Coast and Auckland

September 1, 2009

Well it’s that time of year again when we get the chance to hang out with like minded geeks in conference mode!

I was very lucky this year to be selected to present a couple of break out session in both Gold Coast and Auckland – WOOT!

My sessions are:

Australia

ARC401 Architectural considerations for creating Silverlight Applications
Thu 9/10 | 17:00-18:15 | Arena 1B

This session has actually been dropped to level 300 now, but it’s still awesome :)

- and –

WEB309 Going deeper in Silverlight 3
Fri 9/11 | 13:45-15:00 | Meeting Room 5

New Zealand

ARC301 Architectural considerations for creating Silverlight Applications
Tue 9/15 | 14:20-15:35 | New Zealand Room 2

- and –

WUX301 Going Deeper in Silverlight 3
Wed 9/16 | 9:00-10:15 | Ballroom 2

Also cool is that we are holding a special lunch for Silverlight geeks on Wednesday (Gold Coast) from 12:45 – 1:45 in Meeting Room 6. You can add it to your session planners via session code BOF001. The topic: “Smash lunch -> talk Silverlight. Join moi and other members of the local community for an hour of Silverlight discussion. You drive – no slides welcome.”

Come along to the lunch so we can all identify each other as Silverlight geeks throughout the conference!

Last year was my first taste of Tech.Ed and boy I didn’t know what I was missing! Suffice it to say I’m looking forward very much to Tech.Ed this year – perhaps ever have a beer or two here or there :)

Make sure you come and say hello!


Eventr with video overlays

August 6, 2009

I’ve just updated eventr with a new feature – the ability to video over an image. When the user zooms in enough on an image a video may be played on top of that image. If a slide show is running the show will be paused until the video has finished playing!

Check out a video of it in action here.

At Remix Australia we used this to great effect at the Readify booth. We had a list of client logos mixed in with images of a couple of projects (web site and WPF app) that we have built. The images in the deep zoom for these items were actually the first frame of a demo video which was recorded specifically for the event. When the slide show gets to one of these video enable items, the video fades in and starts playing… the effect is fantastic – it really looks like the deep zoom is coming to life! What’s really cool is if you zoom in or out a bit, or pan around the deep zoom the video moves and zooms with it .

You can see it in action here. Play the slide show – you’ll see the video over the third image (it may take a second to buffer).

It’s really easy to use…

The latest check in to the eventr project includes the ability to show video (and includes a sample video). Edit the ImageData.xml file on the server and you will see some items have a “video” attribute on them – this is the relative (from the XAP package) path to the video… you can go crazy!

The latest check in to eventr includes another change – the dependency on the WCF service has been removed, so now the application can be hosted on any server (it now gets the XML data from the server using standard web client requests). This does however mean that the system no longer records user views of images (metrics). It should be heaps easier to set up now though!


New SDDN Site Design

July 23, 2009

I know we’ve been promising a new SDDN site for like almost a year now – well finally we got our asses in to gear and have something coming!

Alex Knight (my brother from the same motha) of AGKDesign and SilverZine fame (and being my brother fame too :P ) sat down 6 months ago and ripped out this design:

SDDN New Site Design

It’s gonna rock hey!

Well now @rosscify is going to build it in Graffiti for us!

Can’t bloody wait!


SDDN Sydney – 4th August 2009

July 23, 2009

This month Jose Fajardo from Cynergy Systems will talk on “Don’t lose site of what’s important, Interactivity and Experience” at the Crown Hotel. Here are all the details.


SDDN with Scott Barnes, Product Manager, Microsoft

July 20, 2009

This week there are two SDDN events, one in Perth on Wednesday 22nd July(link) and Melbourne on Thursday 23rd July.

Our special guest Scott Barnes will be running through all the new bits in Silverlight 3 + Expression Blend 3.

Scott Barnes’ Australian Silverlight & Expression 3 Tour

Silverlight & Expression 3 launch is an important moment in Microsoft’s timeline, as this is their V3 moment! In light of this point in time, Scott has vowed to ensure all within his beloved home, Australia, get a deep insight into what just happened in both Silverlight and Expression 3.

Not only will Scott cover off some of the new stuff, but will highlight some of the existing brilliance within these products through examples and commentary of how the old and new features came to be (as well as hints to both product’s future).

In this session you not only will hear all of this, but this is also a perfect opportunity to lobby for what you want to see in Silverlight & Expression 4!

Yes, not only did Microsoft just finish work on 3, but they’re keen to get started on the next version – given Scott is on the planning team, this is a great opportunity for you to influence the future of Microsoft’s UX Platform.

Scott Barnes is a Product Manager for the Rich Client Platform team at Microsoft, with a focus on Silverlight

When and Where?

The date and time: Thursday July 23 at 5:30 PM for a 6:00 PM start.
The venue is Microsoft Theatre, Level 5, 4 Freshwater Place, Southbank.

Attendance is FREE, but please RSVP by entering your details in the registration tool on the site (http://www.sddn.org.au) or send an email to info@sddn.org.au.

Pizza will be provided to keep those tummies from rumbling.

Cheers,

Jordan.

P.S. Don’t miss the Nerd Dinner on Tuesday night (21st July)!


Eventr – Your Flexible DeepZoom Reference App

July 9, 2009

A few weeks ago at Remix Australia I launched an open source project called Eventr which is a reference application for using Silverlight’s deep zoom technology. Check out the sample application here.

The project is composed of the SuperDeepZoom control, an adaptable wrapper around the MultiScaleImage control (which is how Deep Zoom is implemented in Silverlight) – and a sample application which hosts the control and handles the data loading, templates and general behaviour).

Together the SuperDeepZoom control and host application can do some pretty cool things – think of this project as Hard Rock Cafe Memorabilia deep zoom on steroids – but you get all the code!

You can :

  • Use fully templatable[sic] individual image overlay templates. Zoom in on an image and see data about that image overlaid on top. Hell, even show video as you zoom in to the image if you like!
  • Show general overlays. Zoom in and see data up the side or across the bottom about the screen… a bit like zooming in to an image in the Hard Rock demo.
  • Filter the images by pre-defined categories…
  • Track your progress as you navigate around the control. Send a personalised “fly-though” to a friend using deep linking. See the fly through on the screen (press F on yours, or load one through the URL).
  • Keep simple metrics of image views… show a count of most popular images.
  • Rotate and ad, cause ad impression for each separate image view.
  • … plus much much more.

MultiScaleImages can be made up from a set of individual sub images – allowing the individual images to be re-arranged by the control at run time… this is how the SuperDeepZoom control can show overlay data that is linked to the viewed image, and also how it arranges the images when the control is resized or a filtered image list is selected.

The SuperDeepZoom control supports templated overlays for both image data and also fly though viewing. Fly through view allows you to see your path through the composition (press F)- which can be passed in from the URL (for deep linking from a friend). You can easily manipulate the fly through/overlay templates to your liking. You pass the templates in to the control from your XAML and it handles the rest.

The templated overlay is a special ItemsControl where each of its items are overlaid directly over the corresponding sub image. This means you can show text, video, anything(!) over the images – its entirely up to the template.

The SuperDeepZoom control concentrates on looking after the actual MultiScaleImage, aligning the overlays etc, fly through, sub image arrangement etc – but it does not try and handle the application stuff: Controls to start/stop slideshows, back and next buttons, zoom in and out buttons, filter lists etc. The other thing the SuperDeepZoom control doesn’t handle is the overlay data source.

Overlay Data

As you zip between images in the deep zoom composition the control keeps track of which images you are looking at. It notifies the host application when an image is zoomed enough – “hey, they are looking at an image”. What’s especially cool is what else it can give the host app.

Your host app can load in any POCO (plan on C# object – classes etc) in to the SuperDeepZoom control and associate it with a particular sub image. When the user zooms in on an image, the control hands this object back to the host application… it can then be shown using a template with databinding or what ever you like!

The same goes for the per image overlays. Each item in the image overlay ItemsControl is associated with one of your data objects… they are then shown using the ItemTemplate that you feed in from the host app – it’s so easy to change around this template, and also to add more functionality to the objects themselves (i.e. customisation is sweeet).

This all means that the SuperDeepZoom control manages only the MultiscaleImage, aligning overlays etc – all the rest is handled through databinding and events from the control in your host application.

Composing deep zoom …erm… compositions

Included in the project is a tool which you can use to suck in a directory of images and automatically output a deep zoom composition compatible with the SuperDeepZoom control (i.e. it has sub images, rather than being one big deep zoomable image).

Usage

Usage of the SuperDeepZoom control is pretty simple… at it’s most basic level you can just drop it in, configure the path to the deep zoom composition and start using it.

The real fun comes when you start databinding values, customising templates and passing in your own data.

Pulling apart the sample application is your best bet for quickly getting up to speed on this stuff, but for posterity I’ll run through the basic set up for relatively simple deep zoom application. In coming posts I will describe in more detail how to go about customising overlays and other cool bits.

Getting set-up

Start off by creating a new Silverlight application in Visual Studio – ensure you create a web site with it as you will need somewhere to host the deep zoom composition.

Next, you’ll need to download the source code from the Codeplex project here. Once you have that, include the SuperDeepZoom project in your solution and add a project reference to it by right clicking on References in your Silverlight project and select Projects tab…

Creating some deep zoom imagery

Before you can start you need something to deep zoom. Fire up the Eventr source code and start the DZCollectionCreator project (sorry not compiled in the distro :) ). From here you can select an input directory to source your images from (JPG or PNG should be okay). Select an output directory. Once the process completes (should be pretty quick, about 2 seconds per image) navigate to the output directory and copy the entire contents. Next cruise to the directory of your *web* project and create a folder (call it MyDeepZoomComp) or something, and copy the stuff in. There will be a heap of files (far more than the number of images you input). This is part of the magicery behind how deep zoom works.

Now you have something to zoom.

Why not use deep zoom composer? This tool uses the deep zoom composition API internally, but it automatically lays out the images for you… saving you time!

Getting something going

We’ll now insert the SDZ control in to your page. First you’ll need to include a namespace to the control:


<UserControl x:Class="EventrSampleRunThrough.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

    xmlns:sdz="clr-namespace:SuperDeepZoom;assembly=SuperDeepZoom"

    >

	<Grid x:Name="LayoutRoot" Background="White">

    </Grid>
</UserControl>

I also took out the width and height properties so the control will fill the browser window.

With the SDZ namespace in you’ll be able to insert the control.

<sdz:SuperDeepZoom x:Name="sdz" DeepZoomSource="../SampleDeepZoom/output.xml"/>

This is pointing to a deep zoom comp in the root of the web site in the SampleDeepZoom folder. Note this path is relative to the Silverlight XAP package, which is usually stored in ClientBin – hence the ../ on the front (the SDZ control has some smarts to calculate relative paths).

Run your app! you will see you fully functional deep zoom composition, complete with double click to zoom and mouse wheel support! Too easy eh?

More to come

I’ll be blogging a lot more on this project over the coming weeks and months (as time permits!). Next time I will describe how to make some simple overlays (complete with your own custom data).

Until then, I hope you enjoy my little project, and please keep those comments flowing with your ideas and suggestions :)

P.S. A big thanks to the delicate genius himself Michael Kordahi for helping me get this off the ground :)