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

Protéger vos requêtes SQL à l’aide des requêtes paramétrées.

30. September 2010 by Mustapha.AMALLAHI

Introduction

Lorsque vous travaillez avec des données, vous aurez souvent besoin de filtrer les résultats en fonction de certains critères. Typiquement, cela se fait en acceptant la saisie d'un utilisateur et en utilisant cette entrée pour former une requête SQL. Par exemple, une personne pourrai avoir de voir toutes les commandes entre des dates spécifiques.

Une autre requête pourrait être simplement de récupérer des champs suivant l’ID d’un enregistrement.


Comme vous le savez, la requête SQL assignée à un objet SqlCommand est simplement une chaîne.

Donc, si vous souhaitez filtrer une requête, vous pouvez créer la chaîne dynamique, mais cela est risqué car la requête n’est pas protégée.

 

Voici un mauvais exemple de filtrage d'une requête.

Ne jamais créer une requête de cette façon! La variable d'entrée,  idTable, est généralement récupérée à partir d'un contrôle TextBox soit sur un formulaire Windows ou une page Web. Tout ce qui est placé dans le contrôle TextBox sera mis en idTable et ajouté à votre chaîne SQL. Cette situation peut inciter un pirate à remplacer cette chaîne par un code malveillant.


Au lieu de construire dynamiquement une chaîne, comme le montre le mauvais exemple ci-dessus, utilisez les requêtes paramétrées.

Tout ce qui est placé dans un paramètre sera traité et ne fait pas partie de l'instruction SQL, ce qui rend votre application beaucoup plus sûre.

L'utilisation de requêtes paramétrées est un processus en trois étapes:

   1. Construire la chaîne de commande SqlCommand avec des paramètres.
   2. Déclarez un objet SqlParameter en lui attribuant une valeurs.
   3. Assignez l'objet SqlParameter à la propriété de l'objet SqlCommand.

Les sections suivantes vous guident étape par étape à travers ce processus.

 

La préparation d'un objet SqlCommand pour les paramètres

La première étape dans l'utilisation de paramètres dans les requêtes SQL est de construire une chaîne de commande contenant des espaces réservés de paramètres. Ces espaces réservés sont remplis avec des valeurs de paramètre réel quand la SqlCommand est exécuté.

La syntaxe correcte d'un paramètre est d'utiliser un préfixe symbole "@" sur le nom du paramètre comme indiqué ci-dessous:

 

Dans le constructeur de SqlCommand ci-dessus, le premier argument contient une déclaration de paramètre, @id. Cet exemple utilise un paramètre, mais vous pouvez avoir autant de paramètres que nécessaire pour personnaliser la requête. Chaque paramètre correspondant à un objet SqlParameter qui doit être affectés à cet objet SqlCommand.

 

Déclarer un objet SqlParameter

Chaque paramètre dans une instruction SQL doit être défini. Tel est l'objet du type SqlParameter. Votre code doit définir une instance de SqlParameter pour chaque paramètre de commande d'un objet SqlCommand de SQL. Le code suivant définit un paramètre pour le paramètre @id de la section précédente:

 

Notez que la propriété ParameterName de l'instance SqlParameter doit être écrite  exactement comme le paramètre qui est utilisé dans la chaîne de commande SQL SqlCommand. Vous devez également spécifier une valeur pour la commande. Lorsque l'objet SqlCommand s'exécute, le paramètre sera remplacé par cette valeur.

 

Associer un objet SqlParameter avec un objet SqlCommand



Pour chaque paramètre défini dans la chaîne de commande de l’objet SqlCommand, vous devez définir un SqlParameter.

Vous devez également ajouter à l'objet SqlCommand tous les SqlParameter en attribuant l'instance SqlParameter à la propriété Parameters de l'objet SqlCommand.

 Le code suivant montre comment faire:


L'instance SqlParameter est l'argument de la méthode Add de la propriété Parameters de l'objet SqlCommand ci-dessus.

