You are on page 1of 36

Les nouveautés de Silverlight 4

par Benjamin Roux (Retour aux articles)
Date de publication : 07/12/2009 Dernière mise à jour :

Cet article vous présentera les nouveautés de Silverlight 4.

Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles)

1 2 3 4 5 6

Introduction.............................................................................................................................................................3 Pré-requis............................................................................................................................................................... 4 L'impression........................................................................................................................................................... 5 Clic droit................................................................................................................................................................. 6 La molette de la souris.......................................................................................................................................... 8 Webcam et microphone......................................................................................................................................... 9 6-1 - Prendre une photo à partir du flux vidéo.................................................................................................... 12 7 - RichtextArea......................................................................................................................................................... 14 8 - Support du presse-papier.................................................................................................................................... 16 9 - Hébergement de HTML....................................................................................................................................... 17 9-1 - WebBrowser................................................................................................................................................ 18 9-2 - HtmlBrush.................................................................................................................................................... 20 10 - Trusted Application.............................................................................................................................................23 10-1 - Accès au système de fichier local............................................................................................................ 23 10-2 - Interopérabilité COM................................................................................................................................. 23 10-3 - Support total du clavier en plein-écran..................................................................................................... 24 11 - API de notification.............................................................................................................................................. 25 12 - TextTrimming...................................................................................................................................................... 26 13 - Drag&Drop à partir du bureau........................................................................................................................... 27 14 - Authentification Réseau..................................................................................................................................... 28 15 - Amélioration du Data Binding............................................................................................................................ 29 15-1 - Binding sur DependencyObject.................................................................................................................29 15-2 - StringFormat, TargetNullValue, FallbackValue.......................................................................................... 29 15-2-1 - StringFormat......................................................................................................................................29 15-2-2 - TargetNullValue................................................................................................................................. 30 15-2-3 - FallbackValue.................................................................................................................................... 30 16 - Thèmes implicites.............................................................................................................................................. 31 17 - Managed Extensibility Framework (MEF).......................................................................................................... 32 18 - ICommand et Command....................................................................................................................................33 19 - Divers................................................................................................................................................................. 34 20 - Conclusion..........................................................................................................................................................35 Remerciements.......................................................................................................................................................... 36

-

-2Copyright 2009 - Benjamin Roux. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Droits de diffusion permanents accordés à developpez LLC.
http://broux.developpez.com/articles/csharp/silverlight-4

Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles)

1 - Introduction
La beta de Silverlight 4 vient tout juste d'être annoncée à la PDC à Los Angeles durant le mois de novembre, c'est le moment pour nous de vous présenter les différentes nouveautés. Parmi celles-ci, on retrouve beaucoup de choses réclamées par la communauté depuis longtemps, une preuve que les équipes de Silverlight nous écoutent !

-3Copyright 2009 - Benjamin Roux. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Droits de diffusion permanents accordés à developpez LLC.
http://broux.developpez.com/articles/csharp/silverlight-4

com/articles/csharp/silverlight-4 . ne peut être faite de ce site et de l'ensemble de son contenu : textes. http://broux.NET 4 Preview Silverlight Toolkit Silverlight Media Framework -4Copyright 2009 . Aucune reproduction. etc sans l'autorisation expresse de l'auteur. même partielle. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. il vous faut • • Visual Studio 2010 Beta 2 Silverlight Tools for Visual Studio 2010 On peut également s'amuser avec d'autres outils • • • Expression Blend for .Benjamin Roux. documents.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 2 .developpez. Droits de diffusion permanents accordés à developpez LLC. images.Pré-requis Afin de développer avec Silverlight 4.

developpez. est le support de l'impression. documents. même partielle.L'impression Première des nouveautés. Aucune reproduction. Vraiment pratique. Droits de diffusion permanents accordés à developpez LLC. Il est également possible de définir des actions à effectuer avant et après l'impression via deux évènements : StartPrint et EndPrint. on peut choisir ce que l'on veut imprimer : toute notre application ou seulement une partie (une image. e2) => e2. document. // on définit la partie à afficher via la propriété PageVisual document.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 3 . Trois petites lignes de code suffisent pour l'implémenter PrintDocument document = new PrintDocument().Benjamin Roux. ne peut être faite de ce site et de l'ensemble de son contenu : textes. http://broux. etc sans l'autorisation expresse de l'auteur. Comme vous pouvez le voir. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. et il me semble la plus demandée.com/articles/csharp/silverlight-4 .PageVisual = this.PrintPage += (o. images. -5Copyright 2009 .Print(). un canvas et ses enfants).

