Silverlight 3: What’s new?
Met de introductie
van Silverlight 3 maakt Microsoft het nog aantrekkelijker om Rich Internet
Applications te ontwikkelen. In deze nieuwe versie van Silverlight worden nieuwe
controls, een handig navigatie-framework en 3D geïntroduceerd.
In dit artikel zullen een aantal van de nieuwe mogelijkheden van Silverlight 3,
ten opzichte van Silverlight 2, besproken worden.
Silverlight is nog geen twee jaar oud. In die tijd hebben
er over de hele wereld al ruim 350 miljoen installaties plaatsgevonden. Waar
Silverlight 1 zich voornamelijk richtte op audio en video, bracht versie 2 de
mogelijkheid om Rich Internet Applications te ontwikkelen. In Silverlight 3 zien
we vooral daar een uitbreiding van. Maar ook op audio- en videogebied blijft
Silverlight sterk en zijn er diverse verbeteringen doorgevoerd.
Silverlight buiten de browser
Eén van de meest opmerkelijke toevoegingen in Silverlight 3
is de mogelijkheid om een Silverlight-applicatie ook buiten de browser en zelfs
offline te draaien. Via twee eenvoudige stappen kan elke gebruiker een
Silverlight-applicatie op zijn lokale pc installeren. De installatie procedure
is voor elke Silverlight-applicatie hetzelfde om deze procedure voor
eindgebruikers zo overzichtelijk mogelijk te houden.
Als ontwikkelaar van een Silverlight-applicatie bepaal je
zelf of gebruikers jouw applicatie ook lokaal mogen installeren. Dit geef je aan
in het “AppManifest.xml”-bestand dat bij elk Silverlight-project wordt
aangemaakt. De configuratieregels welke het lokaal installeren activeren, staan
hier al in. Je hoeft ze alleen nog maar uit te commentariëren.
<Deployment.ApplicationIdentity>
<ApplicationIdentity
ShortName="Yourname"
Title="Window
title">
<ApplicationIdentity.Blurb>
Description of your Silverlight application
</ApplicationIdentity.Blurb>
</ApplicationIdentity>
</Deployment.ApplicationIdentity>
Codevoorbeeld 1: Silverlight
buiten de browser.
Gebruikers kunnen vervolgens rechts klikken en krijgen een
contextmenu met daarin de optie om de applicatie lokaal te installeren. Je hebt
dan de keuze of je een link op de desktop en/of in het startmenu wilt opnemen.
Het verwijderen van een applicatie is al net zo eenvoudig; je klikt met de
rechtermuisknop op de applicatie en kiest voor “Remove this application”.

Afbeelding 1: installatie procedure
Silverlight-applicatie.
Ontwikkelaars moeten er goed over nadenken of ze het
toestaan om hun applicatie ook buiten de browser te laten gebruiken en wat daar
de gevolgen van kunnen zijn. Veel Silverlight-applicaties maken gebruik van
Webservices, xml-feeds etc.. Bij offline gebruik zouden deze niet beschikbaar
kunnen zijn.
Je kunt hierop inspelen door gegevens tijdelijk op te slaan in de
IsolatedStorage en deze als cache te
gebruiken. Dit is een stukje afgeschermde ruimte op het lokale systeem waar
Silverlight naar kan schrijven en uit kan lezen. Lokaal geïnstalleerde
Silverlight-applicaties krijgen standaard 25MB aan ruimte in de IsolatedStorage.
Online/offline
Via de property
Application.Current.ExecutionState kun je er achter komen of de applicatie
lokaal draait of via de browser. Vervolgens kun je met de methode “NetworkInterface.GetIsNetworkAvailable”
ontdekken of er een netwerkverbinding is. Zodra er een netwerk verbinding is,
kun je bijvoorbeeld nieuwe RSS-feeds ophalen en deze weer lokaal cachen.
Een belangrijke eigenschap van Silverlight is het “sandbox
model”. Silverlight-applicaties draaien in een afgeschermde zandbak waar ze niet
zomaar uitkunnen. Dit zorgt ervoor dat Silverlight-applicaties veilig zijn en je
ze kunt vertrouwen. Bij Silverlight 3 is dit nog steeds het geval. Ook
applicaties welke buiten de browser draaien, zitten nog steeds in de sandbox en
kunnen zo geen kwaad aanrichten op het lokale systeem.
Een lokaal geïnstalleerde Silverlight-applicatie komt
terecht in de “\AppData\LocalLow\”-directory
van je user profile. Het originele download adres blijft gekoppeld aan de
applicatie; dit geldt als thuishaven. Onder water wordt gecontroleerd of er
updates zijn van de applicatie. Wanneer deze er zijn, worden ze gedownload en
gebruikt wanneer de applicatie een volgende keer gestart wordt. Als gebruiker
van een applicatie heb je daar geen keuze in, de nieuwste versie zal altijd
worden gebruikt.
Navigatie Framework
Silverlight 3 komt met een navigatie-framework dat werkt
met twee controls; een Frame en een Page. Met dit Framework kun je gemakkelijk
een masterpage maken met daarin een Frame. Binnen het Frame kunnen de
afzonderlijke pagina’s getoond worden.
Tijdens het navigeren naar andere pagina’s wordt er geen
nieuwe webpagina geladen, maar wordt er alleen een andere XAML-page getoond
vanuit het Silverlight-project. Ondanks dat je dus niet fysiek naar een andere
webpagina navigeert, werkt dit Framework wel perfect samen met de “Vorige”
en “Volgende” knoppen in de browser. Elke navigatie actie wordt door de
browser geregistreerd. Binnen je Silverlight-applicatie kun je daarna
gemakkelijk drie stappen terug door drie keer op de ”Vorige” knop van je browser
te klikken.
Elke pagina binnen de applicatie heeft een eigen URL.
Navigeer je bijvoorbeeld naar de pagina “Home”, dan zou de URL in je browser er
zo uit kunnen zien:
http://silverlight.net/MySilverlightAp.aspx#Home.
Let op de toevoeging “#Home” aan het einde. Dit wordt door het
navigatie-framework gebruikt om de juiste pagina binnen het Frame te tonen. Deze
URL kan vervolgens ook gebruikt worden om op te slaan in je favorieten of om te
e-mailen naar een kennis, zodat deze meteen bij de juiste pagina uitkomt.
Wanneer je de developer tools voor Silverlight 3 hebt
geïnstalleerd, krijg je binnen Visual Studio de optie om een “Silverlight
Navigation Application”-project aan te maken. Dit project bevat standaard een
applicatie met een frame en twee pagina’s.

