Archive for the 'Silverlight' Category


Free ColorPicker and ColorChooser custom controls

13 commentaires

Je mets en ligne deux nouveaux composants exposés ci-dessous :

Install Microsoft Silverlight


Vous pouvez  télécharger la librairie tweenedcontrols ici.

ColorChooser
Depuis sa version beta, ce contrôle a été largement améliorée. Il est désormais possible de cliquer directement sur la surface des deux nuanciers pour sélectionner une couleur. La propriété SelectedColor est cette fois de type Color. Tous les tests d'écriture d'une couleur sont directement accomplis par cette classe. Cela simplifie beaucoup le code et évite l'utilisation d'une classe de conversion.

ColorPicker
Ce composant a pour but de faire apparaitre un ColorChooser via l'utilisation interne d'une instance de Popup. Toute la problématique consiste à placer le ColorChooser à côté du ColorPicker. À cette fin, j'ai créé une méthode d'extension pour la classe Popup. Il est également possible d'accéder au style et template du ColorChooser directement par l'intermédiaire des menus Edit Template=> Edit Aditional Template comme montré ci-dessous.


ColorPicker possède la propriété de dépendance IsOpen couplée aux événements Opened et Closed.
Mis à part cette astuce ce contrôle se contente d'exposer, les propriétés et événements du ColorChooser.

Un nouveau livre sur Silverlight

4 commentaires

J'ai finalisé récemment l'écriture de mon livre Pratique de Silverlight dédié à la technologie du même nom. Celui-ci devrait faire plus de 500 pages et s'articule autour de l'apprentissage des bonnes pratiques de production en équipe. Il est édité par Pearson Education France et sort le 2 février 2010. Je ne l'ai pas conçu comme un glossaire de fonctionnalités mais plutôt comme un guide de production et d'apprentissage. Il trace un portrait robot de la conception d'applications Silverlight, en partant de la liste d'affichage jusqu'au chargement de données externes au sein du modèle de conception MVVM en passant par le prototypage ou l'organisation des flux de production.

L'idée générale du livre est de fournir des exemples concrets téléchargeables aussi bien pour les graphistes que pour les développeurs. Vous pouvez en réserver un exemplaire sur le site  de Pearson France ici.

Cet ouvrage s'adresse aux intégrateurs Web, aux designers interactifs, aux graphistes purs et aux développeurs web peu familier de la plateforme .Net. Il crée un pont entre développement et graphisme, pour améliorer la collaboration et la productivité.

Son contenu prend en compte les spécificités des développeurs et des designers interactifs sous formes d'exercices complémentaires. Le C# est choisi comme seul langage logique pour plus de clarté. La théorie, les exemples et exercices (téléchargeables) sont progressifs et peuvent constituer une base d’apprentissage pour les non développeurs. Toutefois ce livre ne s’adresse pas aux débutants du Web, mais bien aux personnes qui possèdent des bases acquises sur d’autres technologies.

Voici le sommaire du livre :)

Partie I. Approche de Silverlight

1. Introduction
1.1 Qu’est-ce que Silverlight ?
1.2 De .Net 1 à Silverlight
1.3 Les avantages de Silverlight
1.4 La suite Expression Studio
1.5 Positionnement métier
1.6 Langages de développement et choix

2. Le couple XAML / C#
2.1 XML
2.2 XAML, un langage déclaratif puissant
2.3 Les fondamentaux du langage C#

3. HelloWorld
3.1 Une première application Silverlight
3.2 Architecture d'une solution
3.3 Le conteneur racine
3.4 Ajouter du texte
3.5 Tester et compiler

4. Un site plein écran en 2 minutes
4.1 Les projets de type site Internet
4.2 Créer des conteneurs redimensionnables
4.3 Le composant bouton
4.4 Ajouter de l’interactivité
4.5 Fichiers déployés