Vous devez ajouter un unique SqlParameter pour chaque paramètre défini dans la chaîne de l'objet SqlCommand de commande SQL.

 

On met tout ensemble.


Résumé :


Vous devez utiliser des paramètres pour filtrer les requêtes d'une manière sûre, un très bon moyen pour éviter les injections SQL.

Le processus de d’utilisation du paramètre comporte trois étapes:

-définir le paramètre dans la chaîne de commande SqlCommand.

-déclarer l'objet SqlParameter avec des propriétés applicables.

-Affecter l'objet SqlParameter à l'objet SqlCommand.

Lorsque le SqlCommand est exécuté, les paramètres seront remplacés par les valeurs spécifiées par l'objet SqlParameter.

 

Voilà vous savez tout sur les requêtes paramétrés ! Écouter

Lire phonétiquement

 

ADO.NET, C# , , , ,

Comment accéder à MySQL avec C #

30. September 2010 by Steevy.Algou

Comment accéder à MySQL avec C #

Beaucoup d'applications C # utilisent une base de données pour le stockage de toutes les informations dont elles ont besoin, et l'une des bases de données la plus couramment utilisée est MySQL. Ce n'est pas seulement à cause de la fiabilité de MySQL, mais c'est aussi parce que le contenu d'une base de donnée MySQL peut être facilement accessible et manipulé à partir du C #.

C’est, bien entendu, si le programmeur C # utilise  le MySQL . Net Connector.

 

 

Obtention du MySQL. Connector Net

La première étape pour utiliser le serveur MySQL. Net Connector est de télécharger son programme d'installation à partir de la page web MySQL Connector / Net.

Une fois que le programmeur a exécuté le fichier téléchargé, le connecteur sera disponible pour tous les projets C #.

 

Préparation de la base de données MySQL

 

 

Maintenant, c'est juste une question d'accès à la base de données MySQL à partir d'un projet C #.

 

 

Ajout  du connecteur MySQL comme référence pour le projet C#.

Le connecteur MySQL.NET ne sera pas automatiquement disponible à un projet C#.
Pour que cela se produise, le programmeur doit l'ajouter comme une référence. Ceci dépend de l'IDE (environnement de développement intégré) utilisé.

Par exemple, dans SharpDevelop, le programmeur doit de cliquer sur "Projets" puis "Références". Il sera ensuite en mesure de sélectionner " MySql.Data " de la liste des références disponibles.

 

 

 

 

Chargement du connecteur MySQL avec C #

 

 

Le projet est maintenant prêt.

Utilisation de données MySQL dans un formulaire d'application Windows


  • créer une connexion à une base de données MySQL
  • exécuter une requête SQL et lire les résultats en utilisant un adaptateur de données MySQL
  • charger les résultats dans une grille dans un formulaire

 

 



L'objet MySqlConnection utilise une chaîne de connexion et la méthode "Open" pour établir une connexion à la base de données MySQL :

Suivant la requête SQL est créée:

 

 

 

Et puis les résultats chargés dans un ensemble de données (qui, dans cet exemple, on donne le nom " sample_data " ) :

La grille peut ensuite être chargée avec le contenu de l'ensemble de données :

Enfin la grille de population est ajoutée à la forme :

Si le formulaire est compilé à ce point alors il contiendra une grille contenant les résultats de la requête MySQL.

Fermeture de la connexion

Une connexion MySQL se termine en utilisant la méthode « close ». Ici la connexion est fermée lorsque le formulaire est chargé:

Et avec seulement ces quelques lignes de code, la base de donnée MySQL peut être consultée et lue, avec le résultat d'une requête dans la application C #.



 

 

C#

Créer un document Microsoft Word avec C #

30. September 2010 by Steevy.Algou

Créer un document Microsoft Word avec C #.

