Version 1.2
Julien Dollon
http://blogs.dotnet-france.com/juliend
2 Silverlight 4.0 béta 1 v. 1.0 [26/11/09]
Sommaire
1 Introduction ..................................................................................................................................... 4
1.1 Historique des versions ........................................................................................................... 4
1.2 Se former à Silverlight 2 et 3 ................................................................................................... 4
1.3 Télécharger les outils............................................................................................................... 5
1.4 Les sources utilisées pour ma recherche................................................................................. 5
2 Améliorations générales.................................................................................................................. 6
2.1 Meilleur support des navigateurs & Performances ................................................................ 6
2.2 Le clic droit de la souris ........................................................................................................... 6
2.3 Du contenu riche ..................................................................................................................... 6
2.4 Globalisation............................................................................................................................ 7
2.5 Les impressions ....................................................................................................................... 7
2.6 Drag and drop de l’OS à l’application Silverlight ..................................................................... 8
2.7 Validation ................................................................................................................................ 9
2.8 Détection du clavier .............................................................................................................. 10
2.9 Compatibilité avec les assemblies .NET................................................................................. 11
2.10 Amélioration du support des services ................................................................................... 13
2.11 Les commandes pour le pattern MVVM ............................................................................... 14
2.12 Amélioration de la navigation de page ................................................................................. 14
3 Amélioration de l’OOB................................................................................................................... 16
3.1 Les applications « Sandboxed »............................................................................................. 16
3.1.1 Introduction ................................................................................................................... 16
3.1.2 Gérer la taille, position et aspect de vos fenêtre Silverlight 4 ...................................... 16
3.1.3 Les notifications............................................................................................................. 17
3.1.4 Héberger du contenu HTML .......................................................................................... 17
3.2 Les applications de confiances .............................................................................................. 19
3.2.1 Introduction ................................................................................................................... 19
3.2.2 Accès au système de fichiers ......................................................................................... 21
3.2.3 Interopérabilité COM .................................................................................................... 22
4 Le multimédia ................................................................................................................................ 23
1 Introduction
Notez qu’entre la version 1 et 2 de Silverlight la CLR est différente. Silverlight 4 par exemple peut
exécuter du Silverlight 2 et 3 mais pas la version 1.
Silverlight 2 :
Introduction à Silverlight
Les Contrôles
Customisation
Gestion d’évènement et Commandes
Les animations
Pour Silverlight 3 je vous conseille le livre blanc que j’ai écrit disponible ici.
Silverlight 4 SDK
Silverlight 4 Documentation
Silverlight 4 Toolkit
2 Améliorations générales
Ce contrôle peut contenir du contenu riche tel que du texte avec différente police, une image, une
vidéo ou tout autre contrôle. On peut copier des éléments riches d’office, de page web…
Exemple :
<RichTextArea IsReadOnly="True">
<Paragraph FontFamily="Arial"
FontSize="36"
FontWeight="Bold"
TextAlignment="Center"
TextDecorations="Underline">
Hello Word
<LineBreak />
<Hyperlink NavigateUri="http://microsoft.com">Click
Here</Hyperlink>
<LineBreak/>
<InlineUIContainer>
<Button Content="Click Me !" Height="30" />
</InlineUIContainer>
<LineBreak />
</Paragraph>
</RichTextArea>
2.4 Globalisation
30 nouvelles langues sont supportées (l’arabe, le thaï..) ainsi que le support bi-directionnel.
L’utilisation de FlowDirection sur n’importe quel contrôle nous permet d’écrire de gauche à droite ou
de droite à gauche (par défaut).
Ce processus est amélioré dans Silverlight 4 en proposant l’accès à Print Document Dialog
Pour vos impressions, deux techniques sont possibles : réaliser un screen d’un composant de votre
IHM ou générer un état indépendant du contrôle le représentant.
Fini les boutons « Parcourir » pour télécharger un fichier ou ouvrir un document, l’expérience
utilisateur est accrue et la barrière entre application RIA (Rich Internet Application) et RDA (Rich
Desktop Application) s’affine de plus en plus.
2.7 Validation
En Silverlight 3, nous avions à notre disposition une nouvelle gestion d’erreur venant tout droit du
Silverlight Toolkit qui consistait à soulever des exceptions côté classe métier et d’afficher un message
d’erreur dans l’IHM.
Silverlight 4 améliore cette gestion d’erreur en proposant deux nouvelles interfaces IDataErrorInfo et
INotifyDataErrorInfo.
IDataErrorInfo force le binding à utiliser un accesseur « this[] » pour parcourir les propriétés. Cela
permet de faire la gestion d’erreur dans un accesseur à part. La propriété Error doit être utilisée pour
par exemple créer un ErrorSummary en fin de formulaire.
{
get { return nom; }
set { nom = value; OnPropertyChanged("Nom"); }
}
#endregion
#endregion
}
<UserControl.Resources>
<assembly:Client x:Key="client" Nom="Name"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<TextBox Text="{Binding Source={StaticResource client},Path=Nom,
Mode=TwoWay, ValidatesOnDataErrors=True}" Margin="270,190,191,253" />
</Grid>
Résultat :
L’utilisation se fait de manière très simple avec les méthodes statiques de la classe Clipboard :
On peut maintenant rendre compatible des librairies Silverlight avec du code .NET et ainsi réaliser un
gain de temps lors du développement/Maintenance des applications.
Cette portabilité est réalisée en compilant l’assembly grâce aux Silverlight Tools et en vérifiant que le
projet compilé utilise bien des APIs portables en .NET et Silverlight (System, Mscorlib, System.Core…).
Dans l’exemple qui suit, je vais créer une librairie Silverlight que je vais référencer dans un projet
.NET. A noter que le client .NET ne nécessitera pas l’installation du plug in Silverlight sur le poste.
3. Ajout de la référence (en utilisant Browse plutôt que Projects qui provoque une erreur)
L’une de ces limites est le support des services. Qui n’a jamais eu de problème avec les
FaultExceptions (corrigé avec Silverlight 3) ou l’authentification des ClientsCredentials ? Beaucoup de
choses manquent à l’appel pour nos applications Silverlight.
La version 4 corrige certains manques tels que le support d’UDP multicast ou de l’authentification
avec la classe ClientHttpWebRequest.
L’utilisation de ce type d’authentification rend compatible Silverlight avec les services sécurisés de
type WCF/WCF Data Services voir même des services Live ou Twitter sans passer par un service proxy
« maison ».
Voici le code côté client Silverlight pour interroger un service WCF de type webhttpbinding :
public MainPage()
{
InitializeComponent();
WebClient client = new WebClient();
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("julien", "dollon");
client.DownloadStringCompleted += new
DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
client.DownloadStringAsync(new
Uri("http://localhost:15980/Service1.svc/DoWork"));
Si vous souhaitez vous renseigner sur comment réaliser un service WCF sécurisé avec des clients
credentials rendez-vous sur mon blog.
Une astuce à noter également dans les améliorations de communication avec les services : Les
ObservableCollection peuvent s’initialiser avec un type IList ou IEnumerable en paramètre.
Ce qui nous évite de réaliser à la main la boucle foreach quand un service nous renvoie un tableau de
données.
La partie Model contient nos données métiers, proxy WCF ou DomainContext. La partie View
contient votre interface graphique XAML avec le moins de code C# possible puisque la logique de
votre application est déportée dans la partie ViewModel grâce au Binding, aux Commands et aux
notifications.
La nouveauté dans Silverlight 4 réside dans le fait que l’utilisation de l’attribut Command dans un
bouton est gérée nativement.
Dans mon white paper sur la version 3 de Silverlight, je vous exposais l’une des nouveautés qui était :
la navigation entre les pages.
Cette fonctionnalité permettant une meilleure construction de l’IHM ainsi que la possibilité pour le
client d’avoir un historique de navigation et une URL de type « permalink ».
Je faisais déjà allusion d’un futur proche ou j’imaginais toutes les possibilités que cela ouvre pour
Silverlight (pattern MVC, application Restfull…).
La version 4 propose une nouvelle propriété appelée ContentLoader de l’objet Frame qui a pour rôle
d’afficher les pages xaml.
Cette propriété va nous permettre de créer notre propre classe héritant de l’interface
INavigationContentLoader afin de pouvoir gérer le chargement des pages nous-même.
{
throw new NotImplementedException();
}
#endregion
}
3 Amélioration de l’OOB
On appelle ces applications des applications OOB qui peuvent être exécutées avec ou sans connexion
internet à travers un launcher (sllaunch.exe).
Pour plus d’informations, il suffit de lire le White Paper sur Silverlight 3 chapitre « Application
Offline » et se documenter sur mon blog à cette adresse. Il est important pour la suite de ce chapitre
de connaître comment déployer une application en mode offline.
Les nouveautés de ces applications avec des droits très limités (autant que si l’application était
hébergée dans un navigateur) sont les suivantes :
A noter qu’il est aussi possible de gérer la position en Z de la fenêtre par rapport aux autres fenêtres
du bureau ainsi que l’état de celle-ci (minimisée ou maximisée).
Si votre application est de type « sandboxed » alors vous ne pouvez pas utiliser la méthode Navigate
du contrôle pour visiter un site. Certainement par sécurité.
Browser.NavigateToString(html);
Browser étant le contrôle WebBrowser. Si vous souhaitez malgré tout afficher un site web dans une
application Sandboxed, vous pouvez utiliser une IFRAME HTML :
Si votre application est de type « de confiance » (voir chapitre suivant), vous pouvez afficher une
page web.
Exemple :
Si vous souhaitez utiliser un brush HTML en fond d’un contrôle (sur la propriété Fill d’un rectangle
par exemple), vous avez à votre disposition la classe HtmlBrush.
Le contrôle WebBrowser n’est pas encore capable d’être utilisé avec des transformations type
rotation/effets/opacité.
Une application de confiance affiche un message « warning » dès l’installation pour prévenir
l’utilisateur :
Ces applications de confiance sont aussi exécutées par SLLaunch.exe mais ont la possibilité de :
Pour illustrer ceci, voici un petit exemple qui énumère, crée et lit des fichiers.
Environment.GetFolderPath(
Environment.SpecialFolder.MyDocuments), "Hello.txt"));
}
Si on reprend le même exemple que Scott G. lors de la PDC, une application est capable :
Pour l’utilisation de composant COM, nous allons nous appuyer sur une nouveauté du C #4 : La DLR
et le type dynamic.
4 Le multimédia
Son utilisation est très simple, nous déclarons un type CaptureSource que nous initialisons avec les
périphériques de capture audio/vidéo :
capture.VideoCaptureDevice = (VideoCaptureDevice)
CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices()[0];
capture.AudioCaptureDevice = (AudioCaptureDevice)
CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices()[0];
Une fois l’instance capture initialisée, nous pouvons convertir le flux vidéo en brush que nous
appliquons en fond d’un border par exemple :
Le démarrage de la webcam se déclenche grâce à l’appel Start de l’instance capture. Une invite de
commande proposera à l’utilisateur d’accepter, ou non, que l’application Silverlight utilise ses
périphériques.
if (CaptureDeviceConfiguration.AllowedDeviceAccess ||
CaptureDeviceConfiguration.RequestDeviceAccess())
capture.Start();
Invite de commande
Pour prendre une photo «instantanée » nous utilisons la méthode AsyncCaptureImage. Cette
méthode est couplée dans mon exemple avec une ChildWindow pour montrer le résultat :
capture.AsyncCaptureImage((image) => {
AffichageImage win = new AffichageImage();
win.ImgSource = image;
win.Show();
});
Pour l’application de test que j’ai réalisé pour ce livre blanc (disponible ici), j’ai combiné les pixels
shaders (généré avec l’outil Shazzam) avec l’utilisation de la webcam. Voici le résultat :
Application de test (Avec ou Sans Pixel Shader le résultat est pas terrible)
C’est-à-dire que le client recevra une vidéo de moins bonne qualité pour éviter qu’elle ne s’arrête.
Cette technologie est apparue avec Silverlight 3 mais comme je n’en avais pas encore parlé je me
rattrape ici.
Exemple de Microsoft© :
Deux manières de l’encoder : l’utilisation d’Expression Encoder 3 ou de son SDK pour le faire en code.
Pour le déploiement, il vous faut installez IIS Media Services 3.0 (en plus de IIS7) téléchargeable ici.
Après l’installation d’IIS Media Services, rendez-vous dans la console d’administration d’IIS pour voir
apparaître de nouveaux icones :
De retour dans Expression Encoder, il faut configurer le format de sortie à IIS Smooth Streaming :
Si vous souhaitez réaliser cette manipulation, direction le blog de Pierrick Martos qui a créé un post
sur le sujet en référençant les DLL du SDK Encoder.
Le but de SMF est d’aider à la création d’un player Silverlight de haut niveau en fournissant plusieurs
helpers.
Le but de MEF est de créer une application dite “composite” (un peu comme Prism v2). On va
pouvoir ajouter des fonctionnalités à notre logiciel avec le simple ajout de dll dans un dossier
spécifique.
Chaque module est indépendant et peux être architecturé de la façon que vous souhaitez (n-tiers,
MVVM, MVC…).
Pour illustrer ce chapitre, j’utiliserai un cas concret pour lequel j’ai été confronté. Je développe
actuellement un viewer offline en Silverlight 4 pour Dotnet-France dont l’un des principes est de
proposer des widgets.
Pour cela il faut mettre en place une architecture permettant d’ajouter à la volé ces widgets
(représentés par des .XAP), le choix se porte donc sur MEF.
Je vous passe pour le moment les détails sur le téléchargement des .XAP à partir d’un magasin de
widgets, allons directement au vif du sujet en imaginant que le client référence la dll contenant le
widget.
Le site hôte
L’application Shell qui héberge tous les widgets (PrincipalShell)
L’application MyWidget représentant un widget
Nous ajoutons trois références permettant d’utiliser MEF aux deux applications Silverlight:
C:\Program Files\Microsoft
SDKs\Silverlight\v4.0\Libraries\Client\System.ComponentModel.Composition.dll,
System.ComponentModel.Composition.Initialization.dll et MEFContract.
Le code IContract :
[Export(typeof(IContract))]
public partial class MainPage : UserControl, IContract
{
public MainPage()
{
InitializeComponent();
}
}
#endregion
}
[ImportMany]
public IEnumerable<IContract> widgets { get; set; }
}
Résultat, le widget est bien chargé à l’exécution. Ceci sera le cas pour tous les widgets qui seront
référencés par le shell principal.
Cependant, si on reprend la problématique de début, les DLL ne doivent pas être référencées de
base.
La solution est d’isoler chaque widget dans un fichier .xap séparés et de les charger à l’exécution.
Pour cela il nous faut utiliser une classe appelée PackageCatalog qui est disponible dans le
Silverlight Toolkit.
C:\Program Files\Microsoft
SDKs\Silverlight\v4.0\Toolkit\Nov09\Bin\System.ComponentModel.Composition.Packaging.Toolkit.
dll
[Export(typeof(UserControl))]
catalog.AddPackage(Package.Current);
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
Package.DownloadPackageAsync(new
Uri("http://localhost:8094/ClientBin/MyWidget.xap", UriKind.Absolute),
DownloadCompleted);
}
private void DownloadCompleted(AsyncCompletedEventArgs e, Package p)
{
Thread.Sleep(1000);
if (!e.Cancelled && e.Error == null)
catalog.AddPackage(p);
foreach (var widget in widgets)
LayoutRoot.Children.Add((UserControl)widget);
}
[ImportMany(AllowRecomposition = true)]
public IEnumerable<UserControl> widgets { get; set; }
}
7 Annexe
7.1 SDK Facebook
Cours disponible dans la version 1.3 de ce document
7.2 BigMap
Cours disponible dans la version 1.3 de ce document