5. L’arbre visuel et logique
5.1 Composants visuels
5.2 Principe d’imbrication
5.3 Ajouter des enfants à la liste d’affichage
5.4 Supprimer des objets de l’arbre visuel
5.5 Échanges d’index

Partie II. Interactivité et création graphique

6. Animations
6.1 Introduction
6.2 Animer avec Expression Blend
6.3 Gérer l’accélération
6.4 Animer avec C
6.5 Les transformations relatives
6.6 Animer des particules

7. Boutons personnalisés
7.1 Créer un lecteur vidéo
7.2 Style visuel
7.3 Bouton générique
7.4 Le gestionnaire d’états visuels
7.5 Le bouton interrupteur ou ToggleButton

8. Interactivité et modèle événementiel
8.1 Les fondements du modèle événementiel
8.2 Supprimer l’écoute d’un événement
8.3 Le couplage faible en pratique
8.4 Propagation événementielle
8.5 Les comportements

9. Les bases de la projection 3D
9.1 L’environnement 3D
9.2 Les propriétés 3D
9.3 La caméra
9.4 Introduction aux matrices

10. Prototypage dynamique avec SketchFlow
10.1 L’environnement
10.2 Prototype simple
10.3 Le lecteur SketchFlow
10.4 Interactivité
10.5 Interface riche

Partie III. Conception d’applications riches

11. Ressources graphiques
11.1 Qu’est-ce qu’une ressource
11.2 Les pinceaux
11.3 Les polices de caractères
11.4 Styles et modèles de composants
11.5 Le modèle Slider
11.6 Les liaisons
11.7 Le modèle ListBox

12. Composants personnalisés
12.1 Contrôle utilisateur
12.2 Boîte de connexion
12.3 Contrôles personnalisables

13. Médias et données
13.1 Chargement de médias
13.1.1 Chargement dynamique d’images
13.1.2 Formats vidéo et modes de diffusion
13.1.3 Un lecteur vidéo simple
13.1.4 Chargement dynamique de vidéos
13.2 Conception MVVM
13.2.1 Principes
12.2.2 Modèle
12.2.3 Vue-Modèle
13.3 Chargement de données
13.3.1 L’objet WebClient
13.3.2 Introduction à LINQ
13.3.3 Expression lambda
13.3.4 Consommer du XML avec LINQ
13.3.5 Charger un flux JSON
13.3.6 Sécurité inter-domaine

PieProgressBar custom control

Aucun commentaire

Pour les besoins d'une production récente, j'ai du concevoir un contrôle de progression circulaire nommé PieProgressBar. Ce dernier hérite de la classe RangeBase et bénéficie à ce titre de toutes les capacités inhérentes à ce type de contrôle. Il se comporte au final comme n'importe quel contrôle de type ProgressBar avec quelques petites choses en plus. La petite difficulté fut de créer dynamiquement le camembert de progression via C#. Contrairement à WPF, Silverlight ne permet pas de surcharger de méthode permettant de créer de nouveaux genres de Shape. Autrement dit, même si Shape est une classe abstraite, il ne sert à rien d'en hériter car la méthode de conception du tracé ne peut être surchargée.
L'autre technique consiste à utiliser le "Path mini language" qui permet de créer des figures géométriques en XAML. J'ai du utiliser 3 segments dont un ArcSegment afin de réaliser ce contrôle. comme je ne pouvais pas créer de primitive Pie pour le graphiste sous Blend, il a fallu ruser... La technique consiste a créer dynamiquement le camembert lors de l'assignation d'une partie de contrôle (ControlPart). En interne, les propriétés de remplissage du tracé généré, sont liées aux propriétés du contrôle via une simple liaison de données créées cote C#.
Vous pouvez en voir des exemplaires ci-dessous et télécharger la librairie tweenedcontrols ici.

Install Microsoft Silverlight

Une fois la dll référencée, vous pouvez instancier des contrôle PieProgressBar dans Blend via le panneau Assets comme montré ci-dessous :

