Clipboard et Drag & Drop Silverlight 4.0

19. October 2010 by Julien.SILVAIN

 

 

Le clipboard et le drag and drop sont des nouvelles fonctionnalités arrivées avec la version 4 de Silverlight.

Ici ces nouveautés permettent de faciliter la maniabilité et la fonctionnalité du Silverlight 4.0.

Ci-dessous vous pouvez observer le code nécessaire au bon fonctionnement de ces nouvelles fonctionnalités.

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Windows.Media.Imaging;

 

namespace _04_ClipboardAndDragDrop

{

    public partial class MainPage : UserControl

    {

        public MainPage()

        {

            InitializeComponent();

        }

 

        private void OnCopy(object sender, RoutedEventArgs e)

        {

            Clipboard.SetText(copyPasteBox.Text);

        }

 

        private void OnPaste(object sender, RoutedEventArgs e)

        {

            copyPasteBox.Text = Clipboard.GetText();

        }

 

        private void OnDragEnter(object sender, System.Windows.DragEventArgs e)

        {

                   

        }

 

        private void OnDragOver(object sender, System.Windows.DragEventArgs e)

        {

                   

        }

 

        private void OnDrop(object sender, System.Windows.DragEventArgs e)

        {

                    if(e.Data.GetDataPresent(DataFormats.FileDrop))

                    {

                           e.Handled = true;

                var files = e.Data.GetData(DataFormats.FileDrop) as IEnumerable<System.IO.FileInfo>;

                if (files == null)

                    return;

 

                foreach (var file in files)

                {

                    try

                    {

                        var img = new BitmapImage();

 

                        img.SetSource(file.OpenRead());

                        wrapPanel.Children.Add(new Image { Source = img, MaxWidth = 150, Margin = new Thickness(4) });

                    }

                    catch

                    {

                    }

                }

             }

        }

    }

}

 

Pour copier le texte rentré dans la TextBox il suffit juste d’appeler la méthode « SetText » de l’objet Clipboard.

private void OnCopy(object sender, RoutedEventArgs e)

{

     Clipboard.SetText(copyPasteBox.Text);

}

 

Le résultat ainsi obtenu est présenté ci-dessous.

 

 

Il en est de même pour coller une sélection avec la méthode GetText().

private void OnPaste(object sender, RoutedEventArgs e)

{

     copyPasteBox.Text = Clipboard.GetText();

}

 

Cette nouvelle fonctionnalité n’a pas vraiment d’utilité étant donné que le très célèbre « CTRL+C » et  « CTRL+V » fonctionne parfaitement ! Mais dans le futur qui sait ? Peut être que cette nouveauté sera très utilisée dans une application donnée.

 

En ce qui concerne le Drag & Drop, ce contrôle est encore assez limité. En effet il nous est impossible de revenir en arrière du moment que le Drag & Drop est déjà effectué.

 


Comme le screenshot du dessus nous le montre, cette nouvelle fonctionnalité nous permet d’importer tout simplement des fichiers dans une application Silverlight 4.0 grâce à un simple glissé-déposer.

Cette fonctionnalité pourrait tout à fait être implémentée sur une plateforme de rendu de projet ou bien sûr, comme présenté dans l’exemple, être intégrée dans une application visant à l’upload de fichiers.

 

 

En conclusion, nous pouvons dire que de par ces nouvelles fonctionnalités, Silverlight exprime sa volonté d’améliorer son interface avec les utilisateurs. Certainement pour viser un public moins averti qui aime bien les applications faciles d’utilisation et attrayantes.

 

 

C#, Silverlight, Visual Studio 2010

Accéder aux fichiers locaux en Silverlight 4.0

18. October 2010 by Julien.SILVAIN



L'un des points de faiblesses de silverlight 3.0 comparé a ses concurents était de ne pas povoir accéder a ses fichiers locaux directement a partir de l'application silverlight 3.0. Désormais, Grâce à la nouvelle version de silverlight (silverlight 4.0) tout cela est maintenant possible.



Cette nouveauté se résume à une méthode : « Environment.GetFolderPath » qui nous permet de récupérer le répertoire du chemin désiré. Dans le cas opposé, si l’on veut énumérer tous les fichiers contenus dans un répertoire, nous avons la méthode :  « Directory.EnumerateFiles »


using System;

using System.Collections.Generic;

using [...]

 

namespace APILocalFiles

{

    public partial class MainPage : UserControl

    {

        public MainPage()

        {

            InitializeComponent();

        }

 

        private void OnEnumerateLocaFiles(object sender, RoutedEventArgs e)

        {

            List<string> photosInFolder = new List<string>();

 

            var photos = Directory.EnumerateFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures));

 

            foreach (var item in photos)

            {

                photosInFolder.Add(item);

            }

 

            lbPhotos.ItemsSource = photosInFolder;

        }

    }

}


Ici il est créé une méthode permettant d’énumérer tous les fichiers et dossiers contenus dans le répertoire indiqué en paramètre.

La boucle foreach permet ici d’ajouter chaque élément énuméré à la liste de chaine de caractère créée au début.



Après compilation on obtient la fenêtre ci-dessus.

Cependant si l’on clique sur « Enumerate Local Files » Visual Studio nous sort une exception présentée ci-dessous. En effet, pour que cette nouvelle API fonctionne correctement, il faut absolument que l’application s’exécute en dehors du navigateur et en mode plus de privilège.




Pour palier à cette exception il suffit d’aller dans les propriétés de l’application silverlight et cocher les lignes suivantes :

            -« Enable running application out of browser »



-« Require elevated trust when running outside the browser » après avoir cliqué sur « Out-of-Browser Settings… »



Ensuite on relance l’application et là, à l’aide d’un clic droit, on installe l’application sur l’ordinateur.

En effet, l'accés aux fichiers locaux se fait en Out Of Browser (OOB)

De plus, si par exemple nous voulons implanter cette fonctionalité dans une application utilisée par de nombreuses personnes, ces dernieres devront toutes installer cette application en "local" sur leurs machines. Ce dernier point peut à la fois etre un avantage et un inconvénient.



Une fois cette application installée, si l’on clique sur « enumerate files » la liste des dossiers et documents contenus dans le répertoire est affichée, comme cela nous est détaillé ci-dessous :



Nous pouvons dés-lors affirmer que par cette nouveauté ainsi que bien d'autres non citées ici, silverlight 4.0 exprime bien sa volonté de revenir au contact de ses principaux concurents tel que le flash.

Bien évidemment a l'heure où est écrit cet article la version 4 de Silverlight n'est aps une réelle nouveauté. De plus avec la sortie de la version 5 de HTML, cette derniere tend à faire oulier silverlight.


Attendons de voir la version 5 de Silverlight qui s'annoce assez intérésente :)

 

C#, Silverlight, Visual Studio 2010

Mode offline de vos applications sous Silverlight

25. September 2010 by Mustapha.AMALLAHI

 

Une des nouveautés parmi les nombreuses disponibles dans  Silverlight 3 & 4 est la possibilité de créer des applications utilisable hors-navigateur (out-of-browser), peut-être un nouveau concurrent pour Adobe-Air.

Pour mettre en place cet outil, rien de plus simple et  en seulement quelques clic, pour ce faire suivez les instructions ci-dessous :

1-Mise en place du mode Offline.

Commencez par faire un clic droit sur votre projet puis cliquez sur propriété (Properties)

 

http://www.labo-dotnet.com/image.axd?picture=2010%2f7%2f0.jpg

 

Une fenêtre s’ouvre cochez la case « Enable running application out of the browser »

Puis cliquez sur le bouton  « Out-of-browser Settings ... »

 

http://www.labo-dotnet.com/image.axd?picture=2010%2f7%2f1.jpg

 

Une nouvelle fenêtre s’ouvre, cette fois nous allons renseigner le titre, une description, la taille de la fenêtre de l’application offline ainsi que les différentes icônes de différentes tailles qui nous permettront de personnaliser notre application offline.

 