C # est un langage idéal pour l'automatisation des processus. Une raison à cela est la facilité avec laquelle les programmeurs peuvent contrôler le fonctionnement des autres applications telles que Microsoft Word. Avec juste quelques lignes de code le programmeur est capable de:

  • Exécuter Microsoft Word
  • Créer un nouveau document Microsoft Word
  • Ecrire dans le nouveau document
  • Enregistrer le document sur l'ordinateur de l'utilisateur
  • Fermer Word Microsoft

Et tout cela peut se faire soit à la vue de l’utilisateur (de sorte qu'il puisse voir ce qui se passe) ou il peut être fait sans qu’il ne le remarque.

Ajout de Microsoft Word  en tant que  référence C#

Il y a, bien sûr, une hypothèse de base que Microsoft Word soit réellement installée sur l'ordinateur du programmeur. Si il l’est alors il doit   l'ajouter comme une référence.

Une fois que cela à été fait, alors le programmeur peut commencer à écrire le code qui contrôle Microsoft Word.

Exécuter  Microsoft Word avec C #

Le développeur C # commence  en créant une nouvelle application Word :

 

Word.Application oWord = new Word.Application();

 

 

 

Par défaut Microsoft Word sera exécuté invisiblement dans le fond. Cependant, il peut être utile pour voir le document au cours de la phase de développement du projet :

 

oWord.Visible = true;

 

Ce code rendra le document Word  visible. C'est alors, seulement , une question de supprimer .

Création d'un Nouveau Document Microsoft Word

Une fois que Microsoft Word à été ouvert,  un nouveau document peut être ajouté. Cependant, cette méthode nécessite un certain nombre de valeurs, dont beaucoup sont connues ou requis par le programmeur. Toutefois, le programmeur a juste besoin de créer un objet qui va gérer ces valeurs manquantes :

 

 

object oMissing = System.Reflection.Missing.Value

 

Et puis, cet objet peut être utilisé lorsque le nouveau document est créé :

 

Word.Document oDoc = oWord.Documents.Add (ref oMissing, ref oMissing,
ref oMissing, ref oMissing);

Si l'application est exécutée à ce stade, un nouveau document vide sera créé. L'étape suivante consiste à remplir le document avec des informations utiles.

 

 

L'adjonction à un document Microsoft Word avec C #

Le programmeur C # ajoute le contenu d'un document Microsoft Word en ajoutant des points :

 

 Word.Paragraph oPara1;

 oPara1 = oDoc.Paragraphs.Add(ref oMissing);

Toute mise en forme du paragraphe  peut avoir lieu à ce stade. Par exemple, le paragraphe peut être transformé en un titre :

 

 object styleHeading1 = "Heading1";

 

oPara1.Range.set_Style(ref styleHeading1);

Le programmeur peut ajouter du texte à l'alinéa :

 

 oPara1.Range.Text = "Create a New Report";

Si en outre les paragraphes doivent être ajoutés puis un décompte final est nécessaire :

 oPara1.Range.InsertParagraphAfter();

 

Cette déclaration assure que l'ajout de nouveaux paragraphes ne va pas écraser l'existant. Tout nouveau  paragraphe est  ajouté  exactement de la même manière :

 

 word.Paragraph oPara2;

oPara2 = oDoc.Paragraphs.Add(ref oMissing);

oPara2.Range.text = "This is my first paragraph.";

oPara2.Range.InsertParagraphAfter();

Word.Paragraph oPara3;

oPara3 = oDoc.Paragraphs.Add(ref oMissing);

oPara3.Range.text = "This is my second paragraph.";

oPara3.Range.InsertParagraphAfter();

Dans l'exemple ci-dessus les nouveaux paragraphes auront  juste le formatage par défaut.

 

 

 

Enregistrement d'un document Microsoft Word avec C #

Une fois que le document contient toutes les informations nécessaires,  il peut être enregistré :

object filename = "C:\\Reports\\daily_report.doc";

oDoc.SaveAs (ref filename,

ref oMissing, ref oMissing,

ref oMissing, ref oMissing,

ref oMissing, ref oMissing,

ref oMissing, ref oMissing,

ref oMissing, ref oMissing);

 

 

Toutefois, il convient de noter que cette opération écrase un fichier existant du même nom.

Fermeture d'un document Microsoft Word

Enfin, le document peut être fermé :

 

oDoc.Close( ref oMissing, ref oMissing, ref oMissing);

 

        oWord.Quit(ref oMissing, ref oMissing, ref oMissing);

        oWord = null;

 

 

 Vous libérez toute la mémoire utilisée.

À ce stade, le compilateur peut vous donner un avertissement ambigu.  C'est parce qu'il y a  les méthodes d'abandon et d’événements. Toutefois, le compilateur va résoudre l'ambiguïté elle-même et l'application fonctionnera comme prévu.

A la fin du processus de l'application on produit un nouveau document Microsoft Word qui est entièrement formaté et contient les informations prévues par le programmeur.

 

 

 

C#

Gestion du Touch WP7 sous XNA4

30. September 2010 by Florian.ROUSSELET

Le nouvel OS mobile de Microsoft, Windows Phone 7, nous permet via l’écran tactile capacitif de gérer plusieurs points d’appuis. Nous allons voir dans cet article comment gérer cet écran au sein d’ XNA 4 et en faire une utilisation basique de détection de position.

Nous allons avoir besoin des logiciels et SDK suivants :

XNA Game Studio 4

Visual Studio 2010 + Windows Phone Tools

Maintenant voyons la marche à suivre pour la gestion du Touch. Tout d’abord, nous devons nous assurer que le Touch est disponible pour « lire » nos entrées dans la boucle Update.

 

TouchPanelCapabilities touchCap = TouchPanel.GetCapabilities();

 

             if (touchCap.IsConnected)

             {..}

 

Et l’on récupère l’état actuel du périphérique.

TouchCollection touches = TouchPanel.GetState();

 

On obtient donc une collection de « touches » (Points de pression) qui contient pour chaque touche ses coordonnées ainsi que l’état. Concernant ces états, il y a 4 possibilités :

-Invalid : Problème de reconnaissance
-Moved : La position a été mise à jour ou la position ne change pas
-Pressed : Il s’agit d’une nouvelle position
-Released : La position n’existe plus

 

Passons maintenant à la partie détection d’un appui sur l’écran.

if (touches.Count >= 1)

{

touchposition = (touches[0].Position);

}

 

Ici, on test si il y a au moins un point de pression de répertorier. Nous utilisons touchposition, qui est un Vector2 pour récupérer les coordonnées X et Y du point de pression. Attention ici il s’agit du point 0, l’écran du Windows Phone 7 peut gérer jusqu’à 4 points de pression. Il faudra donc penser lors du développement à tester les 4 points de pression. Ici à cause de l’émulateur seul le clic de la souris permet de simuler un point de pression. (Le nombre de point de pression possibles peut être vérifié via touchCap.MaximumTouchCount) .

Maintenant que nous avons ce Vector2 touchposition, nous pouvons l’utiliser comme nous voulons et très simplement. Par exemple pour afficher les coordonnées du point de pression.

Dans la boucle Draw, nous allons donc écrire les coordonnées du point de pression.

spriteBatch.Begin();        

string positionX = string.Format("X : {0}", touchposition.X);

spriteBatch.DrawString(font1, positionX,new Vector2(50,380), Color.White);

string positionY = string.Format("Y : {0}", touchposition.Y);

spriteBatch.DrawString(font1, positionY,new Vector2(50,420), Color.White);

spriteBatch.End();

 

font1 est un SpriteFont que j’ai ajouté au projet, il correspond à la police Segoe UI Mono. Celle utilisée par défaut par Windows Phone 7.


 

Faisons un petit résumé du code, commençons par la boucle Update :

TouchPanelCapabilities touchCap = TouchPanel.GetCapabilities();

if (touchCap.IsConnected)

{

TouchCollection touches = TouchPanel.GetState();

if (touches.Count >= 1)

{

touchposition = (touches[0].Position);

}

}

 

Et la boucle Draw pour dessiner notre résultat :

GraphicsDevice.Clear(Color.Black);

spriteBatch.Begin();

string positionX = string.Format("X : {0}", touchposition.X);

spriteBatch.DrawString(font1, positionX,new Vector2(50,380), Color.White);

string positionY = string.Format("Y : {0}", touchposition.Y);

spriteBatch.DrawString(font1, positionY,new Vector2(50,420), Color.White);

spriteBatch.End();

 

Voyons maintenant en image ce que l’on vient de réaliser :

Premier screen : Lancement de l’application, pas d’appui coordonnées = 0
Second screen : Simulation d’un point de pression via un clic souris, mise à jour des coordonnées
Troisième screen : Autre clic, changement des coordonnées

Maintenant c’est à votre tour d’utiliser le Touch. A vos Visual Studio !

C#, Visual Studio 2010, Windows phone 7, XNA , , ,

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 , , ,

C# - Les Attributs

24. September 2010 by Thibault.LAURENS

C# - Les attributs

 

 

I)                   Rappel sur les attributs