set. documents. Popup. } e.IsOpen = false.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 4 .Content. Canvas.MouseLeftButtonDown += new MouseButtonEventHandler((o. point.Current. } Popup = new Popup(). Droits de diffusion permanents accordés à developpez LLC.Child is Canvas) ((Canvas)Popup.Transparent). PerformPlacement(menu.Children. } private void PerformPlacement(FrameworkElement content. Prenons ce Xaml simple <Grid x:Name="LayoutRoot" Background="White"> <Image Source="Images/ moi. -6Copyright 2009 .IsOpen = false).ActualWidth. if (Popup. images.Items.GetPosition(null)).Current. point. Les équipes de Silverlight ont répondu à nos appels via un nouvel évènement permettant de capter le clic droit.SetLeft(content. MouseButtonEventArgs e) { /* A modifier */ ListBox menu = new ListBox(). Aucune reproduction. childCanvas. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.Benjamin Roux.jpg" VerticalAlignment="Center" HorizontalAlignment="Center" Width="100" MouseRightButtonDown="Image_MouseRigh </Grid> Pour afficher un menu il suffit donc d'afficher par exemple une ListBox à l'endroit où on a cliqué. menu.com/articles/csharp/silverlight-4 .Host. x).Child = childCanvas.developpez. Canvas childCanvas = new Canvas().Add(content).Clic droit Une autre demande qui revenait souvent. même partielle. double y) { Canvas elementOutside = new Canvas(). e. public partial class MainPage : UserControl { public MainPage() { InitializeComponent(). elementOutside.Add("Print"). http://broux. Point point) { PerformPlacement(content.Clear(). menu.Children.Children.Child).Background = new SolidColorBrush(Colors.X. etc sans l'autorisation expresse de l'auteur.Add(elementOutside). } private void Image_MouseRightButtonDown(object sender.Items. if (Popup != null) { Popup. ne peut être faite de ce site et de l'ensemble de son contenu : textes.Content.Height = Application. e) => Popup.Y). la surcharge du menu contextuel.Handled = true. } private void PerformPlacement(FrameworkElement content.Width = Application. double x.Add("Save as").Host. elementOutside. elementOutside. #region Popup internal Popup Popup { get. childCanvas. elementOutside.ActualHeight.

IsOpen = true.SetTop(content.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) Canvas. etc sans l'autorisation expresse de l'auteur. documents. même partielle. Aucune reproduction. } } Popup.com/articles/csharp/silverlight-4 .Benjamin Roux. ne peut être faite de ce site et de l'ensemble de son contenu : textes. images.developpez. http://broux. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. y). #endregion Le code pour placer la ListBox au bon endroit (tout ce qui se trouve dans la #region) vient de mon ancien code pour afficher un Menu Contextuel que vous pouvez trouver sur mon blog. -7Copyright 2009 . Le résultat : On peut bien entendu ajouter des évènements pour les clics sur le menu mais ce n'est pas le sujet. Droits de diffusion permanents accordés à developpez LLC.

double scale = 0.5 || scale > 0) { transform. images.La molette de la souris Une nouvelle nouveauté est le support de la molette de la souris pour tous les contrôles.Delta > 0) scale = 0.developpez.ScaleX > 0. ne peut être faite de ce site et de l'ensemble de son contenu : textes. } } e. Droits de diffusion permanents accordés à developpez LLC. MouseWheelEventArgs e) { ScaleTransform transform = ((ScaleTransform)img. Exemple simple pour agrandir une image avec la molette <Grid x:Name="LayoutRoot" Background="White"> <Image x:Name="img" Source="Images/moi.ScaleY += scale.jpg" Width="100" Height="100" MouseWheel="Image_MouseWheel"> <Image. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. if (e.ScaleX += scale. Aucune reproduction. -8Copyright 2009 .Benjamin Roux. else scale = -0. etc sans l'autorisation expresse de l'auteur.1.com/articles/csharp/silverlight-4 . http://broux.1. même partielle.RenderTransform).RenderTransform> <ScaleTransform ScaleX="1" ScaleY="1" /> </Image. transform. documents.RenderTransform> </Image> </Grid> private void Image_MouseWheel(object sender. if (transform.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 5 .Delta correspond au « montant » de la molette.