http://www.labo-dotnet.com/image.axd?picture=2010%2f7%2f2.jpg

 

On finit par cliquer sur OK puis on exécute l’application.

 

2) Installation de l’application :

Pour installer l’application il existe 2 façons différentes, en faisant un simple clic droit puis cliquer sur « Installer "le nom de votre application" sur cet ordinateur… »

 

 

http://www.labo-dotnet.com/image.axd?picture=2010%2f7%2fzzzz.png

 

Ou bien en créant un bouton et en ajoutant cette ligne au clic « Application.Current.Install() ; »

Une fois la méthode choisi, cochez les 2 cases « Menu démarrer » et/ou « Bureau » pour que l’application puisse créer des raccourcis dans les endroits spécifiés.

 

 

 

http://www.labo-dotnet.com/image.axd?picture=2010%2f7%2f4.jpg

Finalement nous obtenons la même application en mode offline, avec la taille et titre spécifié, vous pouvez aussi remarquer que toutes les icônes que nous avons ajoutés précédemment ont été utilisées à différentes étapes de l’installation de l’application.

 

http://www.labo-dotnet.com/image.axd?picture=2010%2f7%2f5.jpg

3) Gestion du mode online/offline (code behind):

Deux autres petites choses à savoir :
Pour tester la connectivité réseau, il suffit de tester la valeur de retour de la méthode suivante :

NetworkInterface.GetIsNetworkAvailable()

L’événement NetworkChange.NetworkAddressChanged est déclenché lorsque la connectivité change.

Deuxième chose:

Pour tester si l’application a été lancée en mode Offline, il suffit de tester la propriété suivante :

Application.Current.RunningOffline

Ou

Application.Current.ExecutionState

Qui donne plus de détails comme nous allons voir juste après.

 

Gestion des mises à jour avec une application Offline

Lorsque l’application est lancée en mode Offline et qu’une connectivité réseau est disponible alors avec une simple requête HTTP, il regarde si le fichier .xap disponible à l’Uri original a été modifié.

En cas de modification, l’ExecutionState de l’application est assigné à la valeur DetachedUpdatesAvailable.

 

ExecutionStateChanged += new EventHandler(App_ExecutionStateChanged);

 

void App_ExecutionStateChanged(object sender, EventArgs e)

{

    if(this.ExecutionState == ExecutionStates.DetachedUpdatesAvailable)

    {

         MessageBox.Show("Une nouvelle  mise à jour de l'application est disponible, elle sera disponible à son prochain démarrage");

    }

}

 

 

 

Voilà, maintenant le mode "Out Of Browser" n'a plus aucun secret pour vous !

 

 

C#, Silverlight , , ,

Comment imprimer une application en Silverlight ?

3. September 2010 by Regis.NIOX

 

     Comme prévu, dans les nombreuses nouveautés de Silverlight 4, nous retrouvons le support de l’impression. Cette fonctionnalité, qui n’était pas présente avant, est tout de même importante pour des applications métiers et souvent incontournable pour un client, qui a souvent besoin d’imprimer des rapports, graphiques ou même encore des plannings. Cette option indispensable est assez simple à implémenter. Nous verrons comment imprimer tout l’écran, puis comment définir la zone à imprimer. Tout ceci se fera grâce à la classe « PrintDocument » qui nous permettra d’ouvrir notre boîte de dialogue et d’imprimer.

Tout d’abord pour commencer, voici un aperçu de notre application de test :

     - Une Grid contenant notre bouton, notre StackPanel.

     - Deux images, contenues dans le StackPanel.

     - Un bouton « Imprimer » pour lancer l’impression.

image

 

Comment imprimer l’application ?

Pour commencer n’oubliez pas d’indiquer l’espace nom adéquat : « System.Windows.Printing».

Voici le code XAML de notre application :

Capture

En ce qui concerne notre code behind, nous devrons dans le « MainPage » nous abonner à l’évènement « PrintPage » (pour définir ce que nous voulons imprimer) :

Capture1

     Pour l’évènement « PrintPage », nous définissons la zone à imprimer (ici l’ensemble de notre application) et le nombre de pages à imprimer. En mettant « e.HasMorePages » à « false » nous indiquons à notre application qu’il n’y a pas de pages en plus à imprimer. Si nous attribuons à cette propriété la valeur « true », l’évènement « PrintPage » se reproduira jusqu’à ce que « HasMorePages » passe à « false ».

     En ce qui concerne le bouton, vous n’avez plus qu’à appeler la méthode « Print » pour lancer l’impression et définir en même temps le nom de votre document (pour tester l’impression vous pouvez utiliser  « PDFCreator » ou d’autre logiciel similaire).

image

 

 

 

 

 

     Comme vous le voyez la zone que nous avons définie pour l’impression est l’application entière (c’est pourquoi ces horribles couleurs étaient là depuis le début). Cela nous a donc imprimé notre « Grid » entière contenant le « StackPanel », le bouton et nos images.

 

Comment personnaliser notre impression ?

     Affiner notre impression est tout aussi simple : il suffit juste de changer la zone à imprimer. Si nous voulons imprimer nos images, nous n’aurons qu’à changer la valeur de « e.PageVisual ».

Capture2

Ainsi nous aurons juste nos images d’imprimées et sans le bouton « Imprimer ». La couleur saumon du StackPanel est là pour montrer que le fond est tout de même imprimé. Il suffira de définir la couleur du fond à blanc pour n’avoir que nos images sur une feuille blanche.

image

Dans le cas où nous ne voulons pas garder la disposition de l’écran, il nous suffira juste de créer plusieurs « UIElement » dans l’évènement « PrintPage » et de renseigner à la propriété « PageVisual » le nom de notre « UIElement » racine.

Ainsi dans notre cas, les images seront aligner comme nous le souhaitons, et nous n’aurons plus nos fond apparent ainsi que notre bouton.

Capture3

image

Et voici le résultat : nos images correctement placées sans fond coloré et avec un titre. Si notre contenu est trop grand pour être correctement placé dans la « PrintableArea », il sera découpé (ce qui est le cas plus haut).

Nous avons également à notre disposition l’évènement « BeginPrint » qui nous permet de mettre en place d’autres tâches à effectuer avant d’imprimer (ouverture d’une fenêtre pour faire patienter ou visualiser l’envoi du document à l’imprimante). Avec l’évènement « EndPrint » vous pourrez mettre en place d’autres tâches une fois que l’impression sera terminée (comme par exemple envoyer un signal si l’imprimante n’a plus de papier).

 

Conclusion

     L’apparition de cette fonctionnalité avec la sortie de Silverlight 4 nous permet de rendre les applications Silverlight plus accessible pour les clients. En effet beaucoup d’entre eux trouvaient cette fonctionnalité indispensable.

     Même s’il semble facile et rapide de rendre une application Silverlight imprimable, cette fonctionnalité n’en reste pas moins importante de par son utilisation. Comme dit précédemment, pouvoir imprimer son application reste un argument de poids face à un client.

Silverlight, Visual Studio 2010

Créer un lecteur média en Silverlight

28. July 2010 by Arthur.Riolland

I) Introduction

 

Cet article a pour but de vous montrer comment créer une application très simple en Silverlight : un lecteur média !

Si vous n’avez jamais fait de Silverlight, pas de problème, une application de ce genre est parfaite pour démarrer !

Je vais supposer pour la suite de ce tutoriel que vous disposez déjà de Visual Studio 2010 et des Silverlight 4 Tools. Si ce n’est pas le cas, je vous invite à les installer avant de poursuivre votre lecture.


II)             Création d’un nouveau projet Silverlight

 

Tout d’abord, nous devons créer notre nouveau projet.

Pour cela, allez sur le menu de votre VS2010 (Visual Studio 2010), cliquez sur File, puis New Project