Les attributs apportent deux fonctionnalités au développeur C#.

D’abord, il sert à donner des informations au compilateur. Par exemple, l’attribut [CLSCompliant] demande au compilateur de vérifier que la fonction est bien conforme à la norme CLS, ce qui lui permettra d’être appelé par n’importe quel langage compatible avec le Framework.

Egalement, les attributs permettent d’annoter des classes, des méthodes, des propriétés, des arguments… Annoter signifie ici associer des valeurs de manière descriptive, donc sans devoir écrire du code spécial. Ces annotations seront  enregistrées dans la DLL de la classe, parmi les métadonnées qui décrivent la DLL et il suffira de quelques lignes de code à un programme utilisateur pour qu’il puisse retrouver ces annotations.

Les attributs sont très utilisés par les développeurs de composant. Ils leur permettent notamment d’annoter leurs composants d’informations utiles pour les outils de développements.

Certains sont prédéfinis, mais on a également la possibilité de créer et de personnaliser nos attributs.

 

 

II)                Attributs prédéfinis

Nous allons voir ici l’utilisation d’un attribut prédéfini par la CLR (Common Language Runtime) .NET. Il s’agit de l’attribut [Obsolete]. Il permet d’indiquer, lors de la compilation, qu’une classe, une méthode ou une propriété ne doit plus être utilisée. Il accepte deux arguments, le premier est un message et le second est une valeur booléenne. Si cette valeur booléenne est passée à false, le compilateur retourne un message d’avertissement, sinon, à true, il retourne une erreur.

