Archive for the 'Tutos Docs' Category


Concevoir vos propres comportements avec Silverlight

Aucun commentaire

Si vous avez déjà utilisé Expression Blend, il est fort possible que vous ayez utilisé les comportements au cours de vos projets. Ils sont bénéfiques à plusieurs niveaux : d'une part, ils permettent d'ajouter de l'interaction sans coder en C# ou VB ; d'autre part, ils apportent une aide précieuse lorsqu'il est important de découpler la vue, le modèle et la vue-modèle. Pour finir, ils jouent un rôle essentiels en production puisqu'ils sont développés dans un objectif de réutilisation et qu'ils sont très simplement paramétrables dans Expression Blend.

Il existe deux grandes familles de comportements, les comportements simples et les comportements d'action déclenchée. Les comportements simples sont représentés par une icône d'engrenage, MouseDragElementBehavior, que vous trouverez dans le panneau assets, est de ce type. Dès lors que vous le déposer sur l'objet, celui-ci acquière une capacité supplémentaire directement accessible. Au contraire les comportements déclenchés n'agissent que lorsqu'un événement est diffusé. Ils sont identifiés par l'icône de l'engrenage surmontée d'une flèche de lecture.

Pour créer un nouveau comportement, il suffit dans Blend d'ajouter un élément dans un projet de type Behavior ou Action (via le menu Add Item...). Nous allons créer un comportement permettant de créer la copie visuelle d'un objet. Cela nous permettra de générer un effet de réflexion comme montré dans le projet Silverlight ci-dessous.

Install Microsoft Silverlight

Créez un nouveau projet et ajoutez un comportement de type Action. Faites-le hériter de la classe TargetedTriggerAction. Cela sera pratique car nous pourrons cibler un objet dont on souhaite répliquer le visuel. Vous obtenez le code ci-dessous :

public class SnapshotAction : TargetedTriggerAction<UIElement>
{
	public SnapshotAction()
	{
 
	}
 
	protected override void Invoke(object o)
	{
 
	}
 
}

C'est la méthode surchargée Invoke qui nous intéresse. Celle-ci sera exécutée chaque fois qu'un événement au choix sera diffusé. Nous allons maintenant récupérer une image du composant ciblé puis l'appliquée sur le composant possédant le comportement.

protected override void Invoke(object o)
{
      //on déclare une nouvelle image en écriture
      WriteableBitmap Wb;
 
      //on l'instancie en lui passant l'objet
      //elle doit créer un instantanné
      Wb = new WriteableBitmap(this.Target, null);
 
      //on crée un nouveau pinceau d'image
      ImageBrush Ib = new ImageBrush();
 
      Ib.AlignmentX = AlignmentX.Left;
 
      Ib.Stretch = Stretch.None;
      //on affecte l'image binaire de l'instantanné à
      //la propriété ImageSource du pinceau d'image
      Ib.ImageSource = Wb;
 
      //Ensuite on teste le type de l'objet ciblé et on affecte
      //la bonne propriété en fonction de ce dernier
      if (AssociatedObject is Shape) ((Shape)AssociatedObject).Fill = Ib;
      else if (AssociatedObject is Panel) ((Panel)AssociatedObject).Background = Ib;
      else if (AssociatedObject is Control) ((Control)AssociatedObject).Background = Ib;
      //nous pourrions utiliser un peu de réflexion pour améliorer ce test
}

La propriété Target du comportement correspond à l'objet ciblé par ce dernier. La propriété AssociatedObject fait quant à elle référence à l'objet sur lequel est déposé le composant. Dans notre cas, nous testons simplement le type de cet objet pour lui appliquer la capture bitmap en tant que pinceau de remplissage.

Voilà le tour est joué, il suffit de compiler le projet une première fois pour accéder au comportement dans le panneau assets, puis de déposer ce dernier sur une instance de Shape (par exemple) comme indiqué sur la figure ci-dessous.