Ce composant va être sans doute inclu comme d'autres dans le projet CodePlex SLExtensions que Thierry Bouquain met à jour en ce moment et que je salue au passage :)

Une série de Podcasts par Tim Heuer sur Silverlight 4

Aucun commentaire

    Tim Heuer mets en ligne une série de vidéos dédiées à Silverlight 4. Les thèmes sont listés ci-dessous :

    • Vue d'ensemble

    Quelles sont les principales choses à savoir sur Silverlight 4 ? Une comparaison avec Silverlight 3?

    • Contrôles

    Quels sont les nouveaux contrôles de Silverlight 4?

    • Out Of Browser

    Comment établir des privilèges élevés pour vos applications ?
    Que sont les notifications toast?
    Comment peut-on héberger du contenu HTML dans une application ?

    • Impression et Webcam

    Comment les nouvelles API d'impression / webcam Microphone fonctionnent-elles ?

    • * Vs Silverlight WPF

    Avec sa version 4, la frontière entre Silverlight et WPF s'efface. Comment décider quelle technologie utiliser?

    • * Améliorations du moteur de texte
    • Communication réseau

    Quel sera l'impact pour vos futurs développement ?

    • Liaison de données: Les nouveautés

    Voici un lien vers le blog de Tim, n'hésitez pas à visionner les vidéos pour mieux découvrir les nouveautés de Silverligh 4.

    http://www.sparklingclient.com/silverlight-4-podcast-pack-with-tim-heuer

    Silverlight 4 beta est disponible

    Aucun commentaire

      Silverlight 4 en version bêta est maintenant disponible.

      Cette annonce a été faites au PDC 2009 qui se déroule actuellement à Los Angeles. Une centaine de nouveautés sont déjà sur les rails dont :

      • Le support de l'impression
      • Le support des langues arabe, hébraïque et asiatique avec un support du texte bi-directionnel
      • Un nouveau set de contrôles dont un champ texte riche
      • Le support natif du microphone et de la webcam
      • Une nette amélioration de performances (de l'ordre de 200%)
      • La notion d'applications trustées en mode Out Of Browser
      • Pour les application de confiance en mode OOB, la possibilité d'accéder au répertoire MesDocuments et l'équivalent sous systèmes non windows.
      • Capacité d'affichage de contenu HTML dans les applications OOB.
      • Le support de Chrome
      • Le support complet du clavier en mode kiosk FullScreen
      • L'interopérabilité COM  afin de communiquer avec les couches Hardware.
      • Amélioration des mécanismes de liaison.
      • Les menus contextuels et le Drag'nd Drop

      Vous trouverez toutes ces fonctionnalités et de nombreuses autres détaillées sur le portail Silverlight.net http://silverlight.net/getstarted/silverlight-4-beta/

      Optimisation d’effets (Shaders) sous Silverlight

      Aucun commentaire

      Récemment, j'ai du utiliser les shaders ou effets Silverlight pour mes besoins personnels. En soit, cela est assez courant, leur utilisation peut toutefois se faire au détriment des performances de votre application. Cet article explique comment optimiser la mémoire et la charge processeur lorsque vous appliquez des effets aux instances d'UIElement.

      Tout d'abord, chaque fois que vous appliquez l'un des shaders ou effets fournis par défaut, soit DropShadow et Blur, sur une instance d'UIElement, vous générez en réalité deux bitmaps en RAM à l'exécution. La première bitmap est un rendu simple des vecteurs, la seconde bitmap est l'image affichant l'effet finalisé. Celle-ci est calculée à partir de la première. En termes de performance, ce comportement,  peut conduire à certains problèmes si vous ne prenez pas garde :

      Il nous faut tout d'abord calculer la mémoire utilisée par un effet standard appliqué à un UIElement 200 * 200. Pour cela, nous prenons en compte que chaque pixel (40000 pour une telle image) est codé sur 4 octets en mode ARGB:

      * la couche de transparence Alpha est codée sur 1 octet (appelé octet en français) et 8 bits, conduit à 256 valeurs possible de 0 à 255 ou 0x00 à 0xFF en hexadécimal. les autres couches sont sur le même modèle.
      * Red | 1 octet | 8 bits | 0xFF | 0-255
      * Green | 1 octet | 8 bits | 0xFF | 0-255
      * Blue | 1 octet | 8 bits | 0xFF | 0-255

      Les images étant générées à l'exécution, celle-ci sont stockées dans la mémoire vive. Comme elles ne sont pas compressées, il est facile de calculer leur poids via la formule ci-dessous  :
      PixelsWidth * PixelsHeight * 4 octets = poids total de la bitmap intermédiaire dans la mémoire RAM

      Dans notre cas, le bitmap est d'environ 160 Ko, mais cela correspond uniquement au poids de l'image intermédiaire. La seconde image occupera au moins 160 k octets voir plus, pour le projeté d'ombre et le flou. Celle-ci déborde en effet de l'enveloppe afin d'afficher l'effet finalisé. le poids total est donc au minimum d'environ 400 kilo octets si l'on considère que ces effets ont un rendu de surface plus grand que l'enveloppe d'origine.

      Concernant les effets personnalisés que vous créez par vous-même via des logiciels comme Shazam en utilisant le langage HLSL (High Level Shader Language), les comportements du lecteur sont assez différents car Silverlight ne génère pas d'image intermédiaire pour rendre l'effet. Ce comportement présente de grands avantages en termes d'occupation mémoire mais reste spécifique aux effets que vous développerez par vous-même. Attention toutefois au fait que ce comportement n'est plus valable lorsque vous appliquez de la 3D ou que vous mettez le vecteur en cache via la propriété CacheMode. Dans ces derniers cas, l'image intermédiaire est systématiquement créée...

      Le filtre est souvent recalculé au cours du temps lors de certaines transformations du vecteur original. Seules exception, ce n'est pas le cas pour les transformations de type déplacement (TranslateTransform). Pour toutes les autres opérations, l'image intermédiaire est recréée de toute pièce, l'image finalisée l'est donc également. Par exemple, si vous décidez d'animer l'échelle, la rotation ou l'inclinaison d'un rectangle, le rendu de l'effet et les images en mémoire qui en découlent seront regénérées à chaque fois. Ce comportement permet de conserver un effet sans pixelisation ou crénelage. Par exemple, pour un raffraichissement de 60 image par seconde et une animation d'échelle, Silverlight génèrera environ 60 bitmaps intermédiaires et 60 bitmaps affichant l'effet final. Les designers et les développeurs doivent prendre garde à ce type de comportement. Dans le cas contraire, la charge mémoire et CPU utilisée pour afficher de simples effets, pourrait augmenter de manière drastique et diminuer ce faisant les performances de votre application... Pour éviter ou limiter ces ralentissements, l'équipe d'ingénieurs Silverlight a autorisé une taille maximum de 2048 pixels en largeur et en hauteur. Cette limitation n'est toutefois pas si simple à mettre en valeur car certains artefacts de rendu peuvent apparaître dans ces dimensions. Lorsqu'un effet est supprimé ou qu'un UIElement est détruit, la mémoire réservée  pour rendre l'effet est automatiquement libérée.

      Vous trouverez certaines des meilleures pratiques ci-dessous:

      * Plus la surface sur laquelle vous appliquez un effet est petite, mieux c'est. Les effets ne doivent pas être appliqués de manière inconsidérée et sont susceptibles d'alourdir considérablement votre visuel.

      * Evitez les effets sur les éléments qui subissent des animations. Mise à part dans le cas de déplacement, cela conduit à recalculer les images bitmaps et à les replacer en mémoire systématiquement selon la cadence de votre animation.

      * L'effet Blur est très lent car multipasse. Conservez un faible rayon. Au delà de 10 pixels, vous commencerez à remarquer une dégradation flagrantes des performances.

      Pour finir, sachez que depuis .NET 3.5, Silverlight 3 et WPF reposent tous deux sur le même langage HLSL ce qui permet d'utiliser les mêmes effets de filtre personnalisés sur les deux plateformes.

      CustomControl ColorChooser and ColorPicker

      Aucun commentaire

      J'ai récemment eu besoin de contrôles personnalisables de type ColorPicker et ColorChooser, n'en trouvant pas, je les ai conçu from scratch, voici une démo.

      Install Microsoft Silverlight

      Ceux-ci sont en version bêta mais je pense fournir une version finale d'ici le 15 novembre. En attendant, si vous souhaitez tester ces contrôles et télécharger la dll pour test dans SL3, c'est ici.

      Ps : le plugin Silverlight pour WordPress fourni par Tim Heuer est vraiment performant et très utile, merci à lui, je n'utiliserai plus que cette solution :)

      3DLightEngine Library preview

      4 commentaires

      Je mettrai bientôt à disposition une librairie opensource nommée LightEngine3D. Son but sera de résoudre de manière simple quelques scénarii d'utilisation d'interfaces 3D qui serait assez compliqué à gérer voir impossible directement avec la classe simplifiée PlaneProjection. Celle-ci est basée sur du calcul matricielle et par conséquent la structure Matrix3D. Je porterai également quelques méthodes de Matrix3D fournies par DirectX. Au programme backface culling Z, sorting automatic, Vector3D, Camera et peut-être lumière directionnelle, etc... C'est dans tous les cas un projet de longue haleine mais je n'ai pas non plus envie de faire une usine à gaz. L'idée principale est de créer un mini moteur 3D que vous pourrez facilement étendre par la suite.

      Install Microsoft Silverlight

      Le code utilisé pour créer ce projet est simpliste :

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      
      //on définit un angle d'ouverture de 60°
      double FovY = Matrix3DUtils.DegresToRadians(60); 
      //image affichée par défaut
      Uri BitmapUri= new Uri("Blend3_logo3.jpg", UriKind.Relative);
       
      Element3D E3D;
       
      Scene3D s;
       
      public MainPage()
      {
         // Required to initialize variables
         InitializeComponent();
       
         ResetBtn.Click += new RoutedEventHandler(ResetBtn_Click);
       
         E3D = new Element3D(MonUIElement);
       
         E3D.NormalDirectionChanged += new Element3D.DirectionChanged(E3D_NormalDirectionChanged);
       
         E3D.DotProductChanged += new Element3D.DirectionChanged(E3D_DotProductChanged);
       
         #region Personalize perspective and ViewPort
         /*
         Perspective p = new Perspective(FovY,		            //Angle d'ouverture
         LayoutRoot.ActualWidth / LayoutRoot.ActualHeight,   //Rapport largeur/hauteur
         1.0,                                                //La distance visible la plus proche 
         3000.0);                                            //La distance visible la plus éloignée
       
         Viewport v = new Viewport(LayoutRoot.ActualWidth, LayoutRoot.ActualHeight);
       
         s = new Scene3D(LayoutRoot, p, v);
         */
         #endregion
       
         #region Personalize clip plane
         /*
         s = new Scene3D(LayoutRoot, FovY,1,3000);
         */
         #endregion
       
         #region Personalize Field of view angle
         s = new Scene3D(LayoutRoot, FovY);
         #endregion
      }
       
      //produit scalaire du vecteur caméraObjet par le vecteur de l'axe z objet
      void E3D_DotProductChanged(Element3D sender, int normalDirection)
      {
         ProduitScalaireTxt.Text = sender.DotProduct.ToString();
      }
       
      //Lorsque la direction de la normal par rapport à la caméra change on réaffecte une image
      void E3D_NormalDirectionChanged(Element3D sender, int normalDirection)
      {
         DirectionTxt.Text = normalDirection.ToString();
         Uri BitmapUri = normalDirection == 1 ? new Uri("Blend3_logo3.jpg", UriKind.Relative) : new Uri("Blend3_logo.jpg", UriKind.Relative);
         MonUIElement.Source = new BitmapImage(BitmapUri);
      }
       
      //A chaque fois que la valeur du slider assurant la translation change on réaffecte
      //celle-ci à la propriété adéquate du Element3D et on recalcule la scène
      private void onTranslateXChange(object sender, RoutedPropertyChangedEventArgs<double> e)
      {
         E3D.GlobalOffsetX = e.NewValue;
         s.RenderScene();
      }
      //
      </double>

      Il suffit d'utiliser la classe enveloppante Element3D et d'instancier une nouvelle scène. J'ajouterai très rapidement la classe ContainerElement3D. Par défaut l'objet n'est pas dans un container mais directement dans la Scene3D. Cet exemple montre qu'il est relativement simple d'étendre les capacités existantes de Silverlight en matière de 3D. La prochaine étape, porter une partie des fonctionnalités DirectX...

      Soirée communautaire FXP

      1 commentaire

        Voici une invitation en bonne et due forme pour la soirée communautaire prévue le jeudi 24 septembre à 18h30. La thématique est consacrée aux beatles et il y aura plein de trucs à gagner que j'énonce pas ici tellement ça claque. Pour vous inscrire c'est ici.

        Silverlight 3 Final release and Expression Studio RC disponible

        Aucun commentaire

          Silverlight 3 est maintenant disponible en version finale. La suite Expression Studio est elle aussi disponible en version Release Candidate pour sa part. Depuis le temps que j'attendais la sortie, nous allons enfin pouvoir jouer avec tout ça et mettre à jour les applications Silverlight actuellement en bêta. Voici un récapitulatif des nouveautés apportées par Silverlight 3 :

          • GPU support pour la vidéo, comme dans Flash on définiera l’utilisation directement dans le tag de l’object ou directement à l’exécution. A utiliser pour afficher de la vidéo plein écran dans 95% des cas…
          • H264 AAC MPEG4
          • perpective 3D, ici rien d’autre que de la bonne 2.5D comme dans Flash 10.
          • Bitmap & pixel API
          • Pixel Shader effects. Vous pouvez dorénavant utiliser les filtres au sein de Silverlight et même créer les votre grâce au langage HLSL (High Level Shader Language). Ce langage est proche du C est s’apparente pas mal à PixelBender de la plate forme d’Adobe.
          • Deep linking. Je n’ai pas vraiment testé cette fonctionnalité mais il semble qu’elle soit implémentée…
          • Library caching support. Cette fonctionnalité est assez intéressante, elle permet de ne pas télécharger à chaque fois les librairies partagées par plusieurs applications Silverlight.
          • Déploiement du lecteur Silverlight en dehors du navigateur. Grâce à un seul click droit, l’utilisateur peut transformer n’importe quelle applications Silverlight en application bureautique sandboxée. Cette fonctionnalité cible directement la plate forme AIR, mais ne correspond pas exactement au même modèle économique puisqu’il n’y a pas d’installeur proprement dit.
          • Behaviors. Les comportements permettent au graphiste une plus grande autonomie. Ainsi, plus besoin d’un développeur pour créer des interactions utilisateurs. Plus que ça, les comportements reposent sur le pattern decorator. Un développeur peut assez facilement créer des comportements supplémentaires puis les donner aux graphistes pour faciliter les tâches courantes d’interactivités. Je mettrai en ligne plusieurs Behaviors ainsi qu'un tuto vidéo expliquant leur création.
          • API Local Connection pour permettre à deux instance du plugin de communiquer.
          • Dictionnaires de ressources. Cette fonctionnalités permet de partager et d'externaliser simplement les ressource graphiques.
          • Embarquement de polices compressées. Les polices sont compressées au sein d'un fichier .zip et embarquée au sein du fichier XAP.

          « Previous PageNext Page »