Exemple d’utilisation de [Obsolete] :

 

III)       Attributs personnalisés

Les attributs personnalisés doivent être des classes publiques et initialisés à l’aide de constructeurs. Chaque attribut doit avoir au moins un constructeur et on peut également surcharger le constructeur afin de permettre à l’attribut de s’appliquer à la classe de plusieurs façons différentes.

Pour créer un attribut personnalisé, nous devons d’abords dériver la classe Attribute, puis définir la cible de notre attribut en utilisant l’attribut [AttributeUsage]. [AttributeUsage] prend en argument AttributeTargets.All, .Class, .Constructor, .Field, .Method, ou .Property pour spécifier notre cible. On a également la possibilité de spécifier plusieurs cibles, pour cela, il suffit de séparer les arguments de |.

Exemple :

 

Ici, on créer un attribut [Aide] et on l’applique à une classe Employee.

Voyons maintenant comment le programme utilisateur va récupérer ces annotations. Il utilise la réflexion.

Qu’est ce que la réflexion ? La réflexion fourni des objets qui encapsulent les assemblages, modules et types. C'est le processus par lequel un programme peut inspecter les informations de métadonnées dynamiquement à l'aide de l'API de réflexion

D’abord, il faut ajouter  une référence à notre DLL, ici HelpClass.dll. Aussi, une référence vers System.Reflection est bien évidemment nécessaire. Nous allons utiliser la classe Type (au travers de typeof qui renvoie un objet de la classe Type) et la classe MethodInfo de l’espace de nom System.Reflection.