Sélectionnez le Template Visual C#, Silverlight. Choisissez ensuite Silverlight Application.

Rentrez un nom pour votre projet. Vous pouvez également modifier l’emplacement de votre projet.

 

Pour ce tutoriel, j’ai appelé mon projet « Lecteur média ».

Pour l’étape suivante, vérifiez que la version de Silverlight sélectionnée est bien la 4 puis cliquez sur OK.

Patientez ensuite quelques instants le temps que VS 2010 prépare votre nouveau projet.

Une fois créé, nous allons pouvoir commencer.

 

III)          Création de l’interface à l’aide du Designer

 

Dans un premier temps, nous allons utiliser l’outil Designer de Vs 2010 afin de dessiner notre interface.

Notre lecteur média sera composé de 4 boutons, un Textblock et un MédiaElement.

Vers la gauche de Vs 2010, vous trouverez une Toolbox contenant tout ces éléments. Il vous suffit de les glisser-déposer sur votre designer afin de les intégrer directement dans votre code XAML.

 

Disposez-les comme bon vous semble.

Une fois vos 6 éléments placés, modifiez leurs noms par défaut pour plus de compréhension et de lisibilité par la suite. Un des boutons sera le bouton « play_button », un autre le bouton « pause_button », un autre le bouton « stop_button » et le dernier sera le bouton « open_button » qui nous permettra d’aller chercher un fichier à lire.

Pour modifier leurs noms, modifiez la valeur de leurs attributs Name directement dans votre code XAML :

<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="0,265,0,0" Name="button1" VerticalAlignment="Top" Width="75" />

 

Devient:

 

<Button Content="Play" Height="23" HorizontalAlignment="Left" Margin="0,265,0,0" Name="play_button" VerticalAlignment="Top" Width="75" />

 

Comme vous pouvez le constater, je n’ai changé que les valeurs de «Content » et de « Name ».

 

En ce qui concerne le Textblock, il nous servira à afficher le titre de la vidéo/musique/image lue par notre futur lecteur. Videz donc son contenu « content ».

 

Text="Textblock"=> Text=""

 

Vous pouvez également le renommer. Pour ce tutoriel, je le renomme « title_block ».

 

Pour le MediaElement, je laisse le nom par défaut.

 

IV)           Positionnement de l’interface dans le code XAML


Le Designer à l’air pratique, mais en réalité, il est un peu traitre. Il est difficile d’exploiter le code qu’il génère, c’est pourquoi il est important une fois nos objets en place de redéfinir leurs emplacements dans le code XAML.


Compilons un peu notre programme pour voir. (Rappel : F5 pour compiler et shift + F5 pour pouvoir retravailler sur le code).


 

On se rend compte que le rendu sur le navigateur est bien différent de celui du Designer. Pour avoir une interface convenable, il est donc primordial d’écrire soi-même les positions et de ne pas se laisser faire par la facilité du designer !


La première chose que nous allons faire et donc de supprimer tout le bazar que nous à mis le designer : Supprimons tous les alignements et les Margins de tous nos éléments.


Une fois le ménage fait, votre code XAML devrait ressembler à ceci :

 

<UserControl x:Class="Lecteur_Média.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d"

    d:DesignHeight="300" d:DesignWidth="400">

 

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

            <Button Content="Play" Height="23"  Name="play_button"  Width="75" />

            <Button Content="Pause" Height="23"   Name="pause_button" Width="75" />

            <Button Content="Stop" Height="23"  Name="stop_button"  Width="75" />

            <Button Content="Open" Height="23"  Name="open_button"  Width="75" />

            <TextBlock Height="23"  Name="title_block" Text=""  Width="138" />

            <MediaElement Height="246"  Name="mediaElement1"  Width="400" />

    </Grid>

</UserControl>

 

 

 

Patience, là, nous avons juste nettoyé les bêtises du Designer, nous allons maintenant apporter notre propre disposition.

Tout d’abord, nous allons séparer nos différents éléments dans des Stackpanels.

 

Les Stackpanels sont une sorte de pile d’éléments qui permettent de les empiler horizontalement ou verticalement.

 

Tout d’abord, nous allons insérer tous nos éléments dans un Stackpanel global, à l’intérieur du Grid.

 

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

        <StackPanel>

            <Button Content="Play" Height="23"  Name="play_button"  Width="75" />

            <Button Content="Pause" Height="23"   Name="pause_button" Width="75" />

            <Button Content="Stop" Height="23"  Name="stop_button"  Width="75" />

            <Button Content="Open" Height="23"  Name="open_button"  Width="75" />

            <TextBlock Height="23"  Name="title_block" Text=""  Width="138" />

            <MediaElement Height="246"  Name="mediaElement1"  Width="400" />

        </StackPanel>   

    </Grid>

 

Tous nos éléments sont maintenant gentiment alignés verticalement. C’est bien, mais on ne va pas s’arrêter là !
Afin de reconstruire la structure que nous avions avant, nous allons créer de nouveaux Stackpanels qui réuniront les éléments alignés horizontalement.
Si vous regardez l’interface que j’ai faite à l’aide du designer, vous verrez que nous allons donc créer… 2 nouveaux Stackpanels :
Un StackPanel réunissant le bouton Open et le TextBlock et un StackPanel réunissant nos 3 boutons. L’élément MédiaElement n’étant aligné horizontalement avec aucun autre, inutile de le mettre dans un autre StackPanel.
Il est important d’écrire nos éléments dans leur ordre d’apparition dans la page (de haut en bas), c’est pourquoi je vais modifier l’ordre de mes boutons afin que le bouton Open se retrouve en haut de l’interface).

 

 

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

        <StackPanel>

           

            <StackPanel>

                <Button Content="Open" Height="23"  Name="open_button"  Width="75" />

                <TextBlock Height="23"  Name="title_block" Text=""  Width="138" />

            </StackPanel>

 

            <MediaElement Height="246"  Name="mediaElement1"  Width="400" />

 

            <StackPanel>

            <Button Content="Play" Height="23"  Name="play_button"  Width="75" />

            <Button Content="Pause" Height="23"   Name="pause_button" Width="75" />

            <Button Content="Stop" Height="23"  Name="stop_button"  Width="75" />

            </StackPanel>

           

           

        </StackPanel>   

    </Grid>

 

Pour récapituler, nous avons donc :

Un Grid global (LayoutRoot) qui contient un StackPanel Global qui contient 2 autres Stackpanels et notre MédiaElement.

 

 

Patience, nous y sommes presque !

Nous allons modifier l’orientation de nos deux petits stackpanel. Par défaut, les Stackpanels empilent les éléments verticalement. Nous allons donc modifier l’orientation des stackpanels de nos boutons en leur indiquant une orientation horizontale : <StackPanel Orientation="Horizontal">

 

Ca ressemblerai presque à quelque chose !

Il reste juste deux petits détails à voir.

Personnellement, deux petits détails me gène : Notre MédiaElement est invisible une fois compilé et nos éléments sont très entassés. Un peu de visibilité et d’espacement et tout sera parfait !

Tout d’abord, notre MédiaElement. C’est très simple, nous allons l’intégrer dans une bordure.

Pour cela, tout comme un StackPanel, nous allons l’entourer de balise :

 

            <Border>

                    <MediaElement Height="246"  Name="mediaElement1"  Width="400" />

            </Border> 

 

Cette balise va nous permettre de créer un contour à notre MédiaElement. Seulement, il faut lui rajouter quelques attributs :

- BorderThickness, qui va définir la taille en pixel de notre bordure (ici, 1 pixel).

- BorderBrush, qui va définir la couleur de notre bordure, ici « Black ».

 

            <Border BorderThickness="1" BorderBrush="Black">

                    <MediaElement Height="246"  Name="mediaElement1"  Width="400" />

            </Border>   

 