Afbeelding 2: standaard Silverlight navigatie applicatie.
Samen met het navigatie-framework komt ook een UriMapper.
In de UriMapper kun je voor een URL een meer vriendelijke naam configureren. Met
de configuratie in Codevoorbeeld 2 verwijst de vriendelijke URL “#Home“ naar de
pagina “/Views/HomePage.xml”.
<nav:UriMapper
x:Key="uriMapper">
<nav:UriMapping Uri="Home" MappedUri="/Views/HomePage.xaml"></nav:UriMapping>
<nav:UriMapping Uri="Klant/{id}" MappedUri="/Views/KlantDetail.xaml?id={id}"></nav:UriMapping>
</nav:UriMapper>
Codevoorbeeld 2: UriMapper
voorbeeld configuratie.
De UriMapper kan ook overweg met querystring parameters.
Stel, je hebt een pagina met detailinformatie voor elke klant. De gegevens haal
je op aan de hand van een uniek ID welke je meegeeft in de URL. De URL kun je er
zo uit laten zien: ”#Klanten/25” en dit verwijst dan naar
“/Views/KlantenDetailPage.xaml?id=25”.
Binding Validation
Bij het bouwen van applicaties die om user input vragen, is
het altijd erg belangrijk de ingevoerde data te valideren.
Je kunt een property van een object (bijvoorbeeld de “titel “ van de entiteit “boek”)
binden aan een tekstbox. De tekstbox zal dan de titel tonen. Door gebruik te
maken van two-way databinding wordt de waarde die je invoert in de tekstbox ook
weer in het object terug gezet. Bijna altijd zul je de ingevoerde waarde willen
valideren. Is het geen lege waarde? Zijn er wel minimaal 10 karakters ingevoerd?
Etc..
Met Silverlight 2 kon je validatiemeldingen afhandelen in
code. Je moest zelf bepalen wat je ermee ging doen en hoe je de melding aan de
gebruiker wilde tonen. Silverlight 3 biedt een standaard ErrorTemplate om
validatiemeldingen aan de gebruiker te tonen. Er is geen code voor nodig, dit
kan volledig in XAML.
In de “set”
methode van een property kun je eigen validatiecontroles uitvoeren. Wanneer er
iets niet klopt, hoef je alleen maar een Exception te gooien met daarin een
tekst voor de gebruiker.
public
string Titel
{
get { return _titel; }
set
{
if (string.IsNullOrEmpty(value))
{
throw
new Exception(
"Titel mag niet leeg zijn." );
}
_titel =
value;
}
}
Codevoorbeeld 3: data validatie.
In de user interface wordt de tekstbox rood en komt er een
uitklapbaar panel met daarin de foutmelding. Hoe deze melding gepresenteerd
wordt, staat gedefinieerd in de ErrorTemplate van een control. Dit template is
natuurlijk volledig aanpasbaar.