On récupère dans un premier temps l’Aide de la classe Employee :

Puis l’aide de la méthode AfficheInfo :

C#

WPF - Animations sous Expression Blend

10. September 2010 by Lo�c.GRISPINO

Introduction


Bonjour,

Tout au long de cet article, vous allez apprendre les animations en WPF. Pour cela, je me suis basé sur le précédent article :


Ce qu’il va nous falloir :

-         Le projet de la fenêtre de notification : Window_Notif.zip (83,36 kb)

-         Expression Blend ( dans ce tutorial j’utilise Expression Blend 4, mais c’est exactement le même principe avec la version 3. )

-     Visual Studio


Une simple animation


Donc, nous nous sommes arrêté à une simple fenêtre qui apparaît et disparait au bout de quelques secondes.


Ce serait quand même beaucoup mieux si tout ceci était animé !


Pour commencer on ouvre le projet dans Expression Blend. Donc comme d’habitude :

File -> Open Project/Solution

Et on lui donne le .sln, exactement comme dans Visual Studio.


Dans l’onglet « Projects », il suffit de double cliquer sur la fenêtre à éditer.



A cet endroit, il faut bien penser à sélectionner [Window] avant de cliquer sur le signe + pour ajouter un storyboard.


Sinon vous créeriez une animation uniquement sur le calque choisi.


Donnez un nom à ce storyboard ( « Pop »  par exemple )


A ce moment le cadre deviens rouge pour montrer que ça enregistre les actions, donc évitez de bouger tout n’importe sinon cela risque de voir. Si éventuellement vous souhaitez deplacer un contrôle ( parce qu’il est mal placé par exemple ). Pensez à cliquer sur la petite boule rouge en haut à gauche pour suspendre l’enregistrement.


Le principe est assez simple, à gauche se trouve une timeline. Le curseur est placé à l’instant 0. Comme on veux faire une animation pour l’apparition, il faut qu’au début de l’animation, la fenêtre soit absente, puis arrive en glissant tout en apparaissant.


Ainsi, curseur à 0 ms, on vérifie que c’est toujours [window] qui est sélectionné, on met l’opacité à 0 du Border et on reste appuyé sur la flèche vers le bas jusqu'à ce que la fenêtre soit hors du cadre noir.


Note : Le fait de rester appuyé sur la touche fléchée vers le bas pose des soucis lors des « ctrl+z » en cas d’erreur mais est très précis et évite de décaler la fenêtre.



Note : Le cadre noir est en quelque sorte notre « champ de vision » tout ce qui est hors de celui ne sera pas visible.


Il ne reste plus qu’à se placer à 1s et de remettre la fenêtre en place et l’opacité du Border à 90%.

 

La première animation est finie !


 

Voici la vidéo des actions à faire :



Pensez au plein écran pour une meilleure visiblité !


Ainsi de suite


Nous allons maintenant faire l’animation pour la disparition. Cette étape va être très rapide car il suffit de :

-         Dupliquer le storyboard Pop

-         Renommer Pop_Copy en Depop

-         Inverser


Pour cela un clic droit sur le nom du storyboard nous affiche le menu contextuel.


Voici la manip :




Pensez au plein écran pour une meilleure visiblité !

Lier à l’évènement

Voila, on a nos 2 animations, il faut maintenant leur dire de se lancer lors de l’ouverture et la fermeture de la fenêtre.


Pour cela, il faut aller dans l’onglet « Triggers » ( ou déclencheurs ) en français. Et d’ajouter les évènements.