Le comportement finalisé est téléchargeable à l'adresse suivante. J'y ai ajouté la possibilité de déclencher la réplication bitmap en mode automatique via l'utilisation d'un DispatcherTimer. Il est également possible de modifier la cadence de rafraichissement pour éviter les pertes de performances (voir figure ci-dessous).

Pour finir, sachez qu'avec Silverlight 4, il est désormais possible de créer des comportements intégrant directement le pattern commande. Celui-ci est directement lié au modèle de conception MVVM mais cela est une autre histoire.

Les polices de caractères avec Caractères spéciaux

Aucun commentaire

    je remonte ce post de Aude Mousset qui explique comment contourner le problème d'embarquement des polices dont le nom contient des caractères spéciaux...

    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.

    Windows 7 RC

    Aucun commentaire


      La version release candidate de windows seven est accessible aux abonnés MSDN depuis ce matin. J'avais assez envie de changer mon bon vieux Windows Xp, j'ai donc installé 7 sur deux postes dont un mac book pour le tester. Première bonne chose, je n'ai aucun problème de compatibilité, tout fonctionne directement sans heurts. Deuxième bonne nouvelle, sur VMWare, sur un simple macbook c'est rapide et efficace pourtant j'utilise de nombreux logiciels en même temps, Expression Blend, Visual Studio, Office, Photoshop, Flash, etc... On ressent l'effort de Microsoft pour apporter un maximum de performances et de stabilité au système. Seven s'annonce prometteur avec de nombreuses améliorations sur l'ergonomie notamment sans toutefois mimer MacOs, son grand concurrent. La grande nouveauté est l'intégration d'une machine virtuelle XP directement au sein de 7 ce qui permettra de faire tourner n'importe quel programme compatible avec XP. Il faudra tout de même attendre la version finale pour avoir une idée de ce système. La version RC quant à elle devrait être accessible dans le courant du mois de mai pour le grand public...

      Déployer une application Silverlight sur le bureau

      Aucun commentaire

        Silverlight 3 permet désormais de sauvegarder une application internet sur le bureau. Je trouvais que c'était un bon exemple de le faire avec mon projet précédent de WebTv Je présente dans cette article comment réaliser une application internet déployable en local. Attention tout de même, vous devrez installer la version bêta de Silverlight 3 pour suivre ce tutorial. Il suffit de cliquer droit sur une application Silverlight en cours d'exécution puis de sélectionner l'option "saveForOfflineUse". Cette option est grisée par défaut, nous allons l'activer.Pour cela, il faut modifier le fichier AppManifest.xml. Ce fichier décrit un certain nombre de paramêtres propres à l'initialisation et au déploiement de l'application. Vous trouverez ce fichier dans le répertoire properties du projet Silverlight 3 :

        <Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Deployment.Parts>
        </Deployment.Parts>
        </Deployment>

        Vous devez en priorité spécifier le point d'entrée de l'Application Silverlight. Ensuite, vous pouvez spécifier des icônes, un titre, un sous-titre et des commentaires :

        <Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        <!-- ce sont ces paramêtres sui permettent de dégriser l'option au clic droit -->
        EntryPointAssembly="Webtv"
        EntryPointType="Webtv.App">

        <Deployment.Parts>
        </Deployment.Parts>
        <Deployment.ApplicationIdentity>

        <ApplicationIdentity ShortName="Tweened Webtv" Title="Web TV">

        <ApplicationIdentity.Blurb>
        Voici une WebTv déployable sur le bureau.
        </ApplicationIdentity.Blurb>

        <!-- avec des icônes, c'est un peu plus propre
        <ApplicationIdentity.Icons>
        <Icon Size="16x16">sl16.png</Icon>
        <Icon Size="32x32">sl32.png</Icon>
        <Icon Size="64x64">sl64.png</Icon>
        <Icon Size="128x128">sl128.png</Icon>

        </ApplicationIdentity.Icons>
        -->

        </ApplicationIdentity>

        </Deployment.ApplicationIdentity>
        </Deployment>

        ProxyRenderTransform class et méthodes d’extension

        Aucun commentaire

        Comme vous devez le savoir, depuis C# 3 les méthodes d'extension ont fait leur apparition. Le but des méthodes d'extension est simple : étendre les capacités de n'importe quel objet sans pour autant générer du code Spaghetti. Une extension de méthode doit toujours être au sein d'une classe statique. Celle-ci doit également être static. Tout se passe au niveau de sa signature dont voici un exemple simple :

        static class MyExendsMethods
        {
        public static bool IsBiggerThan (this int myInt, int compare){ return myInt > compare; }
        }

        Vous remarquez que le premier paramètre commence par le mot clé this. Cela signifie qu'il fait référence à la variable de type entier qui va faire appel à la méthode. Le second paramètre est en fait le premier paramètre de la méthode IsBiggerThan lorsque celle-ci sera appelée. voici comment se déroule l'appel :

        int monEntier = 37;
        bool myBoolean = monEntier.IsBiggerThan ( 13 );

        J'ai utilisé les méthodes d'extension assez récemment pour permettre d'accéder de manière simple et transparente aux noeuds RenderTransform des objets XAML. Ceux-ci sont difficiles d'accès par code lorsqu'ils ne sont pas nommés.
        Lorsque vous aurez référencé la dll et fait un using du package ProxyRenderTransform, vous accéderez aux méthodes d'extension : SetX, GetX, SetScaleX, GetScaleX, etc...
        télécharger la librairie ProxyRenderTransform sur CodePlex avec licence Ms-Pl
        Je n'ai eu aucun soucis avec et je l'ai bien testé mais si vous rencontrez des difficultés n'hésitez pas :)

        Utiliser l’API de Reflection au sein de Silverlight

        Aucun commentaire

        J'ai dernièrement eu besoin de récupérer toutes les méthodes static d'une classe afin d'afficher le résultat visuel de celles-ci. En fait l'idée était d'afficher la courbe correspondante à chaque équation de mouvement contenues dans la classe TweenedEquations. Pour cela il suffit dans le framework Silverlight d'utiliser l'Api de Reflection contenue dans le package System.Reflection. Je mets ici en ligne la portion du code que j'ai utilisé afin d'automatiser l'instanciation automatisée d'un UserControl (composant) personnalisé. Read more »

        Diaporama Silverlight

        Aucun commentaire

          Salut à tous,

          Voici l'exemple d'un diaporama que j'ai fais il y a quelques temps pour les besoins d'un mini Tutorial pour FlashXpress.net, vous pouvez retrouver ce tutorial ici. J'utilise la librairie Tweened pour faire les effets de fondu et c'est vraiment très simple à réaliser pour le coup :)

          Pré-requis Silverlight

          Aucun commentaire

            On m'a très souvent poser cette question : que faut-il pour développer une application Silverlight ?

                J'avoue que la réponse a évolué au cours du temps. Les pré-requis logiciels pour concevoir une telle application ont souvent changé, notamment avec la mise à jour des logiciels d'authoring ou la mise à jour des systèmes d'exploitation. Je crée une nouvelle page pour répondre à cette question. Celle-ci sera sans doute mise à jour dans l'avenir. Vous y trouverez les liens vers les softs et quelques petits conseils...

            Relegate

            Aucun commentaire

              Salut à tous,

              Voici un petit hommage à Tek concernant sa fonction relegate, si si souvenez-vous, c'était en durant l'été 1994. Nous avions été bannis de la coupe du monde par Israël et Future Splash Animator battait son plein. Cependant l'idée était née, pourquoi ne pas passer des paramêtres supplémentaires lors de la délégation du contexte d'exécution d'une fonction. Tek nous avait gratifié de sa fonction Relegate trés pratique, voici la mienne côté javascript adaptée au modèle événementiel de Silverlight 1.0 :

              Read more »

              « Previous Page