Archive for the 'Blend' Category


Yet another Lite 3D Engine to release

Aucun commentaire

Je mettrai en ligne courant de l'été une première release de la librairie Tweened. Celle-ci contient notamment, des composants, des behaviors, un wrapper de tween (facilitant la conception d'animation par code) ainsi qu'un mini moteur 3D très simple d'utilisation. En voici un exemple concret téléchargeable ici :

Install Microsoft Silverlight

J'ai fais ce moteur avant tout pour des besoins personnels et afin de me remémorer les mathématiques projectives. Réinventer la poudre ne fais quelques fois pas de mal. L'idée est surtout de fournir une dll de moins de 40ko qui permet de faire de la 3D. Celle-ci sera utilisable pour les designers à travers Blend ou dans Visual Studio via C#.  Elle concentrera très vite toutes les fonctionnalités de base réellement utiles et que nous n'avons pas  actuellement via Blend : Caméra 3D, Container 3D, Scène 3D, détection des normales et z sorting intelligent (plus malin et performant que celui actuellement proposé dans Blend). J'y ajoute une classe utilitaire facilitant l'utilisation de mathématiques projectives.

Voilà ces composants :

  1. Un conteneur de type Scene3D (hérite de Panel).
    Tous les objets placés en sont sein voient leur propriétés Projection native lockée. Ceux-ci peuvent utilisées les propriétés attachées suivantes :

    • Scene3D.LocalOffsetX
    • Scene3D.LocalOffsetY
    • Scene3D.LocalOffsetZ
    • Scene3D.GlobalOffsetX
    • Scene3D.GlobalOffsetY
    • Scene3D.GlobalOffsetZ
    • Scene3D.RotationX
    • Scene3D.RotationY
    • Scene3D.RotationZ

    Ils sont associés à une instance de type Element3D. Celle-ci est récupérable (lorsque l'événement StartUp de la scène 3d est diffusé) via une méthode d'extension ajoutées pour les instances d'UIElement (GetElement3D).

  2. Une caméra associée au conteneur Scene3D. Celle-ci offre les propriétés suivantes :
    • FieldOfView
    • Plan de clipping proche : NearPlane
    • Plan de clipping éloigné : FarPlane
    • Point de fuite (XVanishingPoint, YVanishingPoint)
    • Déplacement (OffsetXCamera, OffsetYCamera, OffsetZCamera)
    • Rotation (RotateXCamera, RotateYCamera, RotateZCamera)

Détection du changement de direction de la normale (Backface culling) et du produit scalaire via les événements NormalDirectionChanged et DotProductChanged. Ces événements sont diffusés par les instances de type Element3D.

Je suis en cours de finition d'un algorithme de tri des profondeurs. Ce moteur devrait être assez optimisé car son rendu ne repose pas sur un DispatcherTimer. Deplus, le pipeline de rendu est assez optimisé car il n'est pas récursif par défaut. Lorsqu'un seul objet est modifié, ce dernier invoque en interne une méthode RenderElement. A contrario, lorsque la scène ou la caméra sont modifiées, il devient récursif et met à jour l'ensemble des objets de la scène... A bientôt donc pour la release finale de la librairie Tweened...

Expression Studio 4 version finale disponible

Aucun commentaire

    La nouvelle version de la suite Expression Studio est dans les bacs ! Cette nouvelle release est déclinée en 3 versions :

    • Expression Studio Ultimate
    • Expression Studio Premium
    • Expression Studio Web professional

    La version Expression Web n'intègre pas le logiciel Expression Blend mais uniquement Expression Design, Web et Encoder. Si vos développements s'orientent vers Silverlight ou WPF, il vous faudra acquérir la version Premium ou Ultimate. Cette politique possède l'avantage de s'adapter aux petits budgets. Pour la version Ultimate uniquement, vous bénéficierez également de Expression Encoder Pro qui offre le support d'une plus grande variété de codecs en import comme en export. Celui-ci pourra notamment gérer de la diffusion de vidéos Smooth Streaming live ou l'encodage H.264 (la comparaison des features est ici). Autre changement de politique côté MSDN, concernant cette fois l'arrivée de numéros de série. Ceux-ci vous permettent d'installer la suite un nombre limité de fois. Il n'y a plus qu'à faire son choix...

    Design Time Resources dans Blend 4

    Aucun commentaire

    Blend 4 nous offre de nouvelles fonctionnalités et l'une d'entre elles est assez obscure de prime abord. Dorénavant, il est possible dans Expression Blend de créer des ressources uniquement utilisées au design time (au moment de la conception sous Blend ou Visual Studio). Le problème est assez banal, Il est souvent nécessaire d'affecter des ressources graphiques qui ne sont définies qu'à l'exécution. Du coup, dans l'espace de travail graphique, sous Visual Studio ou Blend, celles-ci  ne sont pas résolues puisque pas encore définies. Cela occasionne des erreurs d'accès et quelques problèmes d'affichage. Blend 4 permet maintenant de résoudre cette problématique mais la manière de procéder n'est pas très évidente. L'objectif est de créer un dictionnaire de ressource contenant une ressource ou plusieurs ressources que vous utiliserez uniquement au design time. Le première chose à faire consiste à créer un projet ainsi qu'une ressource contenue dans un dictionnaire de ressource. Un dégradé ou un solidColorBrush fera bien l'affaire (voir ci-dessous).

    Ensuite supprimez le lien contenu par App.xaml, les ressources contenues sont désormais inaccessibles et vous obtenez des erreurs d'accès. Ce n'est pas grave, il vous faut passer par cette étape. Sauvegardez le projet puis ouvrez-le à nouveau sous Blend 4, vous obtenez une jolie boîte de dialogue vous indiquant si vous souhaitez créer un dictionnaire utilisable au design time (voir ci-dessous).

    Pour finir, créez la ressource via C#, c'est cette dernière qui sera utilisée par Silverlight à l'exécution.

    Au final vous obtenez deux rendus différents. Le premier concerne le design time, le second correspond au rendu final à l'exécution utilisant la ressource instanciée lors de l'initialisation :) Du coup, le designer est complètement autonomes. Au final, ce procédé n'est pas très orthodoxe mais il est très utile. Le principe ne repose sur rien d'autre qu'une compilation conditionnelle générée au niveau du projet(.csproj). Le code suivant :

    <Page Include="Properties\DesignTimeResources.xaml">
     <Generator>MSBuild:Compile</Generator>
     <SubType>Designer</SubType>
     </Page>

    est remplacé par celui-ci :

    <Page Include="Properties\DesignTimeResources.xaml"
    Condition="'$(DesignTime)'=='true'
    OR ('$(SolutionPath)'!='' AND Exists('$(SolutionPath)')
    AND '$(BuildingInsideVisualStudio)'!='true'
    AND '$(BuildingInsideExpressionBlend)'!='true')">
     <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
     <ContainsDesignTimeResources>true</ContainsDesignTimeResources>
     </Page>
    

    Conception MVVM, l’exemple du diaporama

    3 commentaires

    Silverlight 4 et Blend 4 RC sont à peine sortis que l'on voit déjà tous les bénéfices apportés par ces derniers. Deux nouveautés ont retenues mon attention, l'amélioration du système de liaisons et le modèle de conception MVVM complètement géré dans Silverlight 4 via l'implémentation des commandes. L'objectif de cet article est de vous familiariser avec l'implémentation du modèle de conception MVVM (Modèle, Vue, Vue-Modèle) dans Silverlight 4 et de mettre en valeur les avantages apportés par le système de liaisons.

    I - Un mot sur le nouveau système de liaison

    Comme vous le savez sans doute, il est désormais possible de créer des liaisons de données entre différentes instances de DependencyObject. Auparavant, il était simplement impossible de créer une liaison de données lorsque vos objets n'héritaient pas de FrameworkElement. Dorénavant, tout ou presque est "bindable" et c'est tant mieux. Nous pouvons donc créer une liaison entre la rotation d'un RenderTransform et la propriété Value d'un Slider. Cet exemple est peut-être utile en matière de design mais pas vraiment pertinent pour un développeur. Nous montrerons donc plus loin les avantages de cette amélioration dans le cadre MVVM.

    II - Avant-propos

    Sachez tout d'abord qu'il y a de nombreuses interprétations du modèle de conception MVVM, cet article ne reflète que ma propre vision de ce pattern. C'est en partie pour cette raison que le type de projet MVVM "Silverlight MVVM Application" que l'on pouvait générer dans Blend 4 bêta a été renommé Silverlight Databound Application dans la version RC. Cela permet de ne pas figer MVVM à une seule interprétation et en même temps de dépasser le cadre de ce type de développement.

    III - Introduction à MVVM

    MVVM est un principe de conception et d'organisation qui sépare le développement d'applications RIA en trois catégories : Modèle, Vue et Vue-Modèle. De cette manière, le code et le design d'une application sont totalement découplés et il est plus facile de les faire évoluer. Concrètement le développeur mettra à disposition du designer des appels de méthodes dans Vue-Modèle qui seront  très simple à appliquer sur des composants présents dans la vue.

    L'avantage direct de cette méthodologie est de libérer le designer de toute contraintes en matière de design. Il ne se contentera pas de modifier l'aspect visuel de contrôles déjà choisis au préalable. Il pourra, au contraire, définir librement le type de contrôles, leur nom, les transitions sans avoir à se préoccuper des détails de l'implémentation.

    Nous verrons un exemple concret de ce concept.

    1 - Qu'est-ce qu'une vue ?

    Pour faire simple une vue correspond à une interface visuelle dédiée aux interactions utilisateurs. Autrement dit, c'est là que vont agir les utilisateurs, celles-ci sont constituées de trois types de choses :

    • Un arbre visuel et logique composé d'instances d'UIElement.
    • Des transitions et des animations.
    • Des comportements logiques permettant, par exemple, de piloter animations et transitions.

    2 - Une vue doit-elle contenir de la logique ?

    Ici 90% des développeurs disent non. Pour ma part, je pense qu'une vue doit contenir sa propre logique permettant de gérer ses animations et ses transitions. Dans la majorité des cas, ces tâches ne sont pas gérées par la création de code C# mais par l'utilisation de comportements (behaviors). Ainsi, il n'y a nullement besoin de code C# car les comportements répondent pleinement à cette problématique. Toute la difficulté de conception provient souvent du couplage possible existant entre la gestion des données et l'affichage. Les comportements ont également pour but de répondre à cette problématique. Ceux-ci sont donc déterminants lorsque vous concevez en mode MVVM.

    3 - Qu'est-ce que le Modèle ?

    Pour faire simple, le modèle contient les données, les mets à disposition. Le modèle gère également toute les appels distants ou opérations permettant les opérations CRUD (Create, Read, Update, Delete). Les développeurs utilisent souvent une classe statique afin d'y accéder simplement. Le modèle peut diffuser des événements si besoin pour indiquer l'état de chaque opération. Vous trouverez quelques développeurs qui verront modèle uniquement comme espace de stockage.

    4 - Qu'est-ce que Vue-Modèle ?

    C'est là le cœur du modèle de conception MVVM. Pour faire simple, Vue-Modèle est une abstraction de la vue d'un point de vue Modèle. Autrement dit, Vue-Modèle gère la liaison entre les données contenues dans le modèle et leur affichage dans la Vue. C'est donc l'intermédiaire entre Vue et Modèle.

    On m'a récemment posé la question :

    doit-on partir de Vue-Modèle ou doit concevoir d'abord la vue puis Vue-Modèle ?

    Il n'y a pas de réponse simple à cette question. Cela dépend avant tout de votre métier et vers quel type de qualité vous souhaitez tirer l'application. Souhaitez-vous obtenir une forte interactivité graphique ou une architecture propre et efficace avec un maximum de performance ? Certains pensent que les deux sont possibles mais là encore il ne faut pas se leurrer, si l'un n'impactait pas l'autre nous n'aurions qu'un seul type de projet nommé Databound Application. Plus le graphisme et les interactions sont contraignantes, plus il est difficile de fournir une architecture propre et performante en conservant les mêmes délais. Toutefois, lors de la conception d'une application, il est vivement conseillé de partir d'un prototype. La vue est ce qu'il y a de plus concret pour votre client et pour vous en tant que développeur. C'est dans la vue que sont susceptibles de s'opérer de grande modification car c'est ce que le client souhaite mettre à disposition des utilisateurs. Ce ne serait pas forcément le discours d'un spécialiste SQL mais le client n'est pas là pour comprendre des schémas de Base de donnée. Dans le cas d'applications très standards comme un lecteur Vidéo, par exemple, il est possible de concevoir Modèle-Vue en premier car les opérations que souhaite réaliser l'utilisateur seront toujours les mêmes (Lecture, Stoppe, Pause, ect...). L'abstraction des commandes est, dans ce cas, très prévisible. Nous reviendrons sur la notion de commandes plus tard.

    5 - Vue-Modèle doit-il gérer les animations et les transitions ?

    Si l'on reprend la définition de base (Vue-Modèle est une abstraction de la vue d'un point de vue Modèle), Vue-Modèle ne doit pas gérer les animations directement mais notifier la vue par n'importe quel moyen (propre et efficace) afin que celle-ci déclenche transitions et animations. Encore une fois, les comportements vont grandement nous aider dans cette tâche. Toutefois, dans le cas d'animations créées dynamiquement ou dans certaines problématiques, il arrive que l'on soit obliger de gérer les animations dans Vue-Modèle. Il faudra dans ce cas créer une classe de gestion dédiée ou utiliser des propriétés de dépendances attachées. Tant que possible et contrairement à la croyance répandues, les vues contiennent la logique permettant l'affichage des transitions et animations, c'est à ça que sert le code behind du UserControl Vue. Les comportements ne sont rien d'autres que du code logique placés dans l'arbre visuel et logique. Il n'héritent pas de UIElement mais de DependencyObject. Par défaut, le développeur n'a pas à assurer cette gestion, cela est du ressort du designer interactif dans le meilleur des cas. Cela peut toutefois être remis en cause lorsque vous rencontrez certaines problématiques de conception.

    6 - Le tout MVVM ?

    La grande question, est-ce que vous devez toujours tout concevoir en MVVM ? La réponse est non. Voici mes arguments:

    • Si c'était le cas on aurait pas différents types de projets.
    • Utiliser un seul modèle de conception est une pratique extrémiste qui ne répond pas toujours aux contraintes de temps imparties.
    • Selon la taille de vos projets et vos besoins en matière d'évolution et de changements, il n'est pas forcément utile d'utiliser MVVM car cela peut par certains côtés ajouter une touche de complexité. Par exemple, lorsque vous essaierez de créer des liaisons de données entre des collections d'objet présent dans la vue et des collections contenues dans Vue-Modèle.
    • Faire du Full MVVM relève avant tout du dogme, c'est comme si vous ne cuisiniez que des plats italiens. En bref vous passez à côté de la cuisine française, indienne, etc...
    • Plus le design et ses contraintes sont importants, plus il sera difficile de normaliser le développement. C'est l'éternel problématique du développement informatique. Le design et le développement représentent deux facettes de la production qui se lancent des défis en permanence. Pour vous en convaincre, essayez de penser le site suivant en MVVM pour toutes les pages :: www.experience159.com

    7 - Schéma récapitulatif

    Voici un schéma simple reprenant une partie de ce que nous avons exposé :

    Après cette brève introduction, nous allons nous plonger dans la conception d'une application complète en MVVM.

    IV - Un diaporama MVVM côté Vue

    Téléchargez le projet GalleryMVVM_base. Ce projet est créé sur le modèle Silverlight Databound Application.Vous remarquez tout d'abord que MainPage.xaml contient une vue formalisée par un UserControl nommé GalleryView. On peut donc envisager MainPage comme un conteneur d'agencement des vues. Un répertoire contient les UserControl symbolisant la partie Vue, un autre contient les classes correspondant à Vue-Modèle, le dernier contient toutes les classes côté Modèle gérant l'accès aux données (voir Figure ci-dessous).

    Dans GalleryView.xaml, tous nos objets sont déjà créés et designés, ce travail peut être réalisé indépendamment du développement côté C#. On considère que le développeur et le designer se sont mis d'accord sur un certain nombre de fonctionnalités listés ci-dessous :

    • Afficher / cacher l'objet interactif (bouton par exemple) Image Précédente / Image Suivante
    • Charger Image suivante / précédente
    • Récupérer l'ImageBrush de la nouvelle et de l'ancienne image chargées (cela permet de créer des transitions)
    • Afficher la pagination
    • Afficher la description, le titre et l'url de l'image en cours
    • Naviguer vers l'état "chargement en cours" ou l'état "chargement terminé"
    • Afficher la barre de progression

    Le développeur et le designer ont donc élaboré chacun de leur côté une partie du projet. Le design étant finalisé, il nous faut maintenant récupérer l'abstraction Vue-Modèle, nommée GalleryViewModel, comme contexte de données de la vue. Nous reviendrons plus tard au code de GalleryViewModel. Ajoutez l'espace de nom xmlns:local="clr-namespace:GalleryMVVM", au sein du UserControl racine de GalleryView. Nous allons déclarer une nouvelle ressource de type GalleryViewModel comme montré ci-dessous :

    Compilez l'application si besoin par un ctrl+maj+b, maintenant que nous avons instancié la Vue-Modèle comme ressource, nous pouvons facilement la définir comme contexte de données de la grille LayoutRoot comme montré ci-dessous.

    Cela n'est pas suffisant, le mieux est de créer une liaison de données car cela permet de mettre à jour la Vue quand Vue-Modèle change, et inversement ( avec liaison à deux voies). Nous remplaçons cette expression

    par celle-là :

    Rendez-vous maintenant dans le panneau Data, conservez LayoutRoot sélectionné et dépliez Data Context. Vous obtenez une liste de propriétés et de commandes correspondant au cahier des charges établi entre développeur et designer (voir ci-dessous).

    Du côté de la vue le tour est joué, il suffit de glisser déposer, les propriétés et les commandes sur les objets de l'arbre visuel et logique. Il est également possible de procéder via l'utilisation du menu DataBinding obtenu lorsque vous cliquez sur l'icône carré présente à droite de chaque propriété d'objet.

    Vous pouvez faire un simple test en glissant déposant les commandes DisplayNextPicture et DisplayPreviousPicture sur les boutons et établir une liaison entre le remplissage du Rectangle nommé  newBitmap et la propriété NewPictureIB de la Vue-Modèle. Comme vous le constater, le diaporama est entièrement designable, autrement dit, le graphiste peut choisir librement le type, l'agencement, le nom des composants ainsi que les états visuels qu'il souhaite activer. Pour glisser déposer les propriétés de la Vue-Modèle en choisissant la propriété ciblée, il suffit d'appuyer sur la touche alt en même temps que le glisser-déposer.

    V - Gérer les transitions

    Le nouveau système de liaison apporté par Silverlight 4 nous donne pas mal de souplesse lorsque l'on développe un projet en suivant ce modèle de conception. Dans ce mode de conception, on essaie de limiter au maximum le code logique de chaque vue, il est donc assez pratique d'utiliser des comportements au sein de Blend pour gérer les transitions et les animations. Nous allons utiliser le nouveau système de liaison basé applicable à l'ensemble des instances de type DependencyObject pour gérer nos comportements interactifs.

    1 - Déclencher les transitions

    C'est une des problématiques majeures lorsque l'on évoque MVVM. En premier lieu, Microsoft propose un comportement interactif nommé DataStateBehavior qui facilite cette gestion. Vous pouvez le déposer sur LayoutRoot, celui-ci est capable de déclencher une transition selon la valeur d'une propriété de Vue-Modèle. Dans notre cas, il s'agit de la propriété IsLoaded qui a pour valeur false lorsque la nouvelle image est en cours de chargement, et true lorsque celle-ci est chargée. La figure ci-dessous affiche le paramétrage du comportement.

    Concrètement, il suffit de créer une liaison entre la propriété Binding du comportement et la propriété IsLoaded de la Vue-Modèle. Lorsque la valeur attendue est égale à True alors on affiche l'état visuel Completed sinon on affiche l'état visuel Loading. Cela peut sembler étrange de mettre un T majuscule, toutefois la propriété Value est typée Object. Ainsi, bien que IsLoaded soit de type boolean, c'est sa représentation sous forme de chaîne de caractère qui est comparée par appel implicite de la méthode ToString(). Cette méthodologie a pour avantage de laisser au designer le soin de déclencher les transitions simplement.

    2 - activer ou désactiver un comportement interactif

    Dans Silverlight 3, il n'était pas possible de lier une propriété de comportement, comme IsEnabled à une propriété de la Vue-Modèle. Même si cette dernière implémentait INotifyPropertyChanged, la propriété IsEnabled n'était pas "bindable" car les comportements n'héritaient pas de FrameworkElement mais de DependencyObject. Avec le nouveau systèmes c'est désormais chose possible. Placez deux instances du comportement GotoStateAction sur chacun des deux exemplaires de bouton. Lorsque la souris survolera l'un ou l'autre, nous naviguerons vers l'état visuel RightButtonMouseOver ou LeftButtonMouseOver. Lorsque la souris quittera le survol de l'objet, nous afficherons l'état DefaultMouseLeave. La figure ci-dessous Toutefois correspond au paramétrage du bouton de droite.

    Jusque-là nous n'utilisons pas le contexte de données de la Vue-Modèle mais nous allons y remédier. Dans le scénario de base développeur et designer sont partis du principe que l'affichage d'une pagination (par exemple : image 1/6) n'est pas toujours de mise. Ainsi, cette navigation ne sera possible que dans le cas ou l'affichage de la pagination est prévue par Vue-Modèle. C'est le cas lorsque la propriété DisplayPageNumbers (de GalleryViewModel) est à true. il suffit donc d'établir une liaison de données entre IsEnabled du comportement et DisplayPageNumbers. Voici le code XAML correspondant :

    Le code est assez simple à comprendre :

    • La visibilité du bouton est liée à RightArrowVisibility de GalleryViewModel.
    • Le texte, affiché via la propriété Content, est lié à la propriété Paging de GalleryViewModel.
    • Très important, toutes les instances héritant du type ButtonBase implémentent, depuis Silverlight 4, le commanding via la propriété Command. Celle-ci permet d'exécuter des commandes (des actions de ViewModel). L'événement Click provoque l'exécution de la commande. Pour tout autre type d'événements que Click, vous pouvez utiliser le comportement nommé InvokeCommandAction.
    • Pour finir, les comportements de navigation sont activés ou désactivés par la propriété DisplayPageNumbers de GalleryViewModel.

    VI - le Diaporama côté Vue-Model

    Concernant Vue-Modèle, le développeur est sur des rails. Le code est standard et les étape sont toujours les mêmes :

    • Il est assez pratique de créer une classe de base dont toutes les classes de type Vue-Modèle hériteront. Vous pouvez l'appeler ViewModel ou ViewModelBase.
    • Cette classe doit implémenter deux interfaces : INotifyPropertyChanged et IDataErrorInfo. INotifyPropertyChanged permet de notifier la vue de tout changement de propriété. Cela permet d'utiliser le mécanisme de créer des liaisons de données qui seront rafraichies lorsque les propriétés de Vue-Modèle seront mise à jour. IDataErrorInfo est une nouvelle interface fournie par Microsoft qui permet aux vues d'afficher les erreurs levées lors d'une mauvaise affectation. Concrètement, cela est particulièrement utile lors de liaisons de données à deux voies. Dans notre cas, l'intérêt est moindre car la vue n'a pas de raison de modifier les propriétés de Vue-Modèle. Dans le cas d'un formulaire IDataErrorInfo est obligatoire car bien plus pratique à utiliser qu'une levée d'exception (via l'instruction Throw new Exception). Je vous renvoie à l'article de John Papa concernant l'implémentation de IDataErrorInfo.
    • Il est nécessaire de créer des propriétés qui seront accessibles directement depuis la vue
    • Pour finir, nous devons créer des commandes qui seront exécutées depuis la Vue. L'implémentation des commandes est également couvert par un article de John Papa que vous trouverez ici. Concrètement, il propose de créer une classe abstraite nommée DelegateCommand qui facilitera l'instanciation de ces dernières dans Vue-Modèle. Normalement, une commande correspond à un type d'objet mais cela peut-être éviter grâce à la délégation.

    1 - Les propriétés accessible au sein de la vue "Bindable"

    Pour qu'une propriété soit accessible depuis la vue, elle doit utiliser l'accesseur public. De plus, dans l'optique où celle-ci utilise le système de liaison classique, elle doit notifier la vue lorsque qu'elle est modifiée. Pour cela, il suffit d'utiliser la méthode NotifyPropertyChanged héritée de la classe ViewModel, implémentant INotifyPropertyChanged. Voici un exemple pour la propriété exemple

    2 - les commandes

    Les commandes doivent toujours faire référence à une méthode ainsi qu'à une valeur booléenne qui indique si la commande doit-être exécutée. Voici le code C# correspondant aux commandes DisplayNextPicture et DisplayPreviousPicture :

    Rien de bien compliqué, la propriété Index est affectée d'une nouvelle valeur, et notifie la vue de ce changement via le mécanisme héritée de INotifyPropertyChanged. La méthode CanDisplayPictures renvoie systématiquement true ce qui n'est pas l'idéal, vous pourrez faire certains tests à ce niveau. C'est ce que je fais pour la commande LoadAllPicture qui prend en deuxième paramètre de son constructeur le booléen renvoyé par CanLoadAllPictures :

    VII - l'application finale

    Elle est visible à cette adresse : http://www.tweened.org/wp-content/uploads/applis/diaporamaMVVM/.

    Le projet ainsi que les sources complètes sont quant à eux téléchargeables ici : http://www.tweened.org/wp-content/uploads/applis/GalleryMVVM.zip.

    Rosetta stone for Flash and Silverlight

    Aucun commentaire

      Pour mon premier poste sur Tweened, je souhaite partager avec vous un petit guide très utile pour tous les flasheurs / flexeurs qui voudraient développer en Silverlight.

      Il ce trouve ici, et référence dans une colonne les objets avec leur nom connu sous Flash / Flex, et dans l'autre, leur équivalent en Silverlight.

      Vous pouvez également cliquer sur la double flèche présente tout à droite de la ligne du composant survolé afin d'avoir accès à un descriptif un peux plus approfondit.

      En espérant que cette ressource vous soit utile.

      Olivier Destenay
      Microsoft Student Partner

      MIX jour 2, plus de détails…

      Aucun commentaire

        Voici la deuxième journée du MIX détaillée. Je passe rapidement le keynote de la deuxième journée, Internet Explorer 8 y était évoqué et Microsoft a confirmé ce que tout le monde sait déjà : IE est lent si on le compare à un Chrome, l'accent a donc été mis sur la détection et la protection des malwares et autres spywares présents sur la toile. La conférence qui a suivi était plus interessante à tous points de vue, puisqu'il s'agissait des futurs fonctionnalités apportées dans Expression Blend 3 qui présage aussi de ce qui est prévu dans l'avenir. Doug Olson en charge de la présentation a commencé par dresser un rapide récapitulatif des objectifs poursuivis par la gamme Expression : améliorer l'expérience utilisateur, la productivité et abaisser les coûts. Au sein de Blend cela se traduit par les avancés suivantes :

        • Prototypage avec SketchFlow. Voici plus d'informations sur le fonctionnement de cet outil. Chaque application de type SketchFlow est jouée au sein d'un container spécifique. Celui-ci permet d'annoter et de rajouter des propositions directement sur la maquette en cours de création. Au sein de Blend, il est ensuite possible de récupérer directement les remarques de chaque acteurs de la production grâce au panneau FeedBacks.

          sketchflowplayersmall
          Il est même possible de les exporter vers Word, dans ce cas on récupère un document Word avec un sommaire reprenant chaque page, les remarques apportées ou les ergonomie alternatives porposées. Il peut-être intéressant d'uploader l'application SketchFlow lors de chaque compilation pour partager facilement son accès et communiquer sur le projet. Un ensemble composants est disponible pour mettre en page et designer rapidement un prototype. Ceux-ci ressemblent à des croquis de composants dessinés au crayon à papier mais peuvent être personnalisés à tous moments et sont pleinement fonctionnels.

          sketchflow3small

        • Design des visuels en utilisant des données fictives ou réelles. Il est maintenant possible de générer des données aléatoires selon un schéma XML que vous pouvez définir simplement. C'est à la portée d'un graphiste web, l'idée est de choisir le nom de vos champs ainsi que le type de valeur contenue. Une fois les données fictives créées par Blend, il est possible de générer un composant Datagrid ou Listbox par un simple glisser-déposer sur la scène. Vous pouvez également directement aller chercher un fichier XML de votre choix, et ainsi travailler su des données réelles.
        • Permettre l'interactivité sans utiliser de code. Blend 3 introduit la notion de comportement. Un graphiste peut ajouter des comportements aux objets de son choix par glisser-déposer. Dans une des conférences d'aujourd'hui, Microsoft a démontré ce concept en ajoutant une gravité, des pivots et tout un moteur physique. Le graphiste définit une gravité, une friction des éléments solides (l'équivalent de RigidBody en 3D) et hop une balle rebondit, percute un jeu de quilles, etc... Le deuxième exemple permettait de détecter un mouvement spécifique de la souris. Le designer dessine un tracé directement dans le panneau propriété. Par la suite, si ce mouvement est détecté à l'exécution détecté, on peut déclencher une animation, une modification de valeur ou n'importe quelle méthode de son choix.
        • Code source des composants disponible. Tous les composants sont ouverts à la modification et à l'extension grâce au code source qui est fourni. Si vous êtes codeurs et que vous souhaitez modifier le comportement de tel ou tel composant, vous n'avez plus à réinventez la poudre. Cela permet également de se familiariser avec des APIs propres au framework Silverlight (je pense notamment au Silverlight Layout System).

        Entre chaque conférence, un jeu concours était organisé autour de rockBand, ceux qui font le plus de points reparte avec des lots de folie :)

        img_0242

        img_0241Une conférence était organisée sur le C# pour les designers mais très franchement, vous trouverez l'équivalent sur Tweened grâce à la Web Tv. Nous avons tous fini la soirée dans une boîte branchée du Palacio. Il intéressant de noter que Mike Chambers, avec qui j'ai pu m'entretenir, était présent lors de la soirée au Tao Club et à de nombreuses conférences.

        Silverlight 3, Blend 3 et Prototyping with SketchFlow

        1 commentaire

          Depuis ce matin, 9h00 à Las vegas, Scott Guthrie, Bill Buxton, Jonathan Harris et Joanna Mason dévoilent une grande partie des nouvelles fonctionnalités offerte par Silverlight 3 et Expression Blend 3 (désormais téléchargeables). Bill Buxton, directeur de recherche en charge à Microsoft research a commencé par sensibiliser le public (essentiellement composé de développeurs) à la nécessité de concevoir un design et une ergonomie performante. Ce qui paraît évident depuis de nombreuses années pour bon nombre d'acteurs du Web. Son objectif fut surtout de démontrer le rôle central, dans la chaîne de production, occupé par les designers interactifs et autres intégrateurs. De son point de vue, il est nécessaire que le design d'application puissent être envisagé de manière souple, dynamique et vivante. C'est le nouvel outil de prototyping proposé par Expression Blend montré ci-dessous : SketchFlow qui répond à ce besoin.

          C'est Jonathan Harris qui a fait la démonstration de cette nouvelle fonctionnalité. Très franchement, ce module ajouté à Blend est vraiment prometteur en terme de conception et de prototypage. Il permet de designer les interfaces utilisateur simplement, de les relier en elles par des liens logiques puis de transformer simplement une maquette fonctionnelle en applications prête à être déployée. Outre cette importante fonctionnalité qui n'est d'ailleurs pas comprise dans la version d'essai proposée au téléchargement, voici toutes celles évoquées durant les conférences du MIX (je ne les cite pas toutes pour des raisons de confidentialité) :

          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 ne pas utiliser n'importe comment car comme pour Flash, l'objectif ici est d'utiliser le processeur de la carte graphique uniquement pour les rendus très demandeurs en processeurs. Pour la vidéo 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.
          -Le poids du lecteur Silverlight 3 : 40 kilos octets de moins que sl2.

          Blend 3

          -Joanna Mason nous a fait une démonstration de l'importation de fichiers Photohop et Illustrator (PSD, AI). Les vecteurs sont proprement exportée dans les deux formats sous forme d'arborescences. Les masques photoshop sont également récupérés et éditables sous Blend. Au final Blend génère le XAML correspondant à vos besoins.
          -Intellisense XAML, C#, VB. Plus besoin d'installer Visual Studio, Blend devient un outil autonome :) Pour les développers pures souche, rien ne vaudra Visual Studio et son débogueur.
          -Outils dégradé. Les graphistes vont être content, l'outil de gestion des dégradés a été largement amélioré et propose une ergonomie performantet. C'est assez difficile à décrire mais il permet de personnaliser le dégradé directement dans la vue de design.
          -Equations de mouvements. Les fonctions d'accélération comme celle proposées par Robert Penner sont maintenant directement intégrées au niveau des objets d'animations (StoryBoards et DoubleAnimation). Un nouveau panneau permet de configurer simplement chaque clé d'animation et de lui associer une équation. Par exemple, vous pouvez ajouter une animation de rebond et préciser ses paramêtres : nombre de rebonds,  facteur de rebond, etc...
          -Liaison de propriété d'instances. Outre les liaisons de donnée et de modèle déjà présente, on peut désormais directement lier la valeur d'une propriété d'objet à une autre en mode OneWay, TwoWay ou OneTime. Tout cela est directement réalisable par le graphiste de manière simple.
          -Créer des composants à partir d'éléments visuels simples. Blend propose désormais la possibilité de créer des composants à partir d'élements graphiques existants et introduit la notion de controlParts (un nouveau panneau est désormais accessible. Vous pouvez cliquer-droit sur un élément graphique ou logique et simplement le définir comme étant une partie du composant en choisissant dans une liste pré-définie. Il adoptera dans ce cas, le comportement logique associé à la partie du composant sélectionnée.

          Voilà c'est tout pour le moment mais je pense que cela vous donnera une idée plus juste des capacités qu'affiche désormais Silverlight. Reste à voir les versions finales produits et à tester tout ça...

          Enfin un livre sur Expression Blend

          Aucun commentaire

            Salut à tous,

            il aura fallut beaucoup de travail et de pugnacité de la part de ma compatriote et amie Aude Mousset pour enfin voir la sortie de ce livre tant attendu par la communauté. J'ai eu la bonne surprise de recevoir ce livre en provenance directe de Dunod et je confirme que si vous êtes graphiste et que vous vous lancez dans le design d'applications WPF, ce livre sera un must dans votre Bibliothèque. Pour faire court, Aude y relate l'ensemble des techniques mises à disposition par Expression Blend et Expression Design pour créer des interfaces à la fois souples, ergonomiques et très efficaces. Pour les impatients, l'auteur ( Audounette ) m'a précisé que la prochaine version du livre intègrera les projets Silverlight 2. Néanmoins le livre tel qu'il est actuellement construit, présente déjà l'avantage de donner une approche du workflow, des avantages de la technologie et vous familiarisera avec l'ensemble des projets .NET (Silverlight 1 - 2 & WPF). Voici un petit lien vers le livre et vers le blog de Aude. Bravo donc à Aude :)

            Animer avec Tweened et Silverlight 2

            1 commentaire

              Salut à tous,

              je travaille en ce moment sur un certain nombre de tutoriaux videos concernant Silverlight 2. Celui-ci est le premier d'une série de 15, les autres tutoriaux seront également disponibles sur FlashXpress.net. Vous y apprendrez l'utilisation de la librairie Tweened, le modèle de document Visual Studio 2008 contenant une intégration Javascript ainsi qu'une méthode pour déclencher les tweens via c#.

              This movie requires Flash Player 9

              Thanks to Scott – Blend 2.5 june preview

              2 commentaires

                Silverlight 2 Bêta 2Cela fait maintenant une semaine que les nouvelles versions de Blend 2.5 (June Preview) et de Silverlight 2 bêta 2 sont en ligne. Scott Guthrie, l'un des principaux acteurs sur la technologie Silverlight, a écrit et propose des tutoriaux sur son site, merci donc à Scott car plusieurs changements importants bénéfiques pour la communautés ont eu lieu et faciliteront la vie aux graphistes. Pour ma part, je mets du même coup à jour la page concernant les pré-requis Silverlight 2 ici. Ainsi que le nouveau Modèle de document pour Silverlight 2 bêta 2 comprenant du code logique Javascript et la librairie Tweened mise à jour ici.

                Voici certaines nouveautés et changements que je trouve important :

                • Tout d'abord la manière dont sont chargés les composants, dans Silverlight 2 bêta 2 et pour la version finale, le package System.Windows.Controls a été fusionné avec System.Windows. Ne vous inquiétez pas, si vous avez d'ancien projet SL 2 bêta 1, Visual Studio les identifiera et fera une mise à jour de votre projet.
                • Changement complet au niveau des sockets. Il faudra désormais spécifier sur les serveurs souhaitant accorder un accès à une application Silverlight un fichier crossdomain.xml permettant les échanges. Il est à noter qu'on arrive exactement aux mêmes types de contraintes qu'avec le dernière mise à jour du player Flash.
                • Nouvelles propriétés DefaultStyleKey pour définir des styles de composant au sein de leur code Xaml.
                • La classe WebClient a changé de package et fait désormais partie du package System.Net. De plus, afin de coller au plus près du Design Pattern "AppelAsynchrone", la gestion des erreurs de sécurité ne se fait plus du côté de l'appel mais bien du côté de la réception des données.
                • Changement radical concernant les Styles et les Templates puisqu'il est désormais possible de modifier le look des controls / composants au sein de Blend 2.5 June Preview. On se retrouve presque à égalité, si l'on compare avec la souplesse des projets WPF. Il ne manque plus que les dictionnaires de ressources et les pinceaux vectoriels. :) Tout cela ne devrait pas trop tarder, on espère pour la version 3 de Silverlight.
                • Introduction d'un nouveau gestionnaire d'état visuel, le Visual State Manager. Il est à noter que l'implémentation de ce manager concerne aujourd'hui Silverlight 2 mais impactera prochainement les projets WPF. Voilà une capture pour vous donner une idée de la bête :) . Pour ma part je l'ai essayé et je trouve ça très souple d'utilisation, le concept est assez novateur. Visual State Manager

                Next Page »