Par défaut, window.Loaded s’est ajouté avec l’animation Pop dedans. Vérifiez qu’il n’y a bien que cette animation avant de passer à la suite, parce que parfois ça ajoute n’importe laquelle.



Il ne nous reste plus qu’a ajouter l’animation Depop à la fermeture. Il faut donc cliquer sur « +Event », sélectionner le nouveau déclencheur et le remplir ainsi :



Animation à la fermeture


Le souci qu’on a maintenant, c’est que l’animation se fait bien lors de l’ouverture de la fenêtre mais celle de la fermeture n’a pas le temps d’avoir lieu !


C’est à ce moment que ça se complique un peu. Sauvegardez le projet, fermez Expression Blend puis ouvrez le projet dans Visual Studio.


Dans le code XAML ( design ) :


Dans le paragraphe <Window> , ajoutez l’évènement “OnClosing” et donnez lui un nom :

Closing="Window_Closing"



Trouvez le paragraphe :

<Storyboard x:Key="Depop">

[…]

</Storyboard>

 

Il faut ajouter l’évènement Completed pour pouvoir l’utiliser.


<Storyboard x:Key="Depop" Completed="closeStoryBoard_Completed">

 

Le code doit ressembler à ça :

 

 

 Dans le code C# :


Il faut ajouter la variable booléenne qui passera a TRUE quand l’animation sera finie.

private bool closeStoryBoardCompleted = false;

 

 

 


Et ajouter à la suite de notre classe les 2 méthodes qui permettront d’attendre la fin de l’animation avant de fermer la fenêtre.




Voici donc le rendu final :




Pensez au plein écran pour une meilleure visiblité !

Vous pouvez également télécharger l'archive du projet fini : Window_Notif_anim.zip (83,36 kb)

 

Voila, ce tutorial est fini , je vous remercie pour votre interêt et vous souhaite un bon codage.

ADO.NET, C#, Visual Studio 2010, WPF , , , , , , , , ,

Requête LinqToSql avec ordre Distinct et OrderBy

7. September 2010 by Guillaume.CALMELS

Problème : Afficher la liste des partenaires selon l’item de la DropDownList choisi. Cette DropDownList contient la liste des pays et permet de faire un affichage des partenaires selon le pays choisi. De plus, une version anglaise est présente sur le site, donc l’affichage de la DropDownList doit se faire de manière conséquente :

-          - Afrique du sud pour la version française et South Africa pour la version anglaise

Il faut donc que la DropDownList s’ordonne en fonction de la langue donc.

Pour cet exemple, j’ai une table « Countries » qui contient l’ensemble des pays avec un label en version française et un autre en version anglaise. J’ai aussi une table « PartnerTerritories » qui contient des partenaires qui revendent des produits dans un pays donnée.

Il faut donc que la DropDownList ne contienne seulement les pays concernés par les partenaires.

Commençons par un exemple de requête :

-          _Context2010 étant ma liaison avec la base de données.

-          On utilise une jointure pour afficher seulement les pays concernés par les partenaires.

L’ordre ici est bien respecté, mais on observe des doublons.

Il faut, bien sûr, que l’affichage ne comporte qu’une seule fois le pays concerné. Pour cela on va utiliser la clause Distinct().

On obtient le résultat suivant, un affichage ne respectant pas le OrderBy

 

Le problème est que la clause Distinct() supprime la contrainte d’ordre précédente. Du coup, les pays ne sont pas ordonnés…

La solution est d’utiliser la contrainte OrderBy après la clause Distinct() en utilisant les prototypes.

Notre DropDownList est bien rangé dans l’ordre alphabétique.

Et si on passe le navigateur en anglais, il suffit d’ordonner par le label anglais et le tour est joué.

 

 

 

Conclusion :On peut voir que Linq ne respecte pas l'ordre SQL de base, il suffit de lui spécifier le OrderBy après le Distinct pour pouvoir faire notre classement. J'espère pouvoir en aider certains d'entre vous lors de développement.

C# , , , , ,