Voila, désormais, nous pouvons avoir une visualisation de l’espace occupé par notre MédiaElement. Si on compile, on se rend compte qu’il prend beaucoup trop de place en largeur. Pas de panique, ce petit problème va disparaitre de lui-même par la suite.

Nous allons nous occupé très rapidement de l’alignement de notre interface. Afin de la centrer, nous allons utiliser les attributs d’alignement de notre Grid LayoutRoot :

<Grid x:Name="LayoutRoot" Background="White" HorizontalAlignment="Center" VerticalAlignment="Center">

 

Notre interface est maintenant centrée, il ne manque plus qu’une seule chose : les espaces entre les éléments.

Pour cela, nous allons utiliser la propriété Margin.

Elle fonctionne en pixel et agit de deux façons :

Margin="10" modifiera la marge de l’élément de 10 pixels dans toutes les directions.

 

Margin="10,5,7,0"/> modifiera la marge de l’élément de 10 pixels à gauche, 5 pixels en haut, 7 pixels à droite et 0 pixels en bas.

 

Grâce à ceci, nous allons pouvoir terminer notre interface !

 

Voici mon code :

 

<UserControl x:Class="Lecteur_Média.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d"

    d:DesignHeight="302" d:DesignWidth="400">

 

    <Grid x:Name="LayoutRoot" Background="White" HorizontalAlignment="Center" VerticalAlignment="Center">

        <StackPanel >

           

            <StackPanel Orientation="Horizontal">

                <Button Content="Open" Height="23"  Name="open_button"  Width="75" />

                <TextBlock Height="23"  Name="title_block" Text=""  Width="138" Margin="75,0,0,0"/>

            </StackPanel>

 

            <Border BorderThickness="1" BorderBrush="Black">

                <MediaElement Height="246"  Name="mediaElement1"  Width="400" />

            </Border>   

 

            <StackPanel Orientation="Horizontal">

            <Button Content="Play" Height="23"  Name="play_button"  Width="75" />

                <Button Content="Pause" Height="23"   Name="pause_button" Width="75" Margin="75,0,0,0"/>

                <Button Content="Stop" Height="23"  Name="stop_button"  Width="75" Margin="75,0,0,0"/>

            </StackPanel>

           

           

        </StackPanel>   

    </Grid>

</UserControl>

 

Et voici l’interface finale:

 

 

Pas trop mal non ? Allez, fini l’interface, attaquons nous à quelque chose de bien plus interessant :

 

Le fonctionnement du lecteur !

 

V)  Ouvrir un fichier média

 

Nous allons nous intéresser au fonctionnement de notre bouton Open.

Ce bouton aura pour fonction d’ouvrir une fenêtre de navigation afin que l’utilisateur puisse aller chercher un de ses fichiers média (image, musique, vidéo) et le lire dans le lecteur.

Ce chapitre semble probablement le plus complexe du tutoriel niveau code, mais en réalité, le fonctionnement est très simple.

Nous allons tout d’abord affecté un événement Click à notre bouton open. Pour cela, tapez Click= dans la balise de notre bouton et laissez l’auto-complétion écrire le nom de l’événement. Vous pourrez ensuite le renommé, mais cela est utile, car Vs 2010 va créer directement la fonction dans le code behind.

<Button Content="Open" Height="23"  Name="open_button"  Width="75" Click="open_button_Click"/>

 

Faites ensuite click droit sur « Open_button_Click », puis « Navigate to event Handler » afin d’accéder directement au code behind de votre bouton. Vous devriez avoir le code suivant :

        private void open_button_Click(object sender, RoutedEventArgs e)

        {

 

        }

 

C’est dans cette fonction que nous allons écrire le code qui nous permettra d’aller chercher un fichier média et de le stocker dans notre MédiaElement.

Pour cela, nous allons procéder par étape.

Nous allons tout d’abord ouvrir créer un nouvel objet OpenFileDialog.

OpenFileDialog openFileDialog1 = new OpenFileDialog();

 

Nous allons ensuite indiquer à notre objet quelques configurations, comme les extensions des fichiers à prendre. Dans notre cas, je vais autoriser tous les types de fichiers.

 

    openFileDialog1.Filter = "All Files (*.*)|*.*";

 

Quelques configurations supplémentaires:

 

           openFileDialog1.FilterIndex = 1;

 

            openFileDialog1.Multiselect = true;

 

 

Ensuite, nous allons stocker dans un booléen l’action de l’utilisateur, à savoir si il à sélectionner un fichier ou non :

bool? userClickedOK = openFileDialog1.ShowDialog();

Ensuite, nous allons créer une structure conditionnelle qui dépendra de l’état de notre booléen :

 

            if (userClickedOK == true)

            {

 

            }

Si notre booléen est égale à « true », cela signifie que l’utilisateur à sélectionner un fichier. Nous allons donc récupérer ce fichier et le stocker dans la source de notre MédiaElement :

           if (userClickedOK == true)

            {

 

                System.IO.Stream fileStream = openFileDialog1.File.OpenRead();

 

                mediaElement1.SetSource(fileStream);

 

            }

 

 

Maintenant que nous avons chargé un fichier média dans notre lecteur, nous allons afficher son titre dans le TextBlock prévu à cet effet :

title_block.Text = openFileDialog1.File.Name;

 

Au final, nous devrions avoir:

 

  private void open_button_Click(object sender, RoutedEventArgs e)

        {

 

            OpenFileDialog openFileDialog1 = new OpenFileDialog();

 

 

            openFileDialog1.Filter = "All Files (*.*)|*.*";

            openFileDialog1.FilterIndex = 1;

 

            openFileDialog1.Multiselect = true;

 

 

            bool? userClickedOK = openFileDialog1.ShowDialog();

 

 

            if (userClickedOK == true)

            {

 

                System.IO.Stream fileStream = openFileDialog1.File.OpenRead();

 

                mediaElement1.SetSource(fileStream);

 

                title_block.Text = openFileDialog1.File.Name;

 

             }

}

 

 

Testez-donc !


VI)           Les boutons de lecture

 

Nous allons rajouter une petite fonctionnalité à notre lecteur concernant l’accès des boutons:

Tant qu’aucun fichier n’est chargé, les boutons Play, Pause et Stop seront grisés.

Lorsque nous chargeons un fichier, le bouton Play sera disponible.

Lorsque nous lisons un fichier, le bouton Play sera grisé et les boutons Stop et Pause et seront disponibles.

Tout d’abord, nous allons définir nos trois boutons comme étant inaccessible.

Pour cela, nous allons donner à leurs propriétés IsEnable la valeur : False.

 <StackPanel Orientation="Horizontal">

            <Button Content="Play" Height="23"  Name="play_button"  Width="75" IsEnabled="False" />

                <Button Content="Pause" Height="23"   Name="pause_button" Width="75" Margin="75,0,0,0" IsEnabled="False"/>

                <Button Content="Stop" Height="23"  Name="stop_button"  Width="75" Margin="75,0,0,0" IsEnabled="False"/>

 </StackPanel>

 

Nos boutons sont donc innaccesible par défaut.

Une fois le fichier chargé, il faut rendre accessible le bouton Play, pour cela, retournez dans la structure conditionnel du chapitre précédent et rajoutez ceci :

play_button.IsEnabled = true;

 

Lorsqu’un fichier est chargé, le bouton Play sera disponible. Nous allons donc nous attaquer au fonctionnement de ce bouton, bien plus simple que son ami « open ».

Créer un événement Click comme fait précédemment, mais pour le bouton Play cette fois.

<Button Content="Play" Height="23"  Name="play_button"  Width="75" IsEnabled="False" Click="play_button_Click"/>

 

Nous avons donc en code behind:

        private void play_button_Click(object sender, RoutedEventArgs e)

        {

 

        }

 

Il faut réfléchir aux actions de notre bouton. Que va-t-il donc faire ?

