I’m a Silverlight MVP!

January 4, 2010

The other day I recieved an amazing New Year’s surprise in my email! I dicovered that I have been awarded Microsoft MVP in Silverlight for the 2010 year!

I am extremely honored to be recognised and included in this amazing group of people and send a massive thanks for all my supporters over the last couple of years – you know who you are!

Once again thanks to everyone and a wonderful 2010 to everyone!

Cheers,

Jordan.

P.S. for more information on MVP and what it is, have a look here.


New AnimationChainer – fluent Storyboard helper for Silverlight

December 24, 2009

A while ago I posted an article on a little animation helper class which makes it quick and easy to build animations dynamically in code. You can see my articles here and here and here.

I use this animation chainer a fair bit in my apps so I thought I’d share the improvements here.

Firstly, the system has been greatly simplified – I’ve cut a lot of superfluous junk out.

It now supports Stop, Pause and Resume :)

It takes a framework element in the constructor of the AnimationChainManager. This is to get around the problem where animations would appear jumpy (and sometimes not at all!).

It supports animation easing.

It supports callbacks using lambdas to make it very easy to calculate your next dynamic animation.

<Sample Code>

New AnimationChainer – fluent Storyboard helper for Silverlight Demo

</Sample Code>

Hope you enjoy!

Merry Christmas,

Jordan.


Upgrading from .NET RIA Services to WCF RIA Services

November 30, 2009

I just had to go through the process of upgrading an app built with the RIA Services CTP code from a few months ago to the new WCF Ria Services beta that was released at PDC.

After the upgrade I was presented with a billion errors – I had one of those “OMG I wish I didn’t just do that” moments… but after some hunting around I found that the changes were not too bad.

Here is my report on what I did to get my project working.

In web project

I had a custom object being exposed via RIA Services, which meant I had to have a [Key] attribute on one of the properties. System.ComponentModel.DataAnnotations has been upgraded, but the reference in your project will have required specific version set. So remove the missing DLL and re-add it. Use the 3.6.0.0 version.

System.Web.DomainServices.Providers has been split in to two files – System.Web.DomainServices.LinqToSql and System.Web.DomainServices.EntityFramework. I’m using LinqToSqlClasses in my project, so I added the Linq version (and removed the old reference).

You’ll also have to update the name spaces in your DomainServices – Change “using System.Web.DomainServices.Linq;” to “using System.Web.DomainServices.Providers;”.

ServiceOperation has changed to Invoke.
Please note that it seems that in the VS2010 version of WCF Ria Services you can return entities from Invoke operations but not in the VS2008 version. Keep this in mind when you are designing your domain services – although you probably should use normal non Invoke style methods to return entities.

Also in your domain services on the server, “this.Context” has been changed to “this.DataContext”.

I had an enum that was exposed by a ServiceOperation (now Invoke) and it wasn’t being properly pushed out the client code. This appears to have been fixed, so I removed the .shared part of the file name to fix (it was doubling up on the client and getting a compiler error).

Silverlight Client

SubmitOperation is now in System.Windows.Ria namespace, not System.Windows.Ria.Data

If you are using RiaContext to get login information etc, then you’ll have to change RiaContextBase to WebContextBase.

IEditableCollection is gone… I use PagedCollectionViews mostly anyway (which use IEditableCollectionView) – IEditableCollection was in the SL3 Beta (but removed for RTW), and seemed to be included *again* in the older RIA Services stuff – but it’s gone again :)

ServiceContract() (which is in the auto generated files on the client) is now in System.ServiceModel.dll (so add it as a reference).

MergeOption has been changed to LoadBehavior with new options – KeepCurrent, MergeIntoCurrent and RefreshCurrent (much nicer!)

That’s all I had to do to get the app compiling, but at runtime I had a few problems with the RIA services requests getting 404. I fixed this by adding a temp domain service to the app – which updated the Web.Config for me…

It Added the following httpModule:

<add name="DomainServiceModule" type="System.Web.Ria.Services.DomainServiceHttpModule, System.Web.Ria, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

It Added the following module:

<add name="DomainServiceModule" preCondition="managedHandler"
    type="System.Web.Ria.Services.DomainServiceHttpModule, System.Web.Ria, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

It also added some WCF stuff right down the bottom of the file:

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
 </system.serviceModel>

Hope this helps you upgrade your projects!


New SDDN Site Live

November 26, 2009

The new Silverlight Designer and Developer Network site is live!

The site has information on upcoming meetings, any follow up code links from the presenters as well as general Silverlight community information.

It will also contain video of the events where possible – once we figure out some hosting (damn you Silverlight Live Streaming biting the bullet!).

The best part about the new site is that it now has RSS!! A long time coming I know – but go add it to your readers :)

Check it out at http://www.sddn.org.au.

Cheers,

Jordan.


.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!


Follow

Get every new post delivered to your Inbox.

Join 32 other followers