Afbeelding 3: standaard validatiemelding.
Het mooie aan deze oplossing is de scheiding van validatie
logica en user interface. De validatielogica zit echt bij het object, waar het
hoort, en niet uitgeprogrammeerd in de presentatielaag. Minder mooi is het
gebruik van Exceptions om een validatiemelding te tonen. Validatiemeldingen
zullen regelmatig voorkomen, Exceptions zijn relatief zwaar en zouden eigenlijk
niet voor moeten komen.
RIA Services Framework
Microsoft wil met Silverlight 3 nog verder uitbreiden op
het gebied van Rich Internet Applications (RIA). Op de Mix 09-conferentie in Las
Vegas is, tegelijk met Silverlight 3, het RIA Services Framework aangekondigd.
Het doel van dit Framework is het vereenvoudigen van het ontwikkelen van RIA’s.
Uiteraard sluit dit Framework perfect aan op Silverlight.
Bij een RIA zal er vaak data-uitwisseling tussen de client
en de server plaatsvinden. Data wordt ingeladen vanaf de server, aangepast op de
client en teruggestuurd naar de server via een Webservice om opgeslagen te
worden. Op de server draait een data-access-laag die verantwoordelijk is voor de
opslag in, bijvoorbeeld, een database.
In dit scenario kun je de client niet zomaar vertrouwen. Welke clients er
gebruik maken van je webservices en hoe, heb je niet altijd in de hand. Je moet
daarom goed bepalen welke data je beschikbaar wilt stellen aan de client en
welke data aangepast mag worden. Ook zul je de data moeten valideren wanneer
deze binnenkomt op de server.
Om de gebruiker een zo prettig mogelijke ervaring te geven,
wil je de validatie ook op de client laten plaatsvinden. De gebruiker krijgt dan
meteen feedback als hij bijvoorbeeld een verkeerde waarde intoetst. Echter,
vanuit het oogpunt van een ontwikkelaar wil je de validatieregels niet op zowel
de server als de client schrijven; dat zorgt immers voor dubbele code.
Met het RIA Services Framework wordt
client-/server-ontwikkeling sterk vereenvoudigd. Een Silverlight-project en
ASP.Net-website ontwikkel je als één applicatie. De applicatielogica deel je en
is beschikbaar op zowel de client als de server. Je definieert eenmalig je
business entiteiten, bijvoorbeeld een Orders-entiteit. Deze is dan zowel op de
server als in Silverlight beschikbaar.
Het RIA Services Framework werkt goed samen met de
Binding Validation uit de vorige
paragraaf. De validatie-logica die bij het object zit, wordt ook gedeeld en doet
zijn werk op de server en de client.
In een nieuw object, genaamd de DomainService, definieer je
de methodes die beschikbaar zijn op de data. Bijvoorbeeld de methode
“GetOrders()”, met als resultaat een lijst van orders. Wanneer je gaat
compileren, zal er code worden gegenereerd, zodat de DomainService ook
beschikbaar is vanuit Silverlight. In Silverlight heb je dan direct de
“GetOrders”-methode tot je beschikking.
Als je deze methode vanuit Silverlight aanroept, maak je
een webservice aanroep naar de webservices die gegenereerd zijn door de
DomainService. Maar je hoeft je niet druk te maken over de locatie van de
webservice of het asynchroon afhandelen van de webservice aanroep. Dit wordt
onder water voor je geregeld door het RIA Services Framework. Door de kracht van
databinding in Silverlight worden de resultaten getoond zodra deze beschikbaar
zijn.

Afbeelding 4: RIA Services Framework Architectuur.
Dit is slechts het topje van de ijsberg. Het RIA Services
Framework is erg krachtig en heeft nog veel meer mogelijkheden. Het is
bijvoorbeeld mogelijk om wijzigingen in batches terug te sturen; zelf geschreven
validatieregels kunnen worden gedeeld, zodat ze zowel in Silverlight als op de
server worden uitgevoerd; sorting, paging, filtering, conflicthantering, etc..
Nieuwe controls
In Silverlight 3 zijn een aantal nieuwe controls
toegevoegd.
Child Window
Met een ChildWindow is het eenvoudig geworden om een pop-up te tonen. Het
pop-up-window kun je gebruiken in een situatie waarin je bijvoorbeeld een
melding aan een gebruiker wilt tonen of om input/bevestiging van de gebruiker
wilt vragen.
Save File Dialog
Er bestond al een Open File Dialog waarmee bestanden van het systeem van de
gebruiker ingeladen konden worden. Nu is er ook een Save File Dialog; hiermee
kun je een bestand opslaan op het systeem van de gebruiker. De gebruiker moet
zelf een locatie en bestandsnaam opgeven. Silverlight krijgt vervolgens toegang
om alleen naar die locatie te schrijven.
Wrap Panel
Dit panel bestond al langer in WPF, maar is nu ook toegevoegd aan
Silverlight. Het is vergelijkbaar met een StackPanel, maar een WrapPanel toont
controls netjes op de volgende regel als er niet genoeg ruimte meer is.
Silverlight Control
Toolkit
Een aantal nieuwe controls zitten niet standaard in Silverlight, maar komen uit
de externe Silverlight Control Toolkit. Deze toolkit bevat meer dan 16 controls
die buiten de reguliere Silverlight-releases worden onderhouden. Zo is er
bijvoorbeeld een TimePicker, om snel een tijd te selecteren en een
Accordion-control, om een set van controls open en dicht te klappen. In de
Toolkit zitten ook controls om uitgebreide grafieken te tonen.