Je vous donne la réponse : Lire le fichier chargé dans le MédiaElement, et ce grâce à la fonction :

 

mediaElement1.Play();

 

 

Mais ce n’est pas tout, il faut également libérer l’accès aux boutons Stop et Pause, et interdire l’accès au bouton Play durant la lecture.

 

        private void play_button_Click(object sender, RoutedEventArgs e)

        {

            mediaElement1.Play();

 

            stop_button.IsEnabled = true;

            pause_button.IsEnabled = true;

            play_button.IsEnabled = false;

        }

 

 

Testons donc notre lecture !

Normalement, un petit détail devrait vous gêner : Lors du chargement d’une vidéo ou d’une musique, le lecteur démarre automatiquement sans l’appuie sur le bouton Play !

Afin d’éviter cela, il suffit de modifier l’autoplay de notre MédiaElement :

<MediaElement Height="246"  Name="mediaElement1"  Width="400" AutoPlay="False"/>

 

Une fois que votre lecture marche parfaitement, faites de même pour les boutons Pause et Stop :

 

 

 

 

 

Pour le bouton Pause :

 

        private void pause_button_Click(object sender, RoutedEventArgs e)

        {

            mediaElement1.Pause();

            stop_button.IsEnabled = false;

            pause_button.IsEnabled = false;

            play_button.IsEnabled = true;

        }

 

Et pour le bouton Stop :

 

 

        private void stop_button_Click(object sender, RoutedEventArgs e)

        {

            mediaElement1.Stop();

            stop_button.IsEnabled = false;

            pause_button.IsEnabled = false;

            play_button.IsEnabled = true;

        }

 

 

 

Félicitations, vous avez créé votre propre lecteur média en  Silverlight !

Il existe bien d’autre options et propriété que vous pourrez utiliser afin d’améliorer votre lecteur, comme modifier le volume ou afficher une barre de progression, mais je vais vous laisser les découvrir par vous même !

 

 

 

 

Silverlight, Visual Studio 2010 , ,

Localisation d'applications avec Silverlight

6. July 2010 by Quentin.SALLAT

Introduction

A l’heure de la mondialisation et de l’internet, il n’est pas rare de voir des utilisateurs venir du monde entier pour visiter un site web. Mais un problème se pose alors : celui de la langue. Bien entendu, si vous voulez toucher un maximum de monde, vous réaliserez votre application en Anglais. Cela reste néanmoins loin d’être idéal ! Ces dernières années donc, les développeurs de framework et plug-ins multiplient les solutions de « localisation », c’est à dire les systèmes « automatisant » la gestion des langues. Nous allons donc voir comment utiliser les outils intégrés à Silverlight, afin de réaliser de la localisation dans votre application !

 

Les Ressources

"Localisation" ne veut pas dire traduction automatique. Cette tâche vous revient donc (et entre nous, ce n’est pas plus mal pour l’utilisateur final). Déterminez en premier lieu, quelle langue vous souhaitez proposer à vos utilisateurs. Eventuellement, vous pourrez définir des cultures (Anglais britannique, Anglais Américain sont des cultures, tandis que l’Anglais est la langue associée). Nous n’utiliserons ici que deux langues (Français et Anglais), mais la méthode est la même pour ajouter d’autres idiomes et cultures.

Silverlight gère la localisation à l’aide de fichiers de ressources, qui contiennent des chaines de caractères associées à une clé. On peut imaginer par exemple un champ « labelAccueil », qui contiendrait la chaine « Accueil ».  Afin de réaliser les changements de langue, vous aurez à réaliser ainsi un fichier de ressources par langue.

Un exemple de ressource
Un exemple de ressource



Classe de localisation

Afin de gérer les ressources précédemment créées, nous allons utiliser une classe qui permettra de déterminer quel est le fichier de langue associé à la culture de l’utilisateur. Nous appellerons ici notre classe LocalizatedStrings. Elle disposera d’un objet (nommé ici resource), que nous instancierons lors de la première utilisation de la classe, afin qu’il corresponde au bon fichier de ressources. Cet objet doit être statique, afin de garantir son accès depuis partout. Déclarez également un ResourceManager, lui aussi statique,  qui permettra d’accéder aux chaines contenues dans nos ressources. Nous déclarons également une méthode, qui instanciera notre objet resource, et le resourceManager, suivant la culture de l’utilisateur, accessible via CultureInfo.

private static object resource;

private static ResourceManager resourceManager;

public static object Resource1

{

get

{

if (resource == null)

Determiner_culture();

return resource;

}

}

public static void Determiner_culture()

{

if (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "fr")

{

resource = new Namespace.localization.StringLibrary();

resourceManager =

new System.Resources.ResourceManager("Namespace.localization.StringLibrary", Assembly.GetExecutingAssembly());

}

else

{

resource = new Namespace.localization.StringLibraryEN();

resourceManager =

new System.Resources.ResourceManager("Namespace.localization.StringLibraryEN", Assembly.GetExecutingAssembly());

}

}

Ici, Namespace correspond au nom de votre assembly, et localization au nom du dossier contenant les fichiers de ressources.



Utiliser les chaines localisées

Maintenant que nos chaines sont bien initialisées suivant la culture de l’utilisateur, nous allons les exploiter coté code behind (avec le ResourceManager) et coté XAML (avec du binding).

Chaines localisées et code behind (C#)

Utiliser les chaines localisées est très simple dans le code behind. Il suffit d’appeler la méthode GetString du ResourceManager, en passant en paramètre la clé correspondante dans les ressources. Imaginons que vous ayez une chaine de clé « LabelAccueil », le code sera :

resourceManager.GetString("LabelAccueil");

Vous l’aurez compris, il vous faudra avoir les mêmes noms de clé dans vos fichiers de ressources, mais des valeurs différentes. En français, la chaine pourra avoir pour valeur « Accueil », tandis qu’en Anglais, elle aura pour valeur « Home ».

Chaines localisées et XAML

Utiliser vos chaines localisées n’est pas plus compliqué en XAML qu’en C#. il suffit de faire un Binding sur l’attribut Text ou Content de votre contrôle comme ceci :

{Binding Path=Resource1.LabelAccueil, Source={StaticResource LocalizedStrings }}

Resource1 correspond à la méthode get de notre objet resource, dans notre classe LocalizatedStrings. Celle-ci est  indiquée en tant que ressource. LabelAccueil correspond à la clé dans vos ressources, comme en code behind. Vous avez donc accès à vos chaines localisées maintenant !



Astuce : tester son système de localisation

Si vous utilisez Windows Vista ou Seven, il y a un moyen très simple de tester votre localisation. Allez dans panneau de configuration, « Horloge,  Langue et Région », « Région et langue », et changez le format sur la culture à tester.

Tester votre localisation est important !
Tester votre localisation est important !



Conclusion

Comme vous le voyez, la localisation en Silverlight se fait aux moyens d’outils relativement puissants, et cela est bien plus aisé qu’avec d’autres langages. Attention toutefois à utiliser les mêmes clés dans vos fichiers de ressources. 

C#, Silverlight, Visual Studio 2010

Creating your first MVVM silverlight application on windows phone 7.

The goal of this tutorial is to create an MVVM driven twitter mini client application for windows phone 7. We’ll do the exact same twitter client Scott Guthrie did in the MIX 10 presentation except we’ll follow the MVVM pattern. 
So here’s how we’d want it to look like.

The source code for this tutorial is also available.

1) Why MVVM ?

MVVM is a design patter, better for testing and for big enterprise projects since there wouldn’t be any code behind in your view, everything would be exposed and controlled by your ViewModel – so easier to test.
(Here’s a more detailed guide about the MVVM pattern).

Here’s a schema summarizing the pattern:

MVVM_pattern_diagram_thumb