documents. Voici une nouveauté attendue depuis longtemps. on va pouvoir retrouver les périphériques disponibles. il est possible de récupérer l'accès au périphérique vidéo par défaut grâce à la méthode statique « GetDefaultVideoCaptureDevice ».GetDefaultVideoCaptureDevice(). L'API Silverlight permet à présent de détecter et d'utiliser les périphériques audio et vidéo connectés à l'ordinateur.Webcam et microphone Cette partie a été écrite par Jérôme Lambert. etc sans l'autorisation expresse de l'auteur. ne peut être faite de ce site et de l'ensemble de son contenu : textes. Droits de diffusion permanents accordés à developpez LLC.AllowedDeviceAccess || CaptureDeviceConfiguration. La première classe dont vous aurez besoin est « CaptureDeviceConfiguration » qui permet de demander à l'utilisateur l'autorisation d'utiliser les périphériques de Webcam et microphone grâce à la méthode statique « RequestDeviceAccess ».Media » pour intéragir avec les périphériques audio et vidéo. on va devoir créer une instance de la classe « CaptureSource » en initialisant ses propriétés « VideoCaptureDevice » et « AudioCaptureDevice » pour spécifier les périphériques vidéo et audio à utiliser.Benjamin Roux. Pour éviter de devoir redemander l'accès aux périphériques. images.developpez. -9Copyright 2009 . même partielle. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Il est aussi possible de récupérer le périphérique audio par défaut via la méthode statique « GetDefaultAudioCaptureDevice ».com/articles/csharp/silverlight-4 . Pour cela.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 6 . AudioCaptureDevice audioDevice = CaptureDeviceConfiguration. VideoCaptureDevice videoDevice =CaptureDeviceConfiguration. De nouvelles classes sont à présent disponibles au sein de l'espace de noms « System.RequestDeviceAccess()) { } Une fois que l'utilisateur a confirmé l'accès à ses périphériques. il est possible d'utiliser la propriété « AllowedDeviceAccess » qui renvoie vrai dans le cas où l'utilisateur a déjà donné son accord pour l'accès à ses périphériques au cours de la session.Windows. if (videoDevice != null && audioDevice != null) { } Pour initialiser la capture vidéo. le support de la Webcam et du microphone. if (CaptureDeviceConfiguration. http://broux. Aucune reproduction. L'appel à cette méthode lancera une boite de dialogue de confirmation auprès de l'utilisateur.GetDefaultAudioCaptureDevice().

Fill. Pour ce faire. documents.FriendlyName). rectangle1. etc sans l'autorisation expresse de l'auteur.Show(videoDevice.SetSource(captureSource).AudioCaptureDevice = audioDevice. c'est aussi simple que le démarrage grâce à la méthode « Stop ». Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.10 Copyright 2009 .Started) { _captureSource. foreach (var audioDevice in audioDevices) MessageBox. il ne reste plus qu'à démarrer le périphérique grâce à la méthode « Start » de notre classe « CaptureSource ».Stretch = Stretch. mais il est aussi possible de récupérer l'ensemble des périphériques vidéo et audio disponibles sur la machine de l'utilisateur.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) var captureSource = new CaptureSource(). Pour cela. captureSource. captureSource. .State == CaptureState.developpez.Stop(). if (_captureSource != null && _captureSource. L'utilisateur a aussi la possibilité de consulter la liste de ses périphériques vidéo et audio disponibles et ainsi changer ceux par défaut. VideoBrush videoBrush = new VideoBrush(). Dans notre exemple.Show(audioDevice.GetAvailableVideoCaptureDevices(). on utilisera les méthodes statiques « GetAvailableVideoCaptureDevices » et « GetAvailableAudioCaptureDevices » de la classe « CaptureDeviceConfiguration ». il suffit de se rendre dans les paramètres de l'application Silverlight en faisant un clique droit sur l'application Silverlight et en se rendant dans l'onglet « Webcam / Mic ».Benjamin Roux.FriendlyName). var audioDevices = CaptureDeviceConfiguration. Droits de diffusion permanents accordés à developpez LLC. Vous pourrez aussi vous aider de la propriété « State » pour déterminer si la capture est bien démarrée. videoBrush. var videoDevices = CaptureDeviceConfiguration. Pour l'arrêt de la capture. vous allez pouvoir afficher votre capture vidéo directement dans un élément de votre application Silverlight grâce à la classe « VideoBrush ».VideoCaptureDevice = videoDevice.com/articles/csharp/silverlight-4 . ne peut être faite de ce site et de l'ensemble de son contenu : textes. foreach (var videoDevice in videoDevices) MessageBox. Aucune reproduction. même partielle. Enfin. http://broux. nous avons décidé d'utiliser les périphériques vidéo et audio par défaut. videoBrush. } Pour finir.Fill = videoBrush.GetAvailableAudioCaptureDevices(). images.

Aucune reproduction. System. etc sans l'autorisation expresse de l'auteur. System.Net.Collections. ne peut être faite de ce site et de l'ensemble de son contenu : textes.Windows.Windows. public MainPage() { InitializeComponent().Controls. Droits de diffusion permanents accordés à developpez LLC.Input.Windows. System.Documents.Media. } private void buttonStart_Click(object sender.Animation.Windows.Windows. System.developpez. System. System.Generic. RoutedEventArgs e) { if (_captureSource != null .com/articles/csharp/silverlight-4 .Shapes.Linq. System. images. System. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.Windows.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) Le code complet : using using using using using using using using using using using System. http://broux. System. même partielle. System.Media.11 Copyright 2009 .Windows. documents.Benjamin Roux. namespace SilverlightApplication1 { public partial class MainPage : UserControl { CaptureSource _captureSource = null.