Afbeelding 5: grafiek-control uit de Silverlight Control Toolkit.
Perspective 3D
Een van de meest gevraagde features voor Silverlight was
3D-support. Met de mogelijkheden die Silverlight 2 bood, is vaak geprobeerd 3D
te simuleren. Maar met Silverlight 3 is 3D-functionaliteit een stapje dichterbij
gekomen. Door middel van een “PlaneProjection” is het mogelijk om 2D-objecten in
een 3D-perspectief te bekijken. Objecten die gedraaid zijn, blijven volledig
actief en functioneel. Een knop die bijvoorbeeld achterstevoren staat, is nog
steeds klikbaar.
Het is erg eenvoudig om Perspective 3D toe te passen. In
Codevoorbeeld 4 staat de code die nodig is om een afbeelding te draaien.
<Image x:Name="image" Source="MyImage.jpg">
<Image.Projection>
<PlaneProjection RotationY="45" RotationX="-30"
RotationZ="-20" />
</Image.Projection>
</Image>
Codevoorbeeld 4: het toepassen van
een PlaneProjection voor een 3D-effect.

Afbeelding 6: het resultaat van het toegepaste 3D-effect.
Perspective 3D maakt het mogelijk nieuwe vormen van user
interface interactie te bedenken, bijvoorbeeld bedieningspanelen die in 3D
inklappen en weer terugkomen. Het is geen ‘out-of-the-box’-oplossing om
3D-objecten te tonen, zoals een kubus of een 3D-wereld. Wel is het mogelijk om
een kubus in 3D te tonen door het slim plaatsen en tegelijk animeren van
meerdere, losse vlakken. Echte 3D-fanaten kunnen op deze manier Perspective 3D
gebruiken om een eigen 3D-engine in Silverlight te bouwen.
En verder…
Een aantal van de meest opvallende toevoegingen aan
Silverlight 3 heb je in dit artikel kunnen lezen. Maar er is nog veel meer
nieuws in Silverlight 3.
Audio & Video
Ondersteuning voor de AAC en H.264 codec is toegevoegd. Ook is er de
mogelijkheid om RAW audio/video binnen te krijgen en te laten decoderen door een
externe codec. Dit opent de deur naar ondersteuning voor nog veel meer formaten.
Local Messaging
Via Named Pipes kunnen verschillende Silverlight-applicaties met elkaar
communiceren. De applicaties kunnen op dezelfde pagina staan, in verschillende
tabs en zelfs in verschillende browsers. De communicatie blijft lokaal.
Element-2-Element
Binding
In WPF was dit al langer mogelijk, maar nu is het ook in Silverlight mogelijk om
elementen van verschillende objecten in XAML aan elkaar te binden. Je kunt
bijvoorbeeld de waarde van een Slider binden aan een Textbox, zodat de waarde
van de Slider automatisch in de Textbox komt te staan. Volledig via XAML, zonder
code.
Toekomst
Silverlight 3 is nu uit als beta. Algemeen verwacht wordt
dat Silverlight 3 deze zomer officieel uitkomt. Er is bij deze versie goed
geluisterd naar de wensen vanuit de Silverlight-community. Toch ontbreken er nog
een aantal veelgevraagde features, zoals print en webcam ondersteuning.
Ook over de ondersteuning van de mobiele platformen is nog weinig bekend. Laten
we hopen dat ze hier hard mee bezig zijn!
Referenties
Silverlight 3: Get Started
http://silverlight.net/getstarted/silverlight3/default.aspx
Tim
Heuer’s Blog
http://timheuer.com
Nikhil
Kothari's Blog
http://www.nikhilk.net
Silverlight Control Toolkit
http://www.codeplex.com/Silverlight
Silverlight Show community
http://www.silverlightshow.net