2) In order to develop for Windows Phone 7, you need to get the free SDK here, the current version is the April CTP refresh. (Visual Studio 2010 Express comes with the tools you can download, so developing for windows phone 7 can be absolutely free).

Let’s Start coding!

Open Visual Studio and create a new project using the “Silverlight for Windows Phone” Tab and choosing the “Windows Phone Application” template.

Let’s start of by creating a new class called: ViewModelBase and make it implement the INotifyPropertyInterface.

This is going to be the class we’re going to derive from all of our ViewModels.

Now let’s add some properties in this Base class in order to get save some lines of code and not repeat ourselves in the other ViewModel classes we’re going to write.

protected void OnNotifyPropertyChanged(string p)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(p));
    }
}       
public event PropertyChangedEventHandler PropertyChanged;

This basically says whenever my property is changed the event PropertyChanged is launched.

Let’s create our View now.

Open up the MainPage.xaml.

I’m going to add a TextBox, a button and a listbox unto the design view (you can manipulate the controls and dimension them to whatever you want from the designer view etc ..)

So here’s how my view looks like right now:

view

Now let’s modify our listbox in order to contain an image and the status update. (many ways you can do this, you can ofcourse do it from Blend), but this isn’t the purpose of this tutorial. So we’ll keep it simple.

Add a Image then a textbox for the message and another for the username inside the listbox template while editing the xaml.

So our Xaml for the listbox can look like this:

  <ListBox Height="500" HorizontalAlignment="Left" 
                     Margin="20,115,0,0" 
                     Name="listBox1" VerticalAlignment="Top" Width="440">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Height="100" Width="100" 
                                   VerticalAlignment="Top" Margin="0,10,8,0"/>
                            <StackPanel Orientation="Vertical">
                                <TextBlock />
                                <TextBlock   />
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

 

Now let’s add our ViewModel for this specific View.

Create a new folder called “ViewModels” and then a new class in that folder named: “MainViewModel”

Make that class derive from our “ViewModelBase” class.

So let’s think about what we want exactly:

* When the button Look up is pressed we want the above page title to change to “Whatever we put in the textbox” ‘s Feed”.

* When the button Look up is pressed, we get the status updates for the specific user entered in the textbox.

Okay let’s jump into that, remember there shouldn’t be any code behind on my view that’s event driven specific etc..

First let’s start off by linking our View to the ViewModel we just created.

There are two ways of doing this, one from the View XAML directly, the other in the code behind while calling the constructor of the View.

The most common method is the second so we’ll do that.

Open the code behind of the MainPage View.

Add the namespace of the ViewModels, create a new variable of type “MainViewModel”.
Set the DataContext of the View as the MainViewModel variable we just created.

private MainViewModel _mainViewModel = new MainViewModel();

        public MainPage()
        {
            InitializeComponent();
            DataContext = _mainViewModel;
        }

 

Here’s the inside of our MainPage class now.

Let’s create now our TwitterItem class:

Create a new class called TwitterItem and add the following properties (there’s nothing different here from ScottGu’s post) : Username , Message, ImageSource.

Then add a static method that we’ll help us parse the xml returned and return a list of TwitterItems.

So overall our class looks like this now:

public class TwitterItem
{
    public string Username { get; set; }
    public string Message { get; set; }
    public string ImageSource { get; set; }

    public static List<TwitterItem> GetTweetsFromResponse(String Response)
    {
        List<TwitterItem> lsttweets = new List<TwitterItem>();

        XElement xmlTweets = XElement.Parse(Response);
        lsttweets = (from tweet in xmlTweets.Descendants("status")
                    select new TwitterItem
                    {
                        ImageSource = tweet.Element("user").Element("profile_image_url").Value,
                        Message = tweet.Element("text").Value,
                        Username = tweet.Element("user").Element("screen_name").Value
                    }).ToList();

        return lsttweets;
    }
}


Now let’s go back to our MainViewModel class.

I’m going to need a property for the textbox text (which will be the username for the feeds we want to get), another one for the title, and finally a RelayCommand for the Button.

What? RelayCommand? what’s that? it’s a helper from the MVVM light toolkit developed by Laurent Bugnion
(He also presented the Toolkit in MIX 10)

The toolkit works on WPF, Silverlight and WP7.

Now why would we need this?It’s simply a really big time saver + commands don’t exist on WP7 because WP7 use Silverlight 3.

RelayCommands helps us link commands on methods, you’ll understand this in a minute.

So first let’s add the dlls from the toolkit you can get them here.

references

Now that’s done we can add our RelayCommand.

So this how class looks like now:

public class MainViewModel : ViewModelBase
    {
        public string strUsername { get; set; }
        public RelayCommand GetTweetsCommand { get; private set; }
    }

 

Now we need an ObservableCollection for the tweets, and this collection will be the item source of our listbox.

private ObservableCollection<TwitterItem> _lstTweets;
public ObservableCollection<TwitterItem> LstTweets
{
    get
    {
        return _lstTweets;
    }
    set
    {
        if (_lstTweets != value)
        {
            _lstTweets = value;
            OnNotifyPropertyChanged("LstTweets");
        }
    }
}

Finally our last property needed, is the Title one since it’s going to be binded to the title in order to set the Title to “screen name” ‘s feed.

private string _title;
public string Title
{
    get
    {
        return _title;
    }
    set
    {
        if (_title != value)
        {
            _title = value;
            OnNotifyPropertyChanged("Title");
        }
    }
}


Now let’s write the methods to get the tweets from the twitter api (one will be used for the async call,
and the other for the response):

private void GetTweetsCall(string screenName)
  {
      WebClient client = new WebClient();
      client.DownloadStringCompleted += 
          new DownloadStringCompletedEventHandler(twitter_Response);
      client.DownloadStringAsync(
          new Uri("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name="
              + screenName));
  }

  private void twitter_Response(object sender, DownloadStringCompletedEventArgs e)
  {
     if (e.Error == null)
      {
          LstTweets = TwitterItem.GetTweetsFromResponse(e.Result);
      }
  }

 

Finally we have to add the constructor and in that constructor we’re going to link our relay command to the method that calls the twitter api, and set the “Title” property with the txtUsername property + “’s feed”:

public MainViewModel()
 {
         GetTweetsCommand = new RelayCommand(() =>
             {
                 Title = txtUsername + "'s Feeds";
                 GetTweetsCall(txtUsername);
             }
         );
 }


All this is nice, but that’s not enough, we need to bind everything on the View.

So for the title TextBlock, we bind the text to the Title:

<TextBlock Text="{Binding Title, Mode=OneWay}" 
                       Style="{StaticResource PhoneTextPageTitle2Style}"/>

 

Repeat the same thing for the TextBox but instead of setting the Mode OneWay you have to set it TwoWay because we’re using the Text written in the TextBox by the user in our ViewModel.

<TextBox Height="72" HorizontalAlignment="Left" Margin="31,37,0,0" 
                     Text="{Binding txtUsername,Mode=TwoWay}" 
                     VerticalAlignment="Top" Width="275" />

Now we have to bind the listbox Item source to our ObservableCollection.

  <ListBox Height="500" HorizontalAlignment="Left" 
                     Margin="20,115,0,0" 
                     VerticalAlignment="Top" 
                     Width="440" ItemsSource="{Binding LstTweets, Mode=OneWay}">

So what’s left? Binding the image and 2 textblocks inside our listbox.

   <Image Height="100" Width="100"  Source="{Binding ImageSource , Mode=OneWay}"
                                   VerticalAlignment="Top" Margin="0,10,8,0"/>
                            <StackPanel Orientation="Vertical">
                                <TextBlock  Text="{Binding Username , Mode=OneWay}"  />
                                <TextBlock  Text="{Binding Message , Mode=OneWay}"  
                                           />
                            </StackPanel>


Now how do we set the Command on our button in wp7 based on Silverlight 3 where commands weren't supported ?  With the MVVM light toolkit!

It’s easier to do this with Blend by just drag and dropping , but not the purpose of this tutorial ;) ..

So just copy/paste this in your button XAML:

  <Button Content="Look up" Height="70" 
                    HorizontalAlignment="Left" Margin="300,37,0,0" 
                    VerticalAlignment="Top" Width="160">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <GalaSoft_MvvmLight_Command:EventToCommand 
                            Command="{Binding GetTweetsCommand, Mode=OneWay}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>

Add the necessary namespace imports :

 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
 xmlns:GalaSoft_MvvmLight_Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP7" 
  

As you noticed the Command Binding in the eventTrigger is set to the RelayCommand we created in our ViewModel.

Then a little bit of styling on our View in order to make it look good.

Run your application now!

Type in a screen name inside the textbox and click the “Look up” button and this is the result:

result

Hope you enjoyed this article, MVVM isn’t an easy concept, but a lot of helpers out there, I personally really like MVVM light toolkit. I'll do my best to write more articles on windows phone 7 and MVVM!

In the mean time you can get the source code here.

C#, Silverlight, Windows phone 7 , ,

L’Isolated Storage en Silverlight

17. May 2010 by Quentin.SALLAT

Introduction

Il est parfois nécessaire de stocker des informations côté client, telles que des identifiants de connexion, un panier d’achat… Bien que nous puissions tout à fait utiliser les classiques cookies, Silverlight propose un dispositif bien plus organisé et simple pour le stockage : l’isolated storage. Sa taille maximale est de 1Mo par application, et peut augmenter en mode out of browser avec des droits élevés. Le but de cet article va donc être de vous en apprendre les bases.

Note : ne croyez surtout pas que l’isolated storage est quelque chose de sécurisé. Il est en effet possible au client d’accéder très facilement à ses données, même sans votre application. Evitez donc le stockage de mot de passe, d’informations confidentielles etc. Pour plus d’informations sur le sujet, je vous suggère l’excellente conférence de Shawn Wildermuth au mix 2010

Lien MIX 2010


Ecrire dans un fichier

L’isolated Storage n’est ni plus ni moins qu’un dossier où vous pouvez stocker des fichiers. Il va donc falloir en premier lieu, créer un fichier avant d’y écrire. Vous aurez besoin de lusing suivant :

using System.IO.IsolatedStorage;

Nous commençons par définir un try catch, car on agit directement sur le système de fichier de l’utilisateur. Il est donc préférable d’éviter le plantage de l’application par cette méthode.

Nous définissons ensuite une variable que représentera notre isolated storage représentera.

try

{

using (var store = IsolatedStorageFile.GetUserStoreForApplication())

{

;

}

}

catch

{

;

}

Nous avons donc accès à un espace de stockage côté client. Nous allons à présent créer un dossier, puis un fichier.

try

{

using (var store = IsolatedStorageFile.GetUserStoreForApplication())

{

string directory = "Key";

store.CreateDirectory(directory);

 

string filePath = System.IO.Path.Combine(directory, "Key.txt"); //On concatène le nom du fichier et du dossier

 

if (!store.FileExists(filePath)) //On vérifie que le fichier n'existe pas déja

{

IsolatedStorageFileStream File =

store.CreateFile(System.IO.Path.Combine(directory, "Key.txt")); //On créé le fichier

File.Close(); //On ferme le stream

}

}

}

catch

{

;

}

Maintenant que le fichier est créé, nous allons écrire dedans. Nous utiliserons un StreamWriter, en précisant le chemin du fichier, le mode de fichier (Open), et l’accès sur écriture. Encore une fois, nous allons utiliser un try catch. Mais cette fois-ci nous aurons le détail de l’erreur.

try

{

using (StreamWriter sw =

new StreamWriter(store.OpenFile(filePath,

FileMode.Open, FileAccess.Write)))

{

sw.WriteLine(“Je suis une chaine de caractère”);

}

}

catch (IsolatedStorageException ex)

{

MessageBox.Show(ex.Message);

}

Nous avons donc stocké dans un fichier, une chaine de caractères. Nous allons à présent voir comment y accéder.


Lire un fichier

Une fois que nous avons écrit dans le fichier, il nous faut y lire le contenu. Pour cela, nous allons commencer comme précédemment, c’est-à-dire utiliser un try/catch, ainsi qu’une variable qui représentera notre Isolated Storage.

try

{

using (var store = IsolatedStorageFile.GetUserStoreForApplication())

{

 

}

}

catch

{

;

}

Nous définissons ensuite notre chemin (qui pointera donc vers le fichier que nous avons créé tout à l’heure), et nous vérifions qu’il existe ! 

string directory = System.IO.Path.Combine("Key", "Key.txt");

if (store.FileExists(filePath))

{

{

;

}

}

Il ne reste plus qu’à utiliser un StreamReader pour lire le contenu de notre fichier !

using (StreamReader reader =

new StreamReader(store.OpenFile(filePath,

FileMode.Open, FileAccess.Read)))

{

string content = reader.ReadToEnd();

}

Et voilà, nous avons récupéré le contenu du fichier de l’Isolated Storage ! Simple non ? Vous pouvez donc dès à présent utiliser cette méthode qui est de loin plus simple que la gestion des cookies (en Silverlight en tout cas).

C#, Silverlight , ,

Silverlight 4 : Créer votre propre fenêtre personnalisée en Out Of Browser

24. April 2010 by Quentin.SALLAT

Le Out of Browser

De plus en plus, des applications web sont utilisées en tant qu’application de bureau. La montée en puissance du cloud-computing, et l’apparition du mode Out-Of-Browser montrent clairement que c’est la tendance.

Le Out Of Browser (OOB) consiste simplement à développer une application web (donc, dans le navigateur), et  “l’installer” sur le bureau de l’utilisateur. En somme, plus besoin d’ouvrir son navigateur, il suffit de cliquer sur une icône du bureau.

Nous allons ici nous intéresser à une nouveauté de Silverlight 4 : les fenêtres « chrome ». Nous allons donc redesigner ces petits boutons qui depuis des années, permettent de minimiser, maximiser, ou encore fermer une fenêtre.

 

Rendre notre application Out Of Browser

Bien entendu, puisque l’on parle de fenêtre d’application, il va tout d’abord nous falloir mettre notre application sur le bureau. Pour cela, rien de plus simple. Il vous suffit de vous rendre dans les propriétés d’un projet Silverlight, et de cliquer sur la case « Enable Running application out of the browser ». Mais cela ne suffit pas pour notre cas. En effet, Silverlight 4 introduit le concept de « trusted applications », des applications OOB s’exécutant avec des droits élevés (et pouvant potentiellement faire énormément de choses). C’est cela qui nous permettra le changement d’aspect de notre fenêtre. Pour activer ce mode, il vous faudra cliquer dans les propriétés du projet, sur le bouton des options OOB. Une fenêtre va apparaître. Tout en bas de celle-ci, vous devrez cocher la case qui permet d’obtenir ces fameux droits élevés. En dessous, une liste s’active, et nous intéresse. En effet, elle permet de changer le style de fenêtre de notre application.

Les droits administrateurs sont indispensables pour les fenêtres  chrome
Les droits administrateurs sont indispensables pour les fenêtres chrome

Nous allons ici définir un style « Borderless Round Corners ». Cela enlèvera la barre de contrôle habituelle de Windows, et fera des coins de fenêtre arrondis. Très esthétique !

 

Déplacer notre fenêtre

Nous avons maintenant notre fenêtre, mais pas de quoi la contrôler ! Qu’à cela ne tienne ! Nous allons tout d’abord apprendre à la déplacer. Pour cela, vous pouvez créer un rectangle par exemple, en haut de votre application. Un superbe rectangle de couleur Aqua par exemple, fera parfaitement l’affaire.

Une application trés esthètique
Une application trés esthètique

Une fois cela fait, définissez un événement MouseLeftButtonDown dessus.