documents.Stretch = Stretch. http://broux.Stop().GetAvailableAudioCaptureDevices().Prendre une photo à partir du flux vidéo Il est également possible de prendre une photo à partir du flux vidéo.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) && _captureSource. _captureSource. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. _captureSource.. var audioDevices = CaptureDeviceConfiguration.VideoCaptureDevice = videoDevice.FriendlyName).RequestDeviceAccess()) { VideoCaptureDevice videoDevice = CaptureDeviceConfiguration.Fill.developpez.Result.com/articles/csharp/silverlight-4 . foreach (var videoDevice in videoDevices) MessageBox..12 Copyright 2009 . videoBrush. .SetSource(_captureSource).AllowedDeviceAccess || CaptureDeviceConfiguration. Source. } } private void buttonDevices_Click(object sender. _captureSource.Show("Accès refusé par l'utilisateur ou aucun périphérique vidéo ou audio n'est disponible. if (videoDevice != null && audioDevice != null) { _captureSource = new CaptureSource().CaptureImageCompleted += (o.Show(audioDevice."). } if (CaptureDeviceConfiguration. RoutedEventArgs e) { if (_captureSource != null && _captureSource.Fill = videoBrush. AudioCaptureDevice audioDevice = CaptureDeviceConfiguration. } else { } MessageBox. } } private void buttonStop_Click(object sender. } } } Vous pouvez également tester une démo de l'application ici : silverlight-4-webcam-and-mic/ http://dotnetdemos.Started) { _captureSource.Stop().AudioCaptureDevice = audioDevice.State == CaptureState. VideoBrush videoBrush = new VideoBrush().Benjamin Roux. Aucune reproduction.GetAvailableVideoCaptureDevices(). Droits de diffusion permanents accordés à developpez LLC.Started) { _captureSource. rectangle1. foreach (var audioDevice in audioDevices) MessageBox. etc sans l'autorisation expresse de l'auteur.GetDefaultVideoCaptureDevice().com/jlambert/ 6-1 . .State == CaptureState. même partielle. videoBrush.FriendlyName). RoutedEventArgs e) { var videoDevices = CaptureDeviceConfiguration. ne peut être faite de ce site et de l'ensemble de son contenu : textes.Show(videoDevice.Start().developpez. images. Pour cela la classe CaptureSource met à notre disposition une méthode AsyncCaptureImage. e) => { var bmp = e.GetDefaultAudioCaptureDevice(). }.

ne peut être faite de ce site et de l'ensemble de son contenu : textes. .com/articles/csharp/silverlight-4 . etc sans l'autorisation expresse de l'auteur. http://broux.13 Copyright 2009 .developpez. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.Benjamin Roux.CaptureImageAsync().Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) Source. même partielle. images. Aucune reproduction. documents. Droits de diffusion permanents accordés à developpez LLC.