Lors de l’appel à cette méthode, nous allons devoir vérifier deux choses : que notre application est bien out of browser, et que celle-ci dispose de droits administrateurs. Nous allons pour cela utiliser des attributs de l’objet MainWindow, qui représente notre fenêtre. Si les deux conditions sont bien remplies, nous pouvons commencer le déplacement, par l’appel de la méthode DragMove de MainWindow.

private void rectangle1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

{

if (App.Current.IsRunningOutOfBrowser

&& App.Current.HasElevatedPermissions)

App.Current.MainWindow.DragMove();

}

Vous pouvez lancer votre application, et vous verrez que le déplacement est opérationnel.

 

Redimensionner notre fenêtre

Il est possible que vous souhaitiez laisser la possibilité à votre utilisateur de redimensionner la fenêtre. Pour cela, rien de plus simple. Commencez par définir 4 coins à votre application, avec des rectangles par exemple.

Des coins pour redimensionner la fenêtre
Des coins pour redimensionner la fenêtre

Ensuite, il ne reste plus qu’à définir pour chacun un événement en cas de clic. Dans la fonction appelée, il nous faudra refaire bien entendu, nos deux vérifications, et appeler, en cas de succès, la méthode DragResize de MainWindow. Celle-ci prend en argument un coin de l’application pour le redimensionnement. Mettez celui qui correspond au sender d’événement.

private void rectangle2_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

{

if (App.Current.IsRunningOutOfBrowser

&& App.Current.HasElevatedPermissions)

App.Current.MainWindow.DragResize(WindowResizeEdge.TopLeft);

}

Facile n’est-ce pas ?

 

Définir nos boutons

Dernière étape : afficher des boutons pour permettre de minimiser/maximiser notre fenêtre, et la fermer. Commencez par les définir, et sur chacun, invoquez  une méthode sur MouseLeftButtonDown.

Pour chacune, n’oubliez pas de faire nos deux vérifications habituelles.  Une autre méthode est de n’afficher vos boutons que si les deux conditions sont vérifiées. Cela permet de faire une seule vérification pour le tout.

Pour minimiser ou maximiser notre fenêtre, il suffit de changer le WindowState de notre MainWindow, qui est une énumération. Vous pouvez le définir sur maximisé, minimisé, ou normal (la fenêtre reprendra alors sa taille d’origine).

De là, il devient très simple de définir nos méthodes :

private void OOB_WindowMaximize(object sender, MouseButtonEventArgs e)

{

App.Current.MainWindow.WindowState = WindowState.Maximized;

}

private void OOB_WindowMinimize(object sender, MouseButtonEventArgs e)

{

App.Current.MainWindow.WindowState = WindowState.Minimized;

}

Et pour fermer notre fenêtre ? Encore une fois, c’est très simple. Il suffit d’un simple appel à la méthode Close de notre MainWindow.

private void OOB_WindowClose(object sender, MouseButtonEventArgs e)

{

App.Current.MainWindow.Close();

}

 

Conclusion

Comme vous le voyez, redéfinir les événements de gestion d’une fenêtre est simple, et permet d’avoir quelque chose de visuellement plus personnalisé, si ce n’est plus joli. Si vous voulez aller plus loin, pourquoi ne pas changer le WindowState à Normal lorsque vous déplacez la fenêtre (pour reproduire le comportement d’une fenêtre normale sur Window). Vous pourriez également permettre de revenir en état normal après un clic sur le bouton maximiser, lorsque notre fenêtre l’est déjà. Et pour ceux qui voudrait avoir un petit aperçu de ce que l’on peut obtenir :

Un rendu nettement plus sympathique
Un rendu nettement plus sympathique

C#, Silverlight

Comment créer une application Silverlight utilisant LinQ à travers un service WCF

21. April 2010 by Jerome.Antoine

De base Silverlight ne permet pas de se connecter à une base de données, alors que cela peut être extrêmement utile. La méthode la plus simple pour contourner ce problème est de passer par un service WCF. Voici comment faire.


1. Créer l’application Silverlight


Pour commencer nous allons créer un projet de type « Silverlight Application ». Visual Studio nous propose ici de créer automatiquement le projet web en ASP.NET qui implémentera notre application Silverlight.

 

 

 

2. Créer la page principale de l’application Silverlight


Dans le page principale de l’application Silverlight nous définissons un « DataGrid », que vous pouvez trouver dans la ToolBox, et qui est un contrôle de base permettant de mettre en forme n’importe quelle collection. Nous lui mettons un « x :Name » pour pouvoir le retrouver dans notre code behind.

 

 

3. Créer le DataContext avec LinQ to SQL


Pour pouvoir accéder à notre base de donnée nous allons utiliser LinQ to SQL, pour cela ajouter un élément de type « LinQ to SQL Classes » à votre projet Web.

 

 

Dans l’explorateur de serveur, créez une nouvelle connexion à votre base de donnée NorthWind.
Si vous n’avez pas cette base de données de test fournie par Microsoft vous pouvez la télécharger ici :
http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46a0-8da2-eebc53a68034&displaylang=en

 

Une fois votre connexion établie, parcourez la liste des tables de votre base de données et glissez-déposez la table « Employee » dans votre DataContext « NorthWind.dbml ». Vous devriez voir le schéma de la table s’afficher.
Attention, vous devez permettre la sérialisation de votre DataContext, pour ce faire changer le « Serialization Mode » dans ses propriétées, en le mettant à « Unidirectional ».

 

 

4. Créer le service WCF


Pour que l’application Silverlight puisse récupérer des données de la base de données nous allons utiliser un web service en WCF. Celui-ci s’occupera de récupérer ces données et pourra les fournir à l’application Silverlight quand celle-ci les demandera.
Pour ce faire nous allons ajouter un élément de type « WCF Service » à notre application Web.

 

 

Un service de base est constitué de deux classes : le contrat du service et la définition du service. L’application Silverlight n’aura connaissance que du contrat. Il s’agit d’un interface énonçant les méthodes que le service possède. Ici nous allons écrire une fonction simple permettant de lister les employés existant dans la base de donnée NorthWind.

 

 

 

Dans la définition du service nous écrivons ce que doit faire cette fonction. Ici nous utilisons une requête LinQ to SQL pour récupérer les employés.

 

 

Enfin pour que le service soit utilisable par l’application Silverlight nous devons définir un « endpoint », qui représente la façon dont communique le service. Ici nous devons définir le « binding » en « basicHttpBinding » pour que le service puisse communiquer avec Silverlight.

 

 

5. Ajouter la référence du service à l’application Silverlight


Une fois le service réalisé, il faut le faire connaitre à l’application Silverlight. Pour ce faire il faut ajouter une référence à ce service dans l’application Silverlight (clique droit sur « Service References » et choisir « Add a Service Reference »).
Cliquez sur « Discover » pour voir votre service et cliquez sur « OK ». Il se peut que vous ayez une erreur si vous n’avez pas compilé votre service dans l’application web avant cette étape.

 

 

 

 

Si vous deviez changer le code de votre service, pensez à faire une mise à jour de cette référence (clique droit sur « NorthWindServiceReference » et « Update Service Reference »).

 

6. Récupérer et mettre en forme les données


Pour finir nous devons utiliser notre service pour récupérer les données et les mettre en forme dans le « DataGrid » de notre application Silverlight. Pour ce faire nous devons tout d’abord récupérer une instance du service. Ensuite nous devons abonner cette instance à l’événement « getEmployeesCompleted » pour que lorsque le service ait fini de récupérer les employés, soit appelée une méthode, ici « serviceNorthWind_getEmployeesCompleted ».
Dans cette méthode nous pouvons mettre la liste des employés récupérée comme source de notre « DataGrid ».

 

 

7. Test de l’application

 

 

ASP.NET AJAX, C#, Silverlight , , , , ,