Bold). } private void addImage_Click(object sender. même partielle. etc sans l'autorisation expresse de l'auteur. TextDecorations. } richText. Ici j'ai mis une image mais on pourrait mettre un DataGrid. http://broux.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.Content> </Button> <Button x:Name="addImage" Content="Add image" Click="addImage_Click" /> </StackPanel> <RichTextArea x:Name="richText" Grid.FontStyleProperty.Underline). ne peut être faite de ce site et de l'ensemble de son contenu : textes.developpez. } private void underline_Click(object sender. RoutedEventArgs e) { richText. RoutedEventArgs e) { richText. Exemple basique : <Grid x:Name="LayoutRoot" Background="White"> <Grid.Selection.Content> <TextBlock Text="U" TextDecorations="Underline" /> </Button.Selection.FontWeightProperty.RichtextArea Un nouveau contrôle fait également son apparition.com/articles/csharp/silverlight-4 . FontWeights. Aucune reproduction. } private void italic_Click(object sender.Benjamin Roux.Relative)) }.Italic). La chose merveilleuse est que nous pouvons également insérer n'importe quel type de contrôle via l'objet InlineUiContainer. Maintenant il nous reste à écrire un peu de code private void bold_Click(object sender.Content> </Button> <Button x:Name="italic" Click="italic_Click" > <Button.TextDecorationsProperty.SetPropertyValue(TextElement.Row="1" /> </Grid> On définit notre interface composée de 4 boutons (gras.14 Copyright 2009 .Row="0" Orientation="Horizontal"> <Button x:Name="bold" Content="B" FontWeight="Bold" Click="bold_Click" /> <Button x:Name="underline" Click="underline_Click"> <Button.Child = new Image { Source = new BitmapImage(new Uri("Images/moi. Chaque Paragraph peut contenir d'autres éléments tels que : . RoutedEventArgs e) { richText.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 7 .Content> <TextBlock Text="U" FontStyle="Italic" /> </Button.jpg".Selection. container. documents. UriKind. FontStyles. il s'agit d'un éditeur de texte riche.Insert(container).RowDefinitions> <StackPanel Grid. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.SetPropertyValue(TextElement.Selection. souligné. RoutedEventArgs e) { InlineUIContainer container = new InlineUIContainer(). images. Comme vous pouvez le voir le RichText possède une propriété Selection représentant le texte sélectionné et auquel nous allons appliquer nos « styles ». Droits de diffusion permanents accordés à developpez LLC. italique et ajouter une image) et de notre éditeur. un bouton ou même un TreeView ! Un RichTextBox est un enchainement de Paragraph.SetPropertyValue(TextElement.

Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. etc sans l'autorisation expresse de l'auteur.com/articles/csharp/silverlight-4 .Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) • • • • • • • • Inline (peut être un InlineUiContainer. un Run ou un Span) InlineUiContainer (Bouton. Droits de diffusion permanents accordés à developpez LLC.15 Copyright 2009 . un LineBreak. images. Aucune reproduction.Benjamin Roux. ne peut être faite de ce site et de l'ensemble de son contenu : textes. . même partielle. DataGrid. documents. http://broux.) Run (possède une propriété Text) Span (qui est une collection de Inline) Bold (pour mettre un texte en gras) <Bold>Texte</Bold> Hyperlink (un lien hypertexte) Italic (pour mettre un texte en italique) Underline (pour souligner un texte) Le code précédent peut donner le résultat suivant Ce contrôle peut devenir tout à fait puissant ! A mon avis il ne faudra pas attendre beaucoup avant que des personnes ne distribuent un joli éditeur de texte en Open-Source.developpez.

Comme pour plusieurs fonctionnalités dans Silverlight. } richText. Aucune reproduction. paragraph. On peut donc copier/coller un texte de/vers Word par exemple (simplement le texte pas les styles).Selection. même partielle.developpez. Droits de diffusion permanents accordés à developpez LLC.Text). Cette fonctionnalité fait donc son apparition pour le bonheur des développeurs. etc sans l'autorisation expresse de l'auteur. images.SetText(richText. Exemple simple en rajoutant 2 boutons Copy et Paste à notre code précédent (RichTextArea). http://broux. appui sur une touche du clavier.16 Copyright 2009 . documents. . } private void paste_Click(object sender. une copie dans le presse-papier ne peut se faire que par une action de l'utilisateur (clic sur un bouton.Add(paragraph). Une méthode permet également de savoir si du texte est présent dans le presse-papier. ne peut être faite de ce site et de l'ensemble de son contenu : textes.Support du presse-papier Dans les versions précédentes de Silverlight il fallait passer par un appel en Javascript qui fonctionnait le plus souvent uniquement sous Internet Explorer.GetText() }).Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 8 .com/articles/csharp/silverlight-4 . private void copy_Click(object sender.Blocks. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.Add(new Run { Text = Clipboard.Benjamin Roux. RoutedEventArgs e) { Paragraph paragraph = new Paragraph(). RoutedEventArgs e) { Clipboard.) et provoque l'affichage de ce message Ce message n'apparait qu'une seule fois par session.Inlines. Le Clipboard Silverlight est commun à toutes les applications Silverlight mais également à la machine de l'utilisateur.

Dans les précédentes versions. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.developpez. images. documents. http://broux.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 9 .17 Copyright 2009 . Droits de diffusion permanents accordés à developpez LLC. A noter que l'hébergement de HTML ne fonctionne que dans une application Out Of Browser.Hébergement de HTML Silverlight 4 permet également d'afficher du HTML au sein d'une application. Aucune reproduction.Benjamin Roux. même partielle. ne peut être faite de ce site et de l'ensemble de son contenu : textes. c'était faisable en affichant une div HTML par-dessus l'application Silverlight là où on voulait qu'elle s'affiche.com/articles/csharp/silverlight-4 . etc sans l'autorisation expresse de l'auteur. Dans le cas contraire vous obtiendrez ce résultat .

UriKind. Droits de diffusion permanents accordés à developpez LLC.html". ne peut être faite de ce site et de l'ensemble de son contenu : textes. images.Navigate(new Uri("http://localhost/index. http://broux. Aucune reproduction.developpez.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 9-1 . Pour des raisons de sécurité le contrôle WebBrowser ne peut afficher que du contenu se trouvant dans le même domaine que l'application Silverlight. . etc sans l'autorisation expresse de l'auteur. browser. Deux méthodes utiles : Navigate(url) et NavigateToString(html) <WebBrowser x:Name="browser" Width="400" Height="300" /> On peut donc écrire en code behind. le même protocole et le même port. même partielle. documents.Benjamin Roux.Absolute)).18 Copyright 2009 . Ou bien browser.WebBrowser Un contrôle fait donc son apparition. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. ce qui inclut le même domaine.NavigateToString("<b>Html hosté dans une application SL</b><br/><p>C'est top<p>"). Pour afficher du contenu d'un autre domaine on peut passer par une iframe hostée dans notre page se trouvant sur notre domaine. le WebBrowser.com/articles/csharp/silverlight-4 .

Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.19 Copyright 2009 .NavigateToString("<iframe src=\"http://www. etc sans l'autorisation expresse de l'auteur.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) Le WebBrowser est capable d'afficher n'importe quel type de contenu même des applications Flash (si le plugin est installé sur la machine bien entendu).youtube.Benjamin Roux. http://broux. . images. Aucune reproduction.developpez. Droits de diffusion permanents accordés à developpez LLC.com/watch?v=FzRH3iTQPrk\" width=\"600px \" height=\"600px\" />"). ne peut être faite de ce site et de l'ensemble de son contenu : textes.com/articles/csharp/silverlight-4 . documents. browser. même partielle.

developpez. . etc sans l'autorisation expresse de l'auteur. images. Aucune reproduction. Droits de diffusion permanents accordés à developpez LLC. même partielle.com/articles/csharp/silverlight-4 . http://broux.20 Copyright 2009 . documents. ne peut être faite de ce site et de l'ensemble de son contenu : textes. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.HtmlBrush Il est également possible d'appliquer un brush de type Html via le HtmlBrush.Benjamin Roux.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 9-2 .

http://broux. Droits de diffusion permanents accordés à developpez LLC. . Aucune reproduction.Fill != null) ((HtmlBrush)rect. timer.Interval = TimeSpan.Start(). void MainPage_Loaded(object sender.Fill).Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) Exemple : <StackPanel x:Name="LayoutRoot" Background="White"> <WebBrowser x:Name="browser" Source="youtube.Fill> </Rectangle> </StackPanel> L'astuce est qu'il faut rafraichir notre HtmlBrush via la méthode Redraw.com/articles/csharp/silverlight-4 . timer. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.developpez. même partielle. documents.Redraw().Benjamin Roux. RoutedEventArgs e) { DispatcherTimer timer = new DispatcherTimer().Fill> <HtmlBrush SourceName="browser" /> </Rectangle.html" Width="300" Height="300" Visibility="Collapsed" /> <Rectangle x:Name="rect" Width="300" Height="300"> <Rectangle. EventArgs e) { if (rect.Tick += new EventHandler(timer_Tick).21 Copyright 2009 . } void timer_Tick(object sender. } On peut alors obtenir un rectangle dont le remplissage provient d'un WebBrowser. ne peut être faite de ce site et de l'ensemble de son contenu : textes. timer. etc sans l'autorisation expresse de l'auteur. images.FromMilliseconds(100).

http://broux. même partielle.com/articles/csharp/silverlight-4 . images.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) Exemple avec un bouton : . Aucune reproduction. ne peut être faite de ce site et de l'ensemble de son contenu : textes. etc sans l'autorisation expresse de l'auteur.developpez.Benjamin Roux. Droits de diffusion permanents accordés à developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.22 Copyright 2009 . documents.

App.Current. } 10-2 .com/articles/csharp/silverlight-4 .developpez.GetFolderPath(Environment.SpecialFolder.ItemsSource = Directory. il s'agit d'un mode dit « Trusted » (« de confiance » en français).Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 10 . etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.Accès au système de fichier local Une application Out Of Browser en mode Trusted permet l'accès au système de fichiers local.MyMusic)). ne peut être faite de ce site et de l'ensemble de son contenu : textes. même partielle. images.EnumerateDirectories(Environment.Interopérabilité COM Une application Trusted peut également interagir avec des composants COM comme par exemple Word ou Excel ! Il suffit pour cela de passer par l'API AutomationFactory. A l'installation la fenêtre change quelque peu Dans ce mode plusieurs privilèges sont accordés. http://broux.Current. Droits de diffusion permanents accordés à developpez LLC. Aucune reproduction.Benjamin Roux. Une propriété permet de savoir si l'application tourne en mode privilégiée.Trusted Application Un nouveau mode d'application Out Of Browser fait également son apparition.HasElevatedPermissions) { files. Exemple avec de l'automation Word. if (App.HasElevatedPermissions 10-1 . .23 Copyright 2009 . documents.

Support total du clavier en plein-écran Une application Trusted offre également le support complet du clavier en plein-écran. .Documents. dynamic wordDoc = wordApp.Benjamin Roux. documents. à Windows Media Player et à tout plein d'autres fonctionnalités ! 10-3 . On pourrait par la suite bien entendu rajouter du texte dans le document. ne peut être faite de ce site et de l'ensemble de son contenu : textes. images.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) if (App. http://broux.developpez. Aucune reproduction.24 Copyright 2009 . } /* automation Word */ Ce code ouvre Word et crée un document.Visible = true. seules les touches directionnelles et la barre d'espace sont disponibles. même partielle. Pour rappel. Droits de diffusion permanents accordés à developpez LLC.Application"). lorsqu'une application Silverlight « normale » se trouve en plein écran. wordApp.Current.CreateObject("Word.com/articles/csharp/silverlight-4 . etc sans l'autorisation expresse de l'auteur. L'automation peut également permettre d'accéder aux périphériques de la machine.HasElevatedPermissions) { dynamic wordApp = AutomationFactory.Add(). Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.

Droits de diffusion permanents accordés à developpez LLC. http://broux.API de notification Une application Out Of Browser peut maintenant afficher des notifications style Live Messenger lorsqu'un contact se connecte.RowDefinitions> <RowDefinition Height="25" /> <RowDefinition /> </Grid.Width = 200. etc sans l'autorisation expresse de l'auteur. /* le contrôle à afficher */ window.0. window. /* affichage de 2 secondes (2000 ms) */ window. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.com/articles/csharp/silverlight-4 . un simple UserControl.25 Copyright 2009 . window.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center" </Grid> </Border> </Grid> Le résultat : . Aucune reproduction.Current. documents. ne peut être faite de ce site et de l'ensemble de son contenu : textes.developpez.Height = 100. } Avec CustomNotification.0. <Grid x:Name="LayoutRoot" Background="Transparent"> <Border CornerRadius="15" Background="LightBlue"> <Grid> <Grid.Benjamin Roux.RowDefinitions> <TextBlock Text="Live Messenger" Grid.0" /> <TextBlock Text="Ben vient de se connecter" Grid. images. Height = 100 }. même partielle.Show(2000).Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 11 .HasElevatedPermissions) { /* Notification API */ NotificationWindow window = new NotificationWindow(). if (App.Row="0" VerticalAlignment="Center" Margin="5.Content = new CustomNotification { Width = 200.

26 Copyright 2009 .TextTrimming Silverlight 4 apporte également quelques améliorations par rapport à l'affichage de texte. http://broux. ». <TextBlock Text="Voici un texte pas très long mais assez long pour le test" /> <TextBlock Text="Voici un texte pas très long mais assez long pour le test" TextTrimming="WordEllipsis" Width="150 La propriété TextTrimming permet de couper un texte trop long par « . même partielle. Aucune reproduction.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 12 . ne peut être faite de ce site et de l'ensemble de son contenu : textes. documents. images. Droits de diffusion permanents accordés à developpez LLC.com/articles/csharp/silverlight-4 .Benjamin Roux. . Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. etc sans l'autorisation expresse de l'auteur.developpez.

Drop += new DragEventHandler(textBox_Drop). documents. Droits de diffusion permanents accordés à developpez LLC.Benjamin Roux.27 Copyright 2009 .FileDrop) as FileInfo[])[0].ReadToEnd(). } textBox.GetData(DataFormats. Très utile pour un Upload de fichier ! . DragEventArgs e) { /* retourne un tableau de FileInfo (multi drag&drop). RoutedEventArgs e) { textBox.com/articles/csharp/silverlight-4 .Text = info.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 13 . Ces quelques lignes de code permettent d'afficher le contenu d'un fichier du bureau dans notre TextBox Silverlight. DragLeave et DragOver.AllowDrop = true. je recupère seulement le premier */ FileInfo info = (e.developpez. http://broux.Data. même partielle. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. void MainPage_Loaded(object sender. images. ne peut être faite de ce site et de l'ensemble de son contenu : textes.Drag&Drop à partir du bureau Silverlight 4 permet maintenant de glisser-déposer un élément du bureau vers notre application Silverlight. } textBox. D'autres évènements peuvent également servir comme DragEnter. etc sans l'autorisation expresse de l'auteur. void textBox_Drop(object sender.OpenText(). Aucune reproduction.

client. etc sans l'autorisation expresse de l'auteur. client. client.Authentification Réseau Il arrive parfois que l'on veuille accéder à une ressource sécurisée. même partielle.Browser. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. ne peut être faite de ce site et de l'ensemble de son contenu : textes.Credentials = new NetworkCredential("login".com/maressourceprotegee")). Aucune reproduction. . System.DownloadStringCompleted += (o.ClientHttp). images.DownloadStringAsync(new Uri("http://mondomaine. WebClient client = new WebClient().Benjamin Roux.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 14 . /* on spécifie que les requêtes sur http passe par la pile réseau ClientHttp */ WebRequest.28 Copyright 2009 . "domain").RegisterPrefix("http://".com/articles/csharp/silverlight-4 .. // nous voulons utiliser nos propres credentials client. "password". Maintenant avec SL4 il est possible de passer des credentials (identifiants) lors d'une requête avec la pile réseau ClientHttp.Net. Droits de diffusion permanents accordés à developpez LLC. http://broux.UseDefaultCredentials = false. documents.WebRequestCreator.. e2) => .developpez.

images.29 Copyright 2009 . ElementName=slider}" ScaleY="1" CenterX="50" CenterY="50" /> </Image. Auparavant seul le binding sur des FrameworkElement était supporté.StringFormat. On peut donc maintenant binder des propriétés comme l'Angle d'un RotateTransform ou le ScaleX d'un ScaleTransform. <Image Source="Images/moi.Amélioration du Data Binding 15-1 . documents. Auparavant il fallait passer par un Converter. etc sans l'autorisation expresse de l'auteur. TargetNullValue.com/articles/csharp/silverlight-4 .developpez.Benjamin Roux.jpg" Width="100" Height="100"> <Image. http://broux.RenderTransform> </Image> <Slider x:Name="slider" Maximum="10" /> 15-2 .Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 15 . Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.RenderTransform> <ScaleTransform ScaleX="{Binding Path=Value. FallbackValue D'autres propriétés ont également été ajoutées pour améliorer le Binding. même partielle. ne peut être faite de ce site et de l'ensemble de son contenu : textes. Aucune reproduction. <TextBlock Text="{Binding StringFormat='dd-MM-yyyy'}" /> . 15-2-1 .Binding sur DependencyObject Il est désormais possible de réaliser un Binding sur un DependencyObject.StringFormat Permet de formater un objet. Droits de diffusion permanents accordés à developpez LLC.

Droits de diffusion permanents accordés à developpez LLC. <TextBlock Text="{Binding TargetNullValue=Oups}" /> 15-2-3 .Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) this. <TextBlock Text="{Binding FallbackValue=Oups}" /> .Now.TargetNullValue Affiche une valeur lorsque la valeur utilisée pour le Binding vaut null.developpez. documents. http://broux. même partielle. images.DataContext = DateTime.com/articles/csharp/silverlight-4 .Benjamin Roux. ne peut être faite de ce site et de l'ensemble de son contenu : textes. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.FallbackValue Affiche une valeur lorsque l'opération de Binding est incapable de retourner une valeur (mauvais Path par exemple). Aucune reproduction.30 Copyright 2009 . etc sans l'autorisation expresse de l'auteur. 15-2-2 .

images.31 Copyright 2009 . Aucune reproduction. Droits de diffusion permanents accordés à developpez LLC. http://broux. Plus besoin de spécifier de clé.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 16 . même partielle.Benjamin Roux.Resources> Maintenant tous les boutons de notre application auront le style définit plus haut.developpez.Resources> <Style TargetType="Button"> <Setter Property="Background" Value="Blue" /> <Setter Property="Foreground" Value="LightGreen" /> <Setter Property="FontSize" Value="42" /> </Style> </Grid. ne peut être faite de ce site et de l'ensemble de son contenu : textes. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. documents. etc sans l'autorisation expresse de l'auteur. auparavant présent dans le Silverlight Toolkit. <Grid. Il se peut bien entendu que l'on ne veuille pas appliquer le thème à un bouton spécifique. pour cela rien de plus simple : <Button Content="Bouton normal" Style="{x:Null}" /> .Thèmes implicites Silverlight 4 intègre le système des thèmes implicites.com/articles/csharp/silverlight-4 .

Managed Extensibility Framework (MEF) Silverlight 4 supporte désormais MEF qui apporte un système de plug-ins. ne peut être faite de ce site et de l'ensemble de son contenu : textes. Aucune reproduction. Pour plus d'informations : http://www. http://broux.codeplex. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. images.32 Copyright 2009 . Droits de diffusion permanents accordés à developpez LLC.com/MEF . documents.Benjamin Roux.com/articles/csharp/silverlight-4 .Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 17 . etc sans l'autorisation expresse de l'auteur. même partielle.developpez.

Un travail en vue pour les développeurs de framework MVVM ! .Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 18 . images.Benjamin Roux. http://broux. utiles pour des patterns style MVVM (Model-View-ViewModel).developpez.com/articles/csharp/silverlight-4 . Droits de diffusion permanents accordés à developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.33 Copyright 2009 . etc sans l'autorisation expresse de l'auteur. ne peut être faite de ce site et de l'ensemble de son contenu : textes. Les propriétés Command et CommandParameter sont disponibles sur le contrôle ButtonBase et Hyperlink. même partielle. Aucune reproduction.ICommand et Command Silverlight 4 apporte également le support de l'interface ICommand et de la propriété Command. documents.

Unloaded. afin.Divers Des évènements ont également rajoutés sur le contrôle ItemsControl : BeforeLoaded. même partielle. Droits de diffusion permanents accordés à developpez LLC. . Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Loaded.Benjamin Roux. documents. etc sans l'autorisation expresse de l'auteur. Aucune reproduction. ne peut être faite de ce site et de l'ensemble de son contenu : textes.developpez. http://broux.com/articles/csharp/silverlight-4 . par exemple.34 Copyright 2009 .Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 19 . images. de pouvoir rajouter des animations.

ne peut être faite de ce site et de l'ensemble de son contenu : textes. .com/articles/csharp/silverlight-4 .35 Copyright 2009 . Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. et ce n'est pas tout : ce n'est qu'une beta ! En espérant d'autres améliorations dans la version finale.Benjamin Roux. Droits de diffusion permanents accordés à developpez LLC. etc sans l'autorisation expresse de l'auteur. http://broux.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) 20 . même partielle.Conclusion Silverlight 4 apporte avec lui son lot de surprises. documents.developpez. images. Aucune reproduction.

documents.Benjamin Roux. ne peut être faite de ce site et de l'ensemble de son contenu : textes. etc sans l'autorisation expresse de l'auteur.Les nouveautés de Silverlight 4 par Benjamin Roux (Retour aux articles) Remerciements Merci à toute l'équipe . Merci également à Furr pour sa relecture finale. même partielle.NET pour leurs relecture et corrections.com/articles/csharp/silverlight-4 . Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Aucune reproduction. http://broux.36 Copyright 2009 . images. . ainsi que Jérôme Lambert pour sa partie sur la webcam et le microphone.developpez. Droits de diffusion permanents accordés à developpez LLC.