<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Dot.Blog</title>
    <description>C#, Visual Studio, Linq, Silverlight, WPF...</description>
    <link>http://www.e-naxos.com/Blog/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>fr-FR</language>
    <blogChannel:blogRoll>http://www.e-naxos.com/Blog/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>odahan@gmail.com</dc:creator>
    <dc:title>Dot.Blog</dc:title>
    <geo:lat>4,562.000000</geo:lat>
    <geo:long>-103.000000</geo:long>
    <geo:lat>45.62</geo:lat><geo:long>-1.03</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-nc-nd/2.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/OD/dotblog" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>C# 4.0 : les nouveautés du langage</title>
      <description>&lt;p&gt;Visual Studio 2010 beta 2 est maintenant accessible au public et il devient donc possible de vous parler des nouveautés sans risque de violer le NDA qui courrait jusqu’à lors pour les MVP et autres early testers de ce produit.&lt;/p&gt;  &lt;p&gt;Les évolutions du langage commencent à se tasser et la mouture 4.0 est assez loin des annonces fracassantes qu’on a pu connaître avec l’arrivée des génériques ou des classes statiques et autres nullables de C# 2.0, ni même avec LINQ ou les expressions Lambda de C# 3.0.&lt;/p&gt;  &lt;p&gt;Pour la version 4 du langage on compte pour l’instant peu d’ajouts (le produit ne sortira qu’en 2010 et que d’autres features pourraient éventuellement apparaître). On peut regrouper les 3 principales nouveautés ainsi :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Les type dynamiques (dynamic lookup)&lt;/li&gt;    &lt;li&gt;Les paramètres nommés et les paramètres optionnels&lt;/li&gt;    &lt;li&gt;Covariance et contravariance &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Paramètres optionnels&lt;/h2&gt;  &lt;p&gt;Il est en réalité bien étrange qu’il ait fallu attendre 4 versions majeures de C# pour voir cette syntaxe de Delphi refaire surface tellement son utilité est évidente.    &lt;br /&gt;De quoi s’agit-il ?&amp;#160; Vous avez tous écrits du code C# du genre :&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;MaMethode(typeA param1, typeB param2, typeC param3) …; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;MaMethode(typeA param1, typeB param2) { MaMethode(param1, param2, &lt;span class="kwrd"&gt;null&lt;/span&gt;) } &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;MaMethode(typeA param1) { MaMethode(param1, &lt;span class="kwrd"&gt;null&lt;/span&gt;) } &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;MaMethode() { MaMethode(&lt;span class="kwrd"&gt;null&lt;/span&gt;) }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Et encore cela n’est qu’un exemple bien court. Des librairies entières ont été écrites en C# sur ce modèle afin de permettre l’appel à une même méthode avec un nombre de paramètres variable. Le Framework lui-même est écrit comme cela. 
  &lt;br /&gt;Bien sûr il existe “&lt;font face="Courier New"&gt;params&lt;/font&gt;” qui autorise dans une certaine mesure une écriture plus concise, mais dans une certaine mesure seulement. Dans l’exemple ci-dessus le remplacement des valeurs manquantes par des &lt;font face="Courier New"&gt;nulls&lt;/font&gt; est une simplification. Dans la réalité les paramètres ne sont pas tous des objets ou des nullables. Dans ces cas là il faut spécifier des valeurs bien précises aux différents paramètres omis. Chaque valeur par défaut se nichant dans le corps de chacune des versions de la méthode, pour retrouver l’ensemble de ceux-ci il faut donc lire toutes les variantes et reconstituer de tête la liste. Pas très pratique.&lt;/p&gt;

&lt;p&gt;Avec C# 4.0 cette pratique verbeuse et inefficace prend fin. Ouf ! 
  &lt;br /&gt;Il est donc possible d’écrire une seule version de la méthode comme cela :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;MaMethode(&lt;span class="kwrd"&gt;bool&lt;/span&gt; param1=&lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt; param2=25, MonEnum param3 = MonEnum.ValeurA)  …&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Grâce à cette concision l’appel à “&lt;font face="Courier New"&gt;MaMethode(true)&lt;/font&gt;” sera équivalente à “&lt;font face="Courier New"&gt;MaMethode(true, 25, MonEnum.ValeurA)”&lt;/font&gt;. Le premier paramètre est fixé par l’appelant (c’est un exemple), mais les deux autres étant oubliés ils se voient attribuer automatiquement leur valeur par défaut.&lt;/p&gt;

&lt;p&gt;Pas de surcharges inutiles de la méthode, toutes les valeurs par défaut sont accessibles dans une seule déclaration. Il reste encore quelques bonnes idées dans Delphi que Anders pourraient reprendre comme les indexeurs nommés ou les if sans nécessité de parenthèses systématiques. On a le droit de rêver :-)&lt;/p&gt;

&lt;p&gt;Comme pour se faire pardonner d’avoir attendu 4 versions pour ressortir les paramètres par défaut de leur carton, C# 4.0 nous offre un petit supplément : &lt;/p&gt;

&lt;h2&gt;Les paramètres nommés&lt;/h2&gt;

&lt;p&gt;Les paramètres optionnels c’est sympa et pratique, mais il est vrai que même sous Delphi il restait impossible d’écrire du code tel quel “&lt;font face="Courier New"&gt;MaMethode(true,,MonEnum.ValeurA)&lt;/font&gt;”. En effet, tout paramètre doit recevoir une valeur et les paramètres “sautés” ne peuvent être remplacés par des virgules ce qui rendrait le code totalement illisible. C# 4.0 n’autorise pas plus ce genre de syntaxe, mais il offre la possibilité de ne préciser que quelques uns des paramètres optionnels en donnant leur nom.&lt;/p&gt;

&lt;p&gt;La technique est proche de celle utilisée dans les initialiseurs de classe qui permettent d’appeler un constructeur éventuellement sans paramètre et d’initialiser certaines propriétés de l’instance en les nommant. Ici c’est entre les parenthèses de la méthode que cela se jouera. Pour suivre notre exemple précédent, si on veut ne fixer que la valeur de “&lt;font face="Courier New"&gt;param3&lt;/font&gt;” il suffit d’écrire :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;MaMethode(param3 : MonEnum.ValeurZ); &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;de même ces syntaxes seront aussi valides :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;MaMethode(&lt;span class="kwrd"&gt;true&lt;/span&gt;,param3:MonEnum.ValeurX); &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;MaMethode(param3:MonEnum.ValeurY,param1:&lt;span class="kwrd"&gt;false&lt;/span&gt;); &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;En effet, l’ordre n’est plus figé puisque les noms lèvent toute ambigüité. Quant aux paramètres omis, ils seront remplacés par leur valeur par défaut.&lt;/p&gt;

&lt;p&gt;Voici donc une amélioration syntaxique qui devrait simplifier beaucoup le code de nombreuses librairies, à commencer par le Framework lui-même !&lt;/p&gt;

&lt;h2&gt;Dynamique rime avec Polémique&lt;/h2&gt;

&lt;p&gt;Autre nouveauté de C# 4.0, les types dynamiques. Aie aie aie…&lt;/p&gt;

&lt;p&gt;Dynamique. C’est un mot qui fait jeune, sautillant, léger. Hélas. Car cela ne laisse pas présager du danger que représente cette extension syntaxique ! La polémique commence ici et, vous l’aurez compris, je ne suis pas un fan de cette nouveauté :-)&lt;/p&gt;

&lt;p&gt;Techniquement et en deux mots cela permet d’écrire “&lt;font face="Courier New"&gt;MaVariable.MethodeMachin()&lt;/font&gt;” sans être sûr que l’instance pointée par &lt;font face="Courier New"&gt;MaVariable&lt;/font&gt; supporte la méthode &lt;font face="Courier New"&gt;MethodeMachin()&lt;/font&gt;. Et ça passe la compilation sans broncher. Si çà pète à l’exécution, il ne faudra pas venir se plaindre. Le danger du nouveau type “dynamic” est bien là. Raison de mes réticences…&lt;/p&gt;

&lt;p&gt;Si on essaye d’être plus positif il y a bien sûr des motivations réelles à l’implémentation des dynamiques. Par exemple le support par .NET des langages totalement dynamiques comme Python et Ruby (les dynamique de C# 4 s’appuient d’ailleurs sur le DLR), même si ces langages sont plus des gadgets amusants que l’avenir du développement (avis personnel). Les dynamiques simplifient aussi l’accès aux objets COM depuis IDispatch, mais COM n’est pas forcément non plus l’avenir de .NET (autre avis personnel). &lt;/p&gt;

&lt;p&gt;Les deux autres emplois des dynamiques qui peuvent justifier leur existence sont l’accès simplifié à des types .NET au travers de la réflexion (pratique mais pas indispensable) ou bien des objets possédant une structure non figée comme les DOM HTML (pratique mais à la base de pas mal de code spaghetti).&lt;/p&gt;

&lt;p&gt;Bref, les dynamiques ça peut être utile dans la pratique, mais ce n’est pas vraiment une nouvelle feature améliorant C# (comme les autres ajouts jusqu’à maintenant). Le danger de supporter un tel type est-il compensé par les quelques avantages qu’il procure ? C’est là que dynamique rime avec polémique ! 
  &lt;br /&gt;Pour moi la réponse est non, mais je suis certain que ceux qui doivent jongler avec du COM ou des DOM Html penseront le contraire. &lt;/p&gt;

&lt;p&gt;J’arrête de faire le grognon pour vous montrer un peu mieux la syntaxe. Car malgré tout le dynamisme n’est pas une invitation au chaos. Enfin si. Mais un chaos localisé. C’est à dire que l’appel à une méthode non existante reste impossible partout, sauf pour un objet déclaré avec le nouveau type “&lt;font face="Courier New"&gt;dynamic&lt;/font&gt;” :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;dynamic x; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;x = Machin.ObtientObjetDynamique(); &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;x.MethodeA(85); &lt;span class="rem"&gt;// compile dans tous les cas&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;dynamic z = 6; &lt;span class="rem"&gt;// conversion implicite &lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; i = z; &lt;span class="rem"&gt;// sorte de unboxing automatique&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Bien entendu le “dynamisme” est total : cela fonctionne sur les appels de méthodes autant que sur les propriétés, les délégués, les indexeurs, etc.&lt;/p&gt;

&lt;p&gt;Le compilateur va avoir pour charge de collecter le maximum d’information sur l’objet dynamique utilisé (comment il est utilisé, ses méthodes appelées…), charge au runtime du Framework de faire le lien avec la classe de l’instance qui se présentera à l’exécution. C’est du late binding avec tout ce qui va avec notamment l’impossibilité de contrôler le code à la compilation.&lt;/p&gt;

&lt;p&gt;A vous de voir, mais personnellement je déconseille fortement l’utilisation des dynamiques qui sont comme un gros interrupteur ajouté en façade de C# “Langage Fortement On/Off”. Restez dans le mode “On” et ne passez jamais en mode “Off” !&lt;/p&gt;

&lt;h2&gt;Covariance et Contravariance ou le retour de l’Octothorpe&lt;/h2&gt;

&lt;p&gt;J’adore le jargon de notre métier. “Comment passer pour un hasbeen en deux secondes à la machine à café” est une mise en situation comique que j’utilise souvent, certainement influencé par mon passé dans différentes grosses SSII parisiennes et par la série Caméra Café de M6… 
  &lt;br /&gt;Ici vous aurez l’air stupide lorsque quelqu’un lancera “Alors t’en penses quoi de la contravariance de C#4.0 ?”… L’ingé le plus brillant qui n’a pas lu les blogs intéressants la veille sera dans l’obligation de plonger le nez dans son café et de battre en retraire piteusement, prétextant un truc urgent à finir… &lt;/p&gt;

&lt;p&gt;Covariance et contravariance sont des termes académiques intimidants. Un peu comme si on appelait C# “C Octothorpe”. On aurait le droit. &lt;a href="http://monsu.desiderio.free.fr/atelier/croisillon.html" target="_blank"&gt;Octothorpe&lt;/a&gt; est l’un des noms du symbole #. Mais franchement cela serait moins sympathique que “do dièse” (C# est la notation de do dièse en américain, à condition de prononcer le # comme “sharp” et non “square” ou “octothorpe”).&lt;/p&gt;

&lt;h3&gt;Un support presque parfait sous C# 1 à 3&lt;/h3&gt;

&lt;p&gt;Un peu comme monsieur Jourdain faisait de la prose sans le savoir, la plupart d’entre nous a utilisé au moins la covariance en C# car il s’agit de quelque chose d’assez naturel en programmation objet et que C# le supporte pour la majorité des types. D’ailleurs la covariance existe depuis le Framework 2.0 mais pour certains cas (couverts par C# 4.0) il aurait fallu émettre directement du code IL pour s’en servir.&lt;/p&gt;

&lt;p&gt;C# 4.0 n’ajoute donc aucune nouvelle fonctionnalité ou concept à ce niveau, en revanche il comble une lacune des versions 1 à 3 qui ne supportaient pas la covariance et la contravariance pour les délégués et les interfaces dans le cadre de leur utilisation avec les génériques. Un cas bien particulier mais devant lequel on finissait pas tomber à un moment ou un autre.&lt;/p&gt;

&lt;h3&gt;Un besoin simple&lt;/h3&gt;

&lt;p&gt;C# 4.0 nous assure simplement que les choses vont fonctionner comme on pourrait s’y attendre, ce qui n’était donc pas toujours le cas jusqu’à lors. &lt;/p&gt;

&lt;p&gt;Les occasions sont rares où interfaces et délégués ne se comportent pas comme prévu sous C#, très rares. Mais cela peut arriver. Avec C# 4.0 ce sont ces situations rares qui sont supprimées. De fait on pourrait se dire qu’il n’y a rien à dire sur cette nouveauté de C# 4.0 puisqu’on utilisait la covariance et la contravariance sans s’en soucier et que la bonne nouvelle c’est qu’on va pouvoir continuer à faire la même chose !&lt;/p&gt;

&lt;p&gt;Mais s’arrêter là dans les explications serait un peu frustrant.&lt;/p&gt;

&lt;h3&gt;Un exemple pour mieux comprendre&lt;/h3&gt;

&lt;p&gt;Supposons&amp;#160; les deux classes suivantes :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Animal{ } &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Chien: Animal{ } &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;La seconde classe dérive de la première. Imaginons que nous écrivions maintenant un délégué définissant une méthode retournant une instance d’un type arbitraire :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;delegate&lt;/span&gt; T MaFonction&amp;lt;T&amp;gt;();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Pour retourner une instance de la classe &lt;font face="Courier New"&gt;Chien&lt;/font&gt; nous pouvons écrire :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;MaFonction&amp;lt;Chien&amp;gt; unChien = () =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Chien();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Vous noterez l’utilisation d’une expression Lambda pour définir le délégué. Il s’agit juste d’utiliser la syntaxe la plus concise. On pourrait tout aussi bien définir d’abord une fonction retournant un &lt;font face="Courier New"&gt;Chien&lt;/font&gt;, lui donner un nom, puis affecter ce dernier à la variable “&lt;font face="Courier New"&gt;unChien&lt;/font&gt;” comme dans le code ci-dessous : &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Chien GetChien()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Chien();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;MaFonction&amp;lt;Chien&amp;gt; unChien = GetChien; // sans les () bien sur !&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Partant de là, il est parfaitement naturel de se dire que le code suivant est valide :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;MaFonction&amp;lt;Animal&amp;gt; animal = unChien;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;En effet, la classe &lt;font face="Courier New"&gt;Chien&lt;/font&gt; dérivant de &lt;font face="Courier New"&gt;Animal&lt;/font&gt;, il semble légitime de vouloir utiliser le délégué de cette façon. Hélas, jusqu’à C# 3.0 le code ci-dessus ne compile pas.&lt;/p&gt;

&lt;h3&gt;La Covariance&lt;/h3&gt;

&lt;p&gt;La covariance n’est en fait que la possibilité de faire ce que montre le dernier exemple de code. C# 4.0 introduit les moyens d’y arriver en introduisant une nouvelle syntaxe. Cette dernière consiste tout simplement à utiliser le mot clé “&lt;em&gt;out&lt;/em&gt;” dans la déclaration du délégué:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;delegate&lt;/span&gt; T MaFonction&amp;lt;&lt;span class="kwrd"&gt;out&lt;/span&gt; T&amp;gt;();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Le mot clé “&lt;em&gt;out&lt;/em&gt;” est déjà utilisé en C# pour marquer les paramètres de sortie dans les méthodes. Mais il s’agit bien ici d’une utilisation radicalement différente. Pourquoi “&lt;em&gt;out&lt;/em&gt;” ? Pour marquer le fait que le paramètre sera utilisé en “sortie” de la méthode.&lt;/p&gt;

&lt;p&gt;La covariance des délégués sous C# 4.0 permet ainsi de passer un sous-type du type attendu à tout délégué qui produit en sortie (out) le type en question.&lt;/p&gt;

&lt;p&gt;Si vous pensez que tout cela est bien compliqué, alors attendez deux secondes que je vous parle de contravariance !&lt;/p&gt;

&lt;h3&gt;La Contravariance&lt;/h3&gt;

&lt;p&gt;Si la covariance concerne les délégués et les interfaces utilisés avec les types génériques dans le sens de la sortie (&lt;em&gt;out&lt;/em&gt;), et s’il s’agit de pouvoir utiliser un sous-type du type déclaré, ce qui est très logique en POO, la contravariance règle un problème inverse : autoriser le passage d’un super-type non pas en sortie mais en entrée d’une méthode.&lt;/p&gt;

&lt;h3&gt;Un exemple de contravariance&lt;/h3&gt;

&lt;p&gt;Pas de panique ! un petit exemple va tenter de clarifier cette nuance :&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Action1&amp;lt;&lt;span class="kwrd"&gt;in&lt;/span&gt; T&amp;gt;(T a);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;Action1&amp;lt;Animal&amp;gt; monAction = (animal) =&amp;gt; { Console.WriteLine(animal); };&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;Action1&amp;lt;Chien&amp;gt; chien1 = monAction;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Bon, ok. Paniquez. !!!&lt;/p&gt;

&lt;p&gt;Ici un délégué est défini comme une méthode ayant un paramètre de type arbitraire. Le mot clé “&lt;em&gt;in&lt;/em&gt;” remplace “&lt;em&gt;out&lt;/em&gt;” de la covariance car le paramètre concerné est fourni en entrée de la méthode (&lt;em&gt;in&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;La plupart des gens trouve que la contravariance est moins intuitive que la covariance, et une majorité de développeurs trouve tout cela bien complexe. Si c’est votre cas vous êtes juste dans la norme, donc pas de complexe :-)&lt;/p&gt;

&lt;p&gt;La contravariance se définit avec le mot clé “&lt;em&gt;in&lt;/em&gt;” simplement parce que le type concerné est utilisé comme paramètre d’entrée. Encore une fois cela n’a rien à voir avec le sens de “in” dans les paramètres d’entrée des méthodes. Tout comme “out” le mot clé “in” est utilisé ici dans un contexte particulier, au niveau de la déclaration d’un type générique dans un délégué.&lt;/p&gt;

&lt;p&gt;Avec la contravariance il est donc possible de passer un super-type du type déclaré. Cela semble contraire aux habitudes de la POO (passer un sous-type d’un type attendu est naturel mais pas l’inverse). En réalité la contradiction n’est que superficielle. Dans le code ci-dessus on s’aperçoit qu’en réalité “monAction” fonctionne avec n’importe quelle instance de “Animal”, un Chien étant un Animal, l’assignation est parfaitement légitime !&lt;/p&gt;

&lt;h3&gt;M’sieur j’ai pas tout compris !&lt;/h3&gt;

&lt;p&gt;Tout cela n’est pas forcément limpide du premier coup, il faut l’avouer. &lt;/p&gt;

&lt;p&gt;En réalité la nouvelle syntaxe a peu de chance de se retrouver dans du code “de tous les jours”. En revanche cela permet à C# de supporter des concepts de programmation fonctionnelle propres à F# qui, comme par hasard, est aussi fourni de base avec .NET 4.0 et Visual Studio 2010. Covariance et contravariance seront utilisées dans certaines librairies et certainement dans le Framework lui-même pour que, justement, les délégués et les interfaces ainsi définis puissent être utilisés comme on s’y attend. La plupart des développeurs ne s’en rendront donc jamais compte certainement… En revanche ceux qui doivent écrire des librairies réutilisables auront tout intérêt à coder en pensant à cette possibilité pour simplifier l’utilisation de leur code.&lt;/p&gt;

&lt;h3&gt;Et les interfaces ?&lt;/h3&gt;

&lt;p&gt;Le principe est le même. Et comme je le disais la plupart des utilisations se feront dans des librairies de code, comme le Framework l’est lui-même. Ainsi, le Framework 4.0 définit déjà de nombreuses interfaces supportant covariance et contravariance. IEnumerable&amp;lt;T&amp;gt; permet la covariance de T, IComparer&amp;lt;T&amp;gt; supporte la contravariance de T, etc. Dans la plupart des cas vous n’aurez donc pas à vous souciez de tout cela.&lt;/p&gt;

&lt;h3&gt;Lien&lt;/h3&gt;

&lt;p&gt;La documentation est pour l’instant assez peu fournie, et pour cause, tout cela est en bêta ne l’oublions pas. Toutefois la sortie de VS2010 et de .NET 4.0 est prévue pour Mars 2010 et le travail de documentation a déjà commencé sur MSDN. Vous pouvez ainsi vous référer à la série d’articles sur MSDN : &lt;a href="http://msdn.microsoft.com/en-us/library/dd799517(VS.100).aspx" target="_blank"&gt;Covariance and Contravariance&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Les nouveautés de C# 4.0, qui peuvent toujours changer dans l’absolu puisque le produit est encore en bêta, ne sont pas à proprement parler des évolutions fortes du langage. On voit bien que les 3 premières versions ont épuisé le stock de grandes nouveautés hyper sexy comme les génériques ou Linq qui ont modifié en profondeur le langage et décuplé ses possibilités.&lt;/p&gt;

&lt;p&gt;C# 4.0 s’annonce comme une version mature et stable, un palier est atteint. les nouveautés apparaissent ainsi plus techniques, plus “internes” et concernent moins le développeur dans son travail quotidien.&lt;/p&gt;

&lt;p&gt;Une certaine convergence avec F# et le DLR pousse le langage dans une direction qui ouvre la polémique. Je suis le premier a resté dubitatif sur l’utilité d’une telle évolution surtout que la sortie de F# accompagnera celle de C# 4.0 et que les passionnés qui veulent à tout prix coder dans ce style pourront le faire à l’aide d’un langage dédié. Mélanger les genre ne me semble pas un avantage pour C#.&lt;/p&gt;

&lt;p&gt;C# est aujourd’hui mature et il est peut-être temps d’arrêter d’y toucher… 
  &lt;br /&gt;L’ensemble .NET est d’ailleurs lui-même arrivé à un état de complétude qu’aucun framework propriétaire et cohérent n’avait certainement jamais atteint.

  &lt;br /&gt;.NET a tout remis à plat et à repousser les limites sur tous les fronts.&lt;/p&gt;

&lt;p&gt;On peut presque affirmer que .NET est aujourd’hui “complet”. Même si la plateforme va encore évoluer dans l’avenir. Mais tous les grands blocs sont présent, des communications à la séparation code / IHM, des workflows aux interfaces graphiques et multitouch, de LINQ au Compact Framework.&lt;/p&gt;

&lt;p&gt;Quand un système arrive à un haut niveau de stabilité, le prochain est déjà là, sous notre nez mais on le sait pas. Le palier atteint par .NET 4.0 marque une étape importante. Cet ensemble a coûté cher, très cher à développer. Il s’installe pour plusieurs années c’est une évidence (et une chance !). Mais on peut jouer aux devinettes : quelle sera la prochaine grande plateforme qui remplacera .NET, quel langage remplacera C# au firmament des langages stars pour les développeurs dans 10 ans ?&lt;/p&gt;

&lt;p&gt;Bien malin celui qui le devinera, mais il est clair que tout palier de ce type marque le sommet d’une technologie. De quelle taille est le plateau à ce sommet ? Personne ne peut le prédire, mais avec assurance on peut affirmer qu’après avoir grimpé un sommet, il faut le redescendre. Quelle sera la prochaine montagne à conquérir ? Il y aura-t-il un jour un .NET 10 ou 22 ou bien quelque chose d’autre, de Microsoft ou d’un autre éditeur, l’aura-t-il supplanté ? &lt;/p&gt;

&lt;p&gt;C’est en tout cas une réalité qui comme l’observation des espaces infinis qu’on devine dans les clichés de Hubble laisse songeur…&lt;/p&gt;

&lt;p&gt;Rêver bien, mais surtout et pour les dix ans à venir : Stay Tuned !&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/IqI8TBnfAEI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/IqI8TBnfAEI/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/11/10/C-40-les-nouveautes-du-langage.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=47111ad4-217f-44dd-aff5-256ba100d3c4</guid>
      <pubDate>Tue, 10 Nov 2009 05:25:55 +0200</pubDate>
      <category>Articles</category>
      <category>C#</category>
      <category>Visual Studio</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=47111ad4-217f-44dd-aff5-256ba100d3c4</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=47111ad4-217f-44dd-aff5-256ba100d3c4</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/11/10/C-40-les-nouveautes-du-langage.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=47111ad4-217f-44dd-aff5-256ba100d3c4</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=47111ad4-217f-44dd-aff5-256ba100d3c4</feedburner:origLink></item>
    <item>
      <title>Quelques conseils de design (UserControl, Blend, Visual State manager, Silverlight / WPF)</title>
      <description>&lt;p&gt;
L&amp;rsquo;une des avanc&amp;eacute;es les plus int&amp;eacute;ressantes introduite dans Silverlight 2 (puis reprise sous WPF et naturellement sous Silverlight 3) est tr&amp;egrave;s certainement le &lt;a href="http://msdn.microsoft.com/fr-fr/library/system.windows.visualstatemanager(VS.95,loband).aspx" target="_blank"&gt;Visual State Manager&lt;/a&gt;. Gestionnaire des &amp;eacute;tats visuels simplifiant la conception visuelle des contr&amp;ocirc;les (UserControl). Bien utiliser le VSM, outre de rendre plus simple la repr&amp;eacute;sentation des &amp;eacute;tats visuels d&amp;rsquo;un composant, apporte aussi une clarification essentielle &amp;agrave; la gestion des transitions entre ces derniers. 
&lt;/p&gt;
&lt;h2&gt;Etats et transitions&lt;/h2&gt;
&lt;p&gt;
Un contr&amp;ocirc;le peut &amp;ecirc;tre ou non visuel. Un &lt;font face="Courier New"&gt;Timer&lt;/font&gt; n&amp;rsquo;est pas visuel. Une &lt;font face="Courier New"&gt;Combobox&lt;/font&gt; l&amp;rsquo;est. Nous parlerons bien entendu ici uniquement des contr&amp;ocirc;les qui poss&amp;egrave;dent un visuel.
&lt;/p&gt;
&lt;p&gt;
Un Etat visuel peut &amp;ecirc;tre compris comme une all&amp;eacute;gorie d&amp;rsquo;un ou plusieurs &amp;eacute;tats logiques du contr&amp;ocirc;le. Les &amp;eacute;tats logiques sont ceux d&amp;eacute;finis dans le code fonctionnel, comme par exemple &lt;font face="Courier New"&gt;IsEnabled&lt;/font&gt; ou &lt;font face="Courier New"&gt;IsChecked&lt;/font&gt;. Il ne faut pas confondre &lt;em&gt;&amp;eacute;tat&lt;/em&gt; et &lt;em&gt;propri&amp;eacute;t&amp;eacute;&lt;/em&gt;. Les &amp;eacute;tats sont le plus souvent repr&amp;eacute;sent&amp;eacute;s par des propri&amp;eacute;t&amp;eacute;s (ils peuvent simplement &amp;ecirc;tre des champs internes ou le r&amp;eacute;sultat d&amp;rsquo;un calcul) mais toute propri&amp;eacute;t&amp;eacute; ne repr&amp;eacute;sente pas un &amp;eacute;tat (la couleur &lt;font face="Courier New"&gt;Foreground&lt;/font&gt; ou le type de curseur en sont des exemples). 
&lt;/p&gt;
&lt;p&gt;
je parle d&amp;rsquo;&lt;em&gt;all&amp;eacute;gorie&lt;/em&gt; car comme je l&amp;rsquo;&amp;eacute;voque dans le billet &amp;ldquo;&lt;a href="http://www.e-naxos.com/Blog/post/2009/09/01/Le-defit-des-nouvelles-interfaces-Silverlight-et-WPF-La-cassure-conceptuelle.aspx" target="_blank"&gt;Le d&amp;eacute;fit des nouvelles interfaces Silverlight et WPF &amp;ndash; La cassure conceptuelle&lt;/a&gt;&amp;rdquo;, la repr&amp;eacute;sentation visuelle d&amp;rsquo;un contr&amp;ocirc;le (et de ses &amp;eacute;tats) est l&amp;rsquo;aboutissement d&amp;rsquo;une d&amp;eacute;marche intellectuelle et conceptuelle qui a justement pour but de cr&amp;eacute;er un univers dans lequel les acteurs (les contr&amp;ocirc;les) doivent chacun avoir leur place et leur comportement. Entre visuel et fonctionnel il n&amp;rsquo;y a pas de relation d&amp;rsquo;identit&amp;eacute; (au sens d&amp;rsquo;un sch&amp;eacute;ma conceptuel de donn&amp;eacute;es - relation de type 1-1). Le visuel cr&amp;eacute;&amp;eacute; une identit&amp;eacute; pour l&amp;rsquo;acteur, ce qui est diff&amp;eacute;rent et ne s&amp;rsquo;entend pas dans le m&amp;ecirc;me sens.
&lt;/p&gt;
&lt;p&gt;
Je disais aussi qu&amp;rsquo;un &amp;eacute;tat visuel repr&amp;eacute;sente un ou plusieurs &amp;eacute;tats logiques. Dans certains cas deux (ou plus) &amp;eacute;tats logiques peuvent &amp;ecirc;tre &amp;ldquo;r&amp;eacute;sum&amp;eacute;s&amp;rdquo; par un seul &amp;eacute;tat visuel. Cette combinaison prend son sens ponctuellement, au cas par cas, et ne peut pas &amp;ecirc;tre g&amp;eacute;n&amp;eacute;ralis&amp;eacute;e en une r&amp;egrave;gle absolue. N&amp;eacute;anmoins, lorsqu&amp;rsquo;on cr&amp;eacute;&amp;eacute; le visuel d&amp;rsquo;un contr&amp;ocirc;le, il faut garder &amp;agrave; l&amp;rsquo;esprit cette possibilit&amp;eacute;. L&amp;rsquo;&amp;oelig;il peut discerner de nombreuses subtilit&amp;eacute;s dans les formes et les couleurs alors qu&amp;rsquo;il lui faut plus de temps pour interpr&amp;eacute;ter des s&amp;eacute;ries de donn&amp;eacute;es chiffr&amp;eacute;es ou textuelles&amp;hellip;
&lt;/p&gt;
&lt;p&gt;
Les transitions ont aussi leur importance. On ne passe pas d&amp;rsquo;un &amp;eacute;tat visuel &amp;agrave; un autre de fa&amp;ccedil;on abrupte, sauf si cela est volontairement assum&amp;eacute;. Les transitions fluidifient l&amp;rsquo;interface, cr&amp;eacute;ent une continuit&amp;eacute; visuelle. Si les transitions ne portent pas de sens en elle-m&amp;ecirc;mes, &amp;agrave; la diff&amp;eacute;rence des &amp;eacute;tats, elles jouent un r&amp;ocirc;le important dans l&amp;rsquo;exp&amp;eacute;rience utilisateur (&lt;a href="http://fr.wikipedia.org/wiki/Exp%C3%A9rience_utilisateur" target="_blank"&gt;UX&lt;/a&gt;).
&lt;/p&gt;
&lt;h2&gt;Trois phases&lt;/h2&gt;
&lt;p&gt;
La conception des &amp;eacute;tats visuels et des transitions peut se d&amp;eacute;couper en trois phases diff&amp;eacute;rentes.
&lt;/p&gt;
&lt;h3&gt;Phase statique&lt;/h3&gt;
&lt;p&gt;
Cette phase de la conception consiste &amp;agrave; cr&amp;eacute;er des &amp;eacute;tats dans le VSM et &amp;agrave; d&amp;eacute;finir l&amp;rsquo;aspect du contr&amp;ocirc;le dans chacun d&amp;rsquo;eux. On en profite pour identifier les &lt;strong&gt;groupes d&amp;rsquo;&amp;eacute;tats&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
Au sein de chaque groupe les &amp;eacute;tats sont mutuellement exclusifs, les &amp;eacute;tats de diff&amp;eacute;rents groupes &amp;eacute;tant ind&amp;eacute;pendants et simultan&amp;eacute;s (une &lt;font face="Courier New"&gt;Checkbox&lt;/font&gt; peut &amp;agrave; la fois avoir le focus et &amp;ecirc;tre coch&amp;eacute;e ou d&amp;eacute;coch&amp;eacute;e par exemple. &lt;font face="Courier New"&gt;IsChecked&lt;/font&gt; appartient &amp;agrave; une groupe d&amp;rsquo;&amp;eacute;tats diff&amp;eacute;rent de celui d&amp;eacute;finissant l&amp;rsquo;aspect visuel pour le focus). 
&lt;/p&gt;
&lt;p&gt;
Lors de la phase de conception statique on se pr&amp;eacute;occupe de l&amp;rsquo;aspect que prend le contr&amp;ocirc;le dans chacun des &amp;eacute;tats. On v&amp;eacute;rifie aussi la compatibilit&amp;eacute; visuelle entre les &amp;eacute;tats des diff&amp;eacute;rents groupes d&amp;rsquo;&amp;eacute;tats. Si cette &amp;eacute;tape est qualifi&amp;eacute;e de statique c&amp;rsquo;est pour souligner qu&amp;rsquo;on ne se soucie pas encore des transitions (la dynamique visuelle), mieux vaut rester concentr&amp;eacute; sur les groupes d&amp;rsquo;&amp;eacute;tats et les &amp;eacute;tats eux-m&amp;ecirc;mes.
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;On veillera &amp;agrave; ne pas manipuler une m&amp;ecirc;me propri&amp;eacute;t&amp;eacute; du contr&amp;ocirc;le dans plusieurs groupes d&amp;rsquo;&amp;eacute;tats pour des raisons de coh&amp;eacute;rence. D&amp;rsquo;ailleurs si on commet cette imprudence Blend le signalera par un petit symbole de danger (triangle assorti d&amp;rsquo;un message de type tooltip). On peut assumer une telle situation si on en mesure toutes les cons&amp;eacute;quences, c&amp;rsquo;est pourquoi Blend signale le probl&amp;egrave;me mais n&amp;rsquo;interdit pas la situation. Mais en r&amp;egrave;gle g&amp;eacute;n&amp;eacute;rale cette alerte trahit une mauvaise conception !&lt;/em&gt;
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Etat &amp;ldquo;Base&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;
Vous l&amp;rsquo;avez peut-&amp;ecirc;tre remarqu&amp;eacute;, d&amp;egrave;s qu&amp;rsquo;un groupe d&amp;rsquo;&amp;eacute;tats existe le VSM ajoute syst&amp;eacute;matiquement &amp;agrave; la liste un &amp;eacute;tat sp&amp;eacute;cial appel&amp;eacute; &lt;strong&gt;Base&lt;/strong&gt;. Cet &amp;eacute;tat permet de visualiser le contr&amp;ocirc;le hors de tous les &amp;eacute;tats visuels d&amp;eacute;finis. Toute modification effectu&amp;eacute;e dans l&amp;rsquo;&amp;eacute;tat Base se propage &amp;agrave; tous les &amp;eacute;tats d&amp;eacute;finis et n&amp;rsquo;est enregistr&amp;eacute; dans aucune time-line. 
&lt;/p&gt;
&lt;h3&gt;Etat par d&amp;eacute;faut&lt;/h3&gt;
&lt;p&gt;
Un contr&amp;ocirc;le bien con&amp;ccedil;u devrait poss&amp;eacute;der pour chaque groupe d&amp;rsquo;&amp;eacute;tats un &amp;eacute;tat par d&amp;eacute;faut. En effet l&amp;rsquo;&amp;eacute;tat Base n&amp;rsquo;existe pas en tant qu&amp;rsquo;&amp;eacute;tat visuel, il s&amp;rsquo;agit juste d&amp;rsquo;un mode d&amp;rsquo;&amp;eacute;dition sp&amp;eacute;cial du VSM. Lorsqu&amp;rsquo;une instance du contr&amp;ocirc;le est cr&amp;eacute;&amp;eacute;e il est forc&amp;eacute;ment dans un &amp;eacute;tat donn&amp;eacute; (par exemple &lt;font face="Courier New"&gt;IsChecked=False&lt;/font&gt; pour une case &amp;agrave; cocher). Il se trouve m&amp;ecirc;me souvent dans plusieurs &amp;eacute;tats pr&amp;eacute;cis qui seront repr&amp;eacute;sent&amp;eacute;s par plusieurs groupes d&amp;rsquo;&amp;eacute;tats. De fait il ne faut pas se reposer sur l&amp;rsquo;&amp;eacute;tat Base mais plut&amp;ocirc;t cr&amp;eacute;er un &amp;eacute;tat par d&amp;eacute;faut pour chaque groupe qui traduit l&amp;rsquo;aspect visuel du contr&amp;ocirc;le lorsqu&amp;rsquo;il vient d&amp;rsquo;&amp;ecirc;tre initialis&amp;eacute; (ou &amp;ldquo;remis &amp;agrave; z&amp;eacute;ro&amp;rdquo; si une telle fonction est disponible dans le contr&amp;ocirc;le). Dans les contr&amp;ocirc;les existants vous pouvez remarquer que de tels &amp;eacute;tats par d&amp;eacute;faut existent. Par exemple dans le groupe &lt;font face="Courier New"&gt;CommonStates&lt;/font&gt; de la classe &lt;font face="Courier New"&gt;Button&lt;/font&gt; on trouve un &amp;eacute;tat &lt;font face="Courier New"&gt;Normal&lt;/font&gt;, dans le groupe &lt;font face="Courier New"&gt;CheckedStates&lt;/font&gt; (d&amp;rsquo;une case &amp;agrave; cocher) on trouve &lt;font face="Courier New"&gt;UnChecked&lt;/font&gt;, etc.
&lt;/p&gt;
&lt;p&gt;
L&amp;rsquo;&amp;eacute;tat par d&amp;eacute;faut de chaque groupe ne doit pas forc&amp;eacute;ment porter un m&amp;ecirc;me nom (ce qui poserait un probl&amp;egrave;me pour le VSM de toute fa&amp;ccedil;on, il n&amp;rsquo;autorise pas que deux &amp;eacute;tats portent le m&amp;ecirc;me nom). Au contraire, cet &amp;eacute;tat par d&amp;eacute;faut de chaque groupe doit, comme dans les exemples donn&amp;eacute;s ci-dessus, porter un nom ayant un sens en rapport avec le groupe.
&lt;/p&gt;
&lt;p&gt;
Il est parfaitement valide de cr&amp;eacute;er un &amp;eacute;tat par d&amp;eacute;faut (ou non) qui ne fait que recopier la situation de l&amp;rsquo;&amp;eacute;tat Base. Il suffit de cr&amp;eacute;er l&amp;rsquo;&amp;eacute;tat et de ne rien modifier&amp;hellip; Cela permet souvent de clarifier les choses. Prenons l&amp;rsquo;exemple de la &lt;font face="Courier New"&gt;Checkbox&lt;/font&gt;, la croix est ajout&amp;eacute;e dans l&amp;rsquo;&amp;eacute;tat Base mais est cach&amp;eacute;e. En revanche cela ne l&amp;egrave;ve pas l&amp;rsquo;obligation de cr&amp;eacute;er un &amp;eacute;tat &lt;font face="Courier New"&gt;Unchecked&lt;/font&gt; dans le groupe &lt;font face="Courier New"&gt;CheckedStates&lt;/font&gt;. Cet &amp;eacute;tat est juste cr&amp;eacute;&amp;eacute; mais non modifi&amp;eacute; puisqu&amp;rsquo;il reprend l&amp;rsquo;aspect de l&amp;rsquo;&amp;eacute;tat Base (croix cach&amp;eacute;e). 
&lt;/p&gt;
&lt;h3&gt;Validation des &amp;eacute;tats&lt;/h3&gt;
&lt;p&gt;
Arriv&amp;eacute; ici il faut tester tous les &amp;eacute;tats. Cela peut se faire sous Blend mais il ne faut pas h&amp;eacute;siter &amp;agrave; cr&amp;eacute;er une &lt;strong&gt;fiche de test&lt;/strong&gt;, y placer le contr&amp;ocirc;le, et ajouter des boutons, sliders, et autres &amp;eacute;l&amp;eacute;ments d&amp;rsquo;interface pour tester au runtime le changement de chaque &amp;eacute;tat, la coh&amp;eacute;rence entre les groupes, etc.
&lt;/p&gt;
&lt;p&gt;
Dans certains cas tr&amp;egrave;s simples la conception des &amp;eacute;tats visuels peut s&amp;rsquo;arr&amp;ecirc;ter l&amp;agrave;. On peut vouloir des transitions franches et imm&amp;eacute;diates et il n&amp;rsquo;y a alors plus rien &amp;agrave; ajouter.
&lt;/p&gt;
&lt;p&gt;
Dans d&amp;rsquo;autres cas il s&amp;rsquo;av&amp;egrave;re essentiel d&amp;rsquo;aborder la seconde phase.
&lt;/p&gt;
&lt;h3&gt;Phase des transitions&lt;/h3&gt;
&lt;p&gt;
La version simple consiste &amp;agrave; utiliser le r&amp;eacute;glage par d&amp;eacute;faut que le VSM propose pour chaque groupe d&amp;rsquo;&amp;eacute;tats. Dans de nombreux cas cela peut &amp;ecirc;tre suffisant. Il suffit alors de d&amp;eacute;finir un temps pour l&amp;rsquo;ensemble des transitions. Le VSM calculera &amp;agrave; l&amp;rsquo;ex&amp;eacute;cution les animations correspondantes.
&lt;/p&gt;
&lt;p&gt;
La version plus &amp;eacute;volu&amp;eacute;e consiste &amp;agrave; utiliser les options du VSM pour chaque &amp;eacute;tat afin de r&amp;eacute;gler les transitions d&amp;rsquo;entr&amp;eacute;es et de sorties de celui-ci. Il peut en effet s&amp;rsquo;av&amp;eacute;rer n&amp;eacute;cessaire d&amp;rsquo;avoir des timings diff&amp;eacute;rents selon le sens de la transition et l&amp;rsquo;&amp;eacute;tat pr&amp;eacute;c&amp;eacute;dent. Par exemple il est courant que les &amp;eacute;tats visuels de type clic souris soient instantan&amp;eacute;s pour ne pas donner l&amp;rsquo;impression &amp;agrave; l&amp;rsquo;utilisateur que le logiciel est &amp;ldquo;mou&amp;rdquo;, lent &amp;agrave; r&amp;eacute;pondre, alors que le rel&amp;acirc;chement de la souris peut au contraire accepter un temps assez long, donnant une sensation de douceur, d&amp;rsquo;amorti &amp;ldquo;luxueux&amp;rdquo;. 
&lt;/p&gt;
&lt;p&gt;
Encore une fois les choses peuvent s&amp;rsquo;arr&amp;ecirc;ter l&amp;agrave;. Bien entendu apr&amp;egrave;s avoir test&amp;eacute; toutes les transitions. N&amp;rsquo;oubliez pas que Blend 3 propose d&amp;eacute;sormais une option permettant de visualiser en conception l&amp;rsquo;effet des transitions lorsque le VSM est actif. Cela fonctionne tr&amp;egrave;s bien, sauf pour les transitions utilisant des storyboards.
&lt;/p&gt;
&lt;h3&gt;Phase des transitions dynamiques&lt;/h3&gt;
&lt;p&gt;
Justement le troisi&amp;egrave;me niveaux de personnalisation consiste &amp;agrave; cr&amp;eacute;er des storyboards au lieu de se contenter des timings r&amp;eacute;gl&amp;eacute;s dans le VSM. Dans ce cas on cr&amp;eacute;&amp;eacute; une animation compl&amp;egrave;te pour la transition en utilisant les fonctions des storyboards (time line, boucle for-ever, autoreverse&amp;hellip;).
&lt;/p&gt;
&lt;p&gt;
Pouvant s&amp;rsquo;utiliser dans les storyboards ou sur les animations par d&amp;eacute;faut cr&amp;eacute;&amp;eacute;es par le VSM, les fonctions de &lt;em&gt;ease in&lt;/em&gt; et &lt;em&gt;ease out&lt;/em&gt; permettent d&amp;rsquo;ajouter une touche &amp;ldquo;organique&amp;rdquo;, plus naturelle, aux animations. Silverlight 3 propose de nombreux modes (comme le rebondissement par exemple) qui, bien utilis&amp;eacute;s, finissent le visuel et le rende plus &amp;ldquo;pro&amp;rdquo;.
&lt;/p&gt;
&lt;h2&gt;Relation avec le code&lt;/h2&gt;
&lt;p&gt;
Il y a toujours eu deux aspects &amp;agrave; la cr&amp;eacute;ation d&amp;rsquo;un contr&amp;ocirc;le personnalis&amp;eacute;, m&amp;ecirc;me sous Win32 avec les MFC ou sous Delphi avec la VCL. La cr&amp;eacute;ation du visuel d&amp;rsquo;un c&amp;ocirc;t&amp;eacute; et celle du code fonctionnel de l&amp;rsquo;autre. Tout a chang&amp;eacute; mais pas cette s&amp;eacute;paration qui s&amp;rsquo;est, au contraire, renforc&amp;eacute;e.
&lt;/p&gt;
&lt;p&gt;
Le designer (l&amp;rsquo;infographiste) con&amp;ccedil;oit le visuel d&amp;rsquo;un contr&amp;ocirc;le, il pr&amp;eacute;voit comment le contr&amp;ocirc;le se comportera pour l&amp;rsquo;utilisateur, comment il s&amp;rsquo;animera, comment ses diff&amp;eacute;rents &amp;eacute;tats seront visualis&amp;eacute;s.
&lt;/p&gt;
&lt;p&gt;
Pour l&amp;rsquo;informaticien le point de vue est diff&amp;eacute;rent. Il ne doit pas se soucier de l&amp;rsquo;aspect visuel mais du comportement du contr&amp;ocirc;le, de sa logique sous-jacente.
&lt;/p&gt;
&lt;p&gt;
Cela implique de prendre en compte tout ce qui peut modifier les &amp;eacute;tats internes du contr&amp;ocirc;le, la coh&amp;eacute;rence de la machine logique lors de son fonctionnement. Que les changements d&amp;rsquo;&amp;eacute;tat soient le fait de l&amp;rsquo;utilisateur, d&amp;rsquo;une animation cr&amp;eacute;&amp;eacute;e par le designer ou de tout autre acteur, peu importe. 
&lt;/p&gt;
&lt;p&gt;
Il faut oublier le visuel qui d&amp;rsquo;ailleurs n&amp;rsquo;existe pas forc&amp;eacute;ment (la s&amp;eacute;paration du travail design / codage est telle qu&amp;rsquo;on peut aujourd&amp;rsquo;hui commencer un projet par une r&amp;eacute;flexion purement conceptuelle et graphique avec un designer plut&amp;ocirc;t que d&amp;rsquo;&amp;eacute;crire le cahier des charges avec un informaticien&amp;hellip;). 
&lt;/p&gt;
&lt;p&gt;
Rep&amp;eacute;rer les ilots d&amp;rsquo;&amp;eacute;tats (qui deviendront ou non des groupes d&amp;rsquo;&amp;eacute;tats dans la partie visuelle), le ou les graphes de changement d&amp;rsquo;&amp;eacute;tat, v&amp;eacute;rifier quels sont les graphes d&amp;rsquo;&amp;eacute;tats interconnect&amp;eacute;s (et qui forment un groupe ou des sous-groupes) de ceux qui sont totalement ind&amp;eacute;pendants, tout cela est essentiel.
&lt;/p&gt;
&lt;h3&gt;L&amp;rsquo;initialisation&lt;/h3&gt;
&lt;p&gt;
On retrouve ici une pr&amp;eacute;occupation d&amp;eacute;j&amp;agrave; &amp;eacute;voqu&amp;eacute;e quand nous parlions de la partie visuelle. Pour le designer il s&amp;rsquo;agissait de ne pas confondre l&amp;rsquo;&amp;eacute;tat &lt;em&gt;Base&lt;/em&gt; avec les &amp;eacute;tats par d&amp;eacute;faut qu&amp;rsquo;il faut cr&amp;eacute;er pour chaque groupe d&amp;rsquo;&amp;eacute;tats.
&lt;/p&gt;
&lt;p&gt;
C&amp;ocirc;t&amp;eacute; code il est indispensable que toute nouvelle instance d&amp;rsquo;un contr&amp;ocirc;le se &amp;ldquo;positionne&amp;rdquo; correctement. Normalement son initialisation comporte d&amp;rsquo;une fa&amp;ccedil;on ou d&amp;rsquo;une autre des valeurs par d&amp;eacute;faut. Sous C# il est possible d&amp;rsquo;atteindre cet objectif de multiples fa&amp;ccedil;ons : soit par le biais de champs initialis&amp;eacute;s lors de leur d&amp;eacute;claration, soit par le biais de valeurs par d&amp;eacute;faut mises en place dans les m&amp;eacute;tadonn&amp;eacute;es des propri&amp;eacute;t&amp;eacute;s de d&amp;eacute;pendance, soit par code dans le constructeur de la classe, soit par code dans le gestionnaire de l&amp;rsquo;&amp;eacute;v&amp;eacute;nement &lt;font face="Courier New"&gt;Loaded&lt;/font&gt; du contr&amp;ocirc;le (ou de l&amp;rsquo;une de ses sous-parties), soit encore par code XAML.
&lt;/p&gt;
&lt;p&gt;
Le fait que ces diff&amp;eacute;rentes solutions puissent &amp;ecirc;tre utilis&amp;eacute;es simultan&amp;eacute;ment dans un m&amp;ecirc;me contr&amp;ocirc;le n&amp;rsquo;aide pas forc&amp;eacute;ment &amp;agrave; rendre les choses claires&amp;hellip; C#, comme tout langage, n&amp;rsquo;interdit pas le code spaghetti, h&amp;eacute;las !
&lt;/p&gt;
&lt;p&gt;
Mais ici en dehors de la pure stylistique, de l&amp;rsquo;acad&amp;eacute;misme, voire m&amp;ecirc;me des bonnes pratiques, c&amp;rsquo;est aussi la stabilit&amp;eacute; visuelle qui risque d&amp;rsquo;&amp;ecirc;tre compromise si le contr&amp;ocirc;le ne s&amp;rsquo;initialise pas clairement dans une suite d&amp;rsquo;&amp;eacute;tats bien d&amp;eacute;termin&amp;eacute;s (g&amp;eacute;n&amp;eacute;ralement les &amp;eacute;tats par d&amp;eacute;faut). 
&lt;/p&gt;
&lt;p&gt;
Un contr&amp;ocirc;le a ainsi la charge lors de son initialisation de se positionner sur la case &amp;ldquo;d&amp;eacute;part&amp;rdquo; de son graphe d&amp;rsquo;&amp;eacute;tats. Cela semble &amp;eacute;vident mais parfois les portes ouvertes sont celles qui m&amp;eacute;ritent le plus d&amp;rsquo;&amp;ecirc;tre enfonc&amp;eacute;es. Tout le monde peut voir qu&amp;rsquo;une porte est ferm&amp;eacute;e. Il faut &amp;ecirc;tre tr&amp;egrave;s perspicace pour s&amp;rsquo;apercevoir que l&amp;rsquo;absence d&amp;rsquo;un obstacle ne signifie pas qu&amp;rsquo;il n&amp;rsquo;y a rien &amp;agrave; faire&amp;hellip;
&lt;/p&gt;
&lt;p&gt;
Car si rien n&amp;rsquo;est fait, le contr&amp;ocirc;le va &amp;ecirc;tre frapp&amp;eacute; d&amp;rsquo;une sorte de schizophr&amp;eacute;nie : il peut &amp;ecirc;tre dot&amp;eacute; d&amp;rsquo;un code qui s&amp;rsquo;initialise correctement et d&amp;rsquo;une interface qui en fait tout autant, h&amp;eacute;las les deux personnalit&amp;eacute;s existent simultan&amp;eacute;ment et ne se connaissent pas forc&amp;eacute;ment. Les cas de personnalit&amp;eacute;s multiples sont passionnants en psychanalyse (je vous conseille d&amp;rsquo;ailleurs un excellent vieux livre &amp;eacute;crit par une patiente atteinte de ce syndrome : &lt;a href="http://www.amazon.fr/Joan-autobiographie-dune-personnalit%C3%A9-multiple/dp/2258035562" target="_blank"&gt;Joan, autobiographie d&amp;rsquo;une personnalit&amp;eacute; multiple&lt;/a&gt;) et m&amp;ecirc;me s&amp;rsquo;il est plus facile de d&amp;eacute;boguer un programme qu&amp;rsquo;un cerveau humain, ce type de d&amp;eacute;sordre du comportement ruine totalement les efforts pour cr&amp;eacute;er une interface riche et coh&amp;eacute;rente&amp;hellip; Alors autant y penser ! Cela signifie dans la pratique que vous devez &lt;strong&gt;centraliser l&amp;rsquo;initialisation logique&lt;/strong&gt; de votre contr&amp;ocirc;le (l&amp;rsquo;ensemble de ses &amp;eacute;tats) &lt;strong&gt;et&lt;/strong&gt; l&amp;rsquo;initialisation visuelle. Cette derni&amp;egrave;re s&amp;rsquo;effectue en g&amp;eacute;n&amp;eacute;ral en appelant &lt;font face="Courier New"&gt;GotoState&lt;/font&gt; avec le param&amp;egrave;tre d&amp;rsquo;animation &amp;agrave; &lt;font face="Courier New"&gt;false&lt;/font&gt; (il s&amp;rsquo;agit d&amp;rsquo;une bonne pratique. On &amp;eacute;vite d&amp;rsquo;animer les contr&amp;ocirc;les lorsqu&amp;rsquo;ils s&amp;rsquo;initialisent). Ainsi, code et visuel sont initialis&amp;eacute;s conjointement et sont en phase. 
&lt;/p&gt;
&lt;p&gt;
Encore une fois ne prenez pas &lt;em&gt;Base&lt;/em&gt; pour un &amp;eacute;tat. Notamment il n&amp;rsquo;existe aucune transition g&amp;eacute;r&amp;eacute;e par le VSM entre Base et les autres &amp;eacute;tats. Si votre contr&amp;ocirc;le n&amp;rsquo;est pas volontairement initialis&amp;eacute; dans ses &amp;eacute;tats par d&amp;eacute;faut aucune animation ne sera jou&amp;eacute;e lors du premier changement car Base vers un &amp;eacute;tat ne g&amp;eacute;n&amp;egrave;re aucune transition.
&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;
La cr&amp;eacute;ation d&amp;rsquo;un contr&amp;ocirc;le est une op&amp;eacute;ration longue et minutieuse car elle doit &amp;ecirc;tre r&amp;eacute;fl&amp;eacute;chie. Et plut&amp;ocirc;t deux fois qu&amp;rsquo;une : &amp;agrave; la fois sous l&amp;rsquo;angle visuel et sous l&amp;rsquo;angle du code. Ces deux aspects bien s&amp;eacute;par&amp;eacute;s aujourd&amp;rsquo;hui introduisent la n&amp;eacute;cessit&amp;eacute; de penser &amp;agrave; leur indispensable synchronisation pour garantir la coh&amp;eacute;rence du contr&amp;ocirc;le.
&lt;/p&gt;
&lt;p&gt;
Mais avec un peu d&amp;rsquo;habitude on s&amp;rsquo;aper&amp;ccedil;oit bien vite qu&amp;rsquo;il est mille fois plus facile de cr&amp;eacute;er un nouveau contr&amp;ocirc;le visuel avec Blend (que cela soit pour Silverlight ou WPF) qu&amp;rsquo;avec les technologies pr&amp;eacute;c&amp;eacute;dentes. Alors cela vaut bien un peu d&amp;rsquo;attention au d&amp;eacute;part !
&lt;/p&gt;
&lt;p&gt;
Bonne conception !
&lt;/p&gt;
&lt;p&gt;
N&amp;rsquo;oubliez pas que seul Blend (qui h&amp;eacute;las n&amp;rsquo;existe pas en version express gratuite) permet s&amp;eacute;rieusement de travailler sous Silverlight et WPF. N&amp;rsquo;h&amp;eacute;sitez pas &amp;agrave; acheter ce compl&amp;eacute;ment indispensable ou &amp;agrave; vous le faire offrir (apr&amp;egrave;s tout, un Blend 3 pour No&amp;euml;l c&amp;rsquo;est mieux qu&amp;rsquo;une cravate ou une bague &amp;ndash; pas de sexisme sur Dot.Blog! &amp;ndash; pensez-y ! )
&lt;/p&gt;
&lt;p&gt;
Et Stay Tuned ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/7kL_LJo8IfA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/7kL_LJo8IfA/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/11/01/Quelques-conseils-de-design-(UserControl-Blend-Visual-State-manager-Silverlight-WPF).aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=0209f24b-b939-437d-891c-934c8c915222</guid>
      <pubDate>Sun, 01 Nov 2009 07:36:00 +0200</pubDate>
      <category>Articles</category>
      <category>Design</category>
      <category>Silverlight</category>
      <category>WPF</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=0209f24b-b939-437d-891c-934c8c915222</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=0209f24b-b939-437d-891c-934c8c915222</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/11/01/Quelques-conseils-de-design-(UserControl-Blend-Visual-State-manager-Silverlight-WPF).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=0209f24b-b939-437d-891c-934c8c915222</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=0209f24b-b939-437d-891c-934c8c915222</feedburner:origLink></item>
    <item>
      <title>Mettez un peu de Live dans votre Windows !</title>
      <description>&lt;p&gt;
Dans le pr&amp;eacute;c&amp;eacute;dent billet je grommelais un peu sur le syst&amp;egrave;me de recherche de fichiers de Windows. Microsoft ne fait pas que des bons choix, la perfection n&amp;rsquo;est pas de ce monde (ni d&amp;rsquo;un autre d&amp;rsquo;ailleurs &amp;agrave; mon avis).
&lt;/p&gt;
&lt;p&gt;
En revanche Microsoft a souvent de tr&amp;egrave;s bonnes id&amp;eacute;es, alors apr&amp;egrave;s les reproches, les louanges ! 
&lt;/p&gt;
&lt;p&gt;
Comme vous le savez peut-&amp;ecirc;tre Microsoft met &amp;agrave; disposition gratuitement un ensemble de services appel&amp;eacute;s Microsoft &lt;a href="http://home.live.com/" target="_blank"&gt;Windows Live&lt;/a&gt; .
&lt;/p&gt;
&lt;p&gt;
Ces services se pr&amp;eacute;sentent sous la forme de logiciels &amp;agrave; t&amp;eacute;l&amp;eacute;charger ou bien de services Internet. On y trouve Hotmail, la messagerie, Live Mail (remplace outlook express), Messenger, SkyDrive, Favorites, Spaces, Galery et Writer.
&lt;/p&gt;
&lt;p&gt;
Bien entendu tout n&amp;rsquo;est pas nouveau (hotmail par exemple), et il s&amp;rsquo;agit pour l&amp;rsquo;essentiel d&amp;rsquo;un relookage commercial de MSN. Mais pas seulement.
&lt;/p&gt;
&lt;p&gt;
Prenez par exemple Live Writer (t&amp;eacute;l&amp;eacute;chargeable &amp;agrave; part), il permet de publier dans tous les blogs que vous poss&amp;eacute;dez de fa&amp;ccedil;on centralis&amp;eacute;e tout en b&amp;eacute;n&amp;eacute;ficiant de la correction orthographique, de brouillons, etc. Writer sait m&amp;ecirc;me reconna&amp;icirc;tre le template de chaque blog et vous offre ainsi un espace de saisie ressemblant au look &amp;amp; feel de votre vrai blog dans sa version publi&amp;eacute;e.
&lt;/p&gt;
&lt;p&gt;
Writer fonctionne tr&amp;egrave;s bien avec BlogEngine (le logiciel de blog Open Source en C#) et c&amp;rsquo;est d&amp;rsquo;ailleurs avec Writer que je publie maintenant mes billets, c&amp;rsquo;est bien plus pratique et plus complet que l&amp;rsquo;&amp;eacute;diteur de BlogEngine. La plupart des services de blog sont reconnus automatiquement. On peut aussi visualiser un aper&amp;ccedil;u du billet en cours d&amp;rsquo;&amp;eacute;criture dans une simulation du blog (mise en page en tout point conforme).
&lt;/p&gt;
&lt;p&gt;
D&amp;rsquo;autres appr&amp;eacute;cieront la correction orthographique, d&amp;rsquo;autres flasheront sur la Galery de photo ou sur SkyDrive qui offre un espace de stockage et de partage de donn&amp;eacute;es sur le Web.
&lt;/p&gt;
&lt;p&gt;
Je pense que chacun peut trouver son compte dans Windows Live sachant qu&amp;rsquo;on peut n&amp;rsquo;installer qu&amp;rsquo;un seul module sans &amp;ecirc;tre oblig&amp;eacute; de s&amp;rsquo;encombrer de toute la suite Live.
&lt;/p&gt;
&lt;p&gt;
Au final, un ensemble de services bien pratiques, ni encombrants ni contraignants, et parmi lesquels il y en a forc&amp;eacute;ment au moins un qui vous sera utile. Alors visitez le site Windows Live et installez les modules de vos choix !
&lt;/p&gt;
&lt;p&gt;
Et Stay Tuned !
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/4IDYbP2ZrhY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/4IDYbP2ZrhY/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/10/25/Mettez-un-peu-de-Live-dans-votre-Windows-!.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=20f71898-9fec-48c0-8fb1-60d9c0b143a7</guid>
      <pubDate>Sun, 25 Oct 2009 23:07:00 +0200</pubDate>
      <category>En vrac</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=20f71898-9fec-48c0-8fb1-60d9c0b143a7</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=20f71898-9fec-48c0-8fb1-60d9c0b143a7</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/10/25/Mettez-un-peu-de-Live-dans-votre-Windows-!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=20f71898-9fec-48c0-8fb1-60d9c0b143a7</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=20f71898-9fec-48c0-8fb1-60d9c0b143a7</feedburner:origLink></item>
    <item>
      <title>Everything, everywhere ! Accéder à tous vos fichiers de partout</title>
      <description>&lt;p&gt;
Je ne sais pas pour vous, mais en ce qui me concerne j&amp;rsquo;ai l&amp;rsquo;impression que plus Microsoft fait des efforts pour am&amp;eacute;liorer la recherche des fichiers dans ses OS plus c&amp;rsquo;est compliqu&amp;eacute; et moins &amp;ccedil;a trouve&amp;hellip; 
&lt;/p&gt;
&lt;p&gt;
Situation paradoxale s&amp;rsquo;il en est surtout que de quelques m&amp;eacute;ga nos disques sont pass&amp;eacute;s &amp;agrave; des centaines de giga, donc &amp;agrave; des centaines de milliers de fichiers. Sous XP c&amp;rsquo;&amp;eacute;tait lent et pas toujours &amp;eacute;vident. Sous Vista &amp;ccedil;a ne trouvait d&amp;eacute;j&amp;agrave; plus rien, m&amp;ecirc;me sur des supports index&amp;eacute;s. Avec Seven on en reste l&amp;agrave;. Et pourtant Seven est un OS vraiment bien fait que j&amp;rsquo;utilise sur toutes mes machines aujourd&amp;rsquo;hui. 
&lt;/p&gt;
&lt;p&gt;
Mais vous me connaissez, j&amp;rsquo;aime bien rousp&amp;eacute;ter de temps en temps. Et malgr&amp;eacute; mes amiti&amp;eacute;s microsoftiennes c&amp;rsquo;est librement que parfois je m&amp;rsquo;exprime sur les produits de cet &amp;eacute;diteur. J&amp;rsquo;en dit suffisamment de bien tous les jours pour pouvoir me le permettre ! :-) Et puis un ami qui ne dit pas la v&amp;eacute;rit&amp;eacute;, ce n&amp;rsquo;est pas un ami. 
&lt;/p&gt;
&lt;h2&gt;Syndrome Apple&lt;/h2&gt;
&lt;p&gt;
Les am&amp;eacute;liorations ont &amp;eacute;t&amp;eacute; finalement trop &amp;ldquo;Applesques&amp;rdquo; c&amp;rsquo;est &amp;agrave; dire &amp;ldquo;c&amp;rsquo;est nous qui nous occupons de tout, circulez y&amp;rsquo;a rien &amp;agrave; voir ni &amp;agrave; comprendre&amp;rdquo;. j&amp;rsquo;ai toujours d&amp;eacute;test&amp;eacute; les Mac et leur OS pour &amp;ccedil;a. Il n&amp;rsquo;y a pas que des grand m&amp;egrave;res qui ach&amp;egrave;tent des portables pour envoyer des mails &amp;agrave; leurs petits enfants, il n&amp;rsquo;y a pas que des &amp;ldquo;utilisateurs de base&amp;rdquo; qui chattent sur MSN. Non, il y a aussi des professionnels, voire m&amp;ecirc;me des geeks, qui ont aussi besoin de chercher o&amp;ugrave; se trouve un fichier &amp;ldquo;.wab&amp;rdquo; ce que Seven refuse de trouver (certainement parce qu&amp;rsquo;il se trouve dans un r&amp;eacute;pertoire cach&amp;eacute; ou syst&amp;egrave;me). 
&lt;/p&gt;
&lt;p&gt;
Personnellement, &amp;eacute;tant de la g&amp;eacute;n&amp;eacute;ration qui a vu na&amp;icirc;tre les premiers micros, et sachant comment ils sont fait je garde ce vieux r&amp;eacute;flexe dominateur : c&amp;rsquo;est moi l&amp;rsquo;homme, le PC n&amp;rsquo;est qu&amp;rsquo;une machine et c&amp;rsquo;est moi qui commande ! Pas de plan du genre l&amp;rsquo;horrible UAC de vista et ses incessantes demandes de confirmation. Si je fais un truc, je veux que le PC l&amp;rsquo;ex&amp;eacute;cute sans me fatiguer avec des questions &amp;agrave; la noix. J&amp;rsquo;ai besoin de me concentrer sur ce que je fais et pas sur le d&amp;eacute;cryptage des messages de s&amp;eacute;curit&amp;eacute; (qu&amp;rsquo;on finit par supprimer car trop de s&amp;eacute;curit&amp;eacute; tue la s&amp;eacute;curit&amp;eacute;. Ce que heureusement MS a compris dans Seven qui est bien plus discret, et donc utilisable). 
&lt;/p&gt;
&lt;p&gt;
H&amp;eacute;las, la recherche des fichiers si elle s&amp;rsquo;est am&amp;eacute;lior&amp;eacute;e pour le fameux utilisateur de base (chercher un document Word contenant le mot &amp;ldquo;anniversaire&amp;rdquo; &amp;ccedil;a c&amp;rsquo;est rapide) est devenue un enfer pour l&amp;rsquo;informaticien qui doit souvent localiser des fichiers qui se trouvent dans les endroits &amp;ldquo;interdits d&amp;rsquo;acc&amp;egrave;s pour raison de s&amp;eacute;curit&amp;eacute;&amp;rdquo;. Le vieil anar que je suis a tous les poils qui se h&amp;eacute;rissent rien qu&amp;rsquo;en &amp;eacute;crivant cette phrase ! &amp;ldquo;interdit&amp;rdquo; &amp;ldquo;s&amp;eacute;curit&amp;eacute;&amp;rdquo;, &amp;ldquo;raison d&amp;rsquo;&amp;eacute;tat&amp;rdquo; pourquoi pas aussi ! 
&lt;/p&gt;
&lt;p&gt;
Bref il fallait que je trouve un syst&amp;egrave;me de recherche efficace qui puisse me redonner le pouvoir que j&amp;rsquo;exige sur mes machines, surtout que ma machine principale, outre ses deux disques de 500 Go, est connect&amp;eacute; &amp;agrave; divers disques externes de 1 To. Autant dire que si je compte sur Windows pour m&amp;rsquo;aider &amp;agrave; trouver quelque chose l&amp;agrave; dedans, je n&amp;rsquo;ai plus qu&amp;rsquo;&amp;agrave; me tirer une balle&amp;hellip; 
&lt;/p&gt;
&lt;h2&gt;Everything&lt;/h2&gt;
&lt;p&gt;
A force de chercher on trouve ! (sauf le syst&amp;egrave;me de recherche de Windows). 
&lt;/p&gt;
&lt;p&gt;
Et j&amp;rsquo;ai fini par trouver un utilitaire puissant, simple, l&amp;eacute;ger et gratuit qui fait exactement ce que je veux. Il s&amp;rsquo;appelle &amp;ldquo;&lt;a href="http://www.voidtools.com/" target="_blank"&gt;Everything Search Engine&lt;/a&gt;&amp;rdquo;. 
&lt;/p&gt;
&lt;p&gt;
Son principe est simple : il utilise les structures NTFS qu&amp;rsquo;il balaye pour constituer sa base de recherche. C&amp;rsquo;est mille fois plus rapide que le balayage des r&amp;eacute;pertoires via Windows et les temps de recherche sont de l&amp;rsquo;ordre de quelques millisecondes. La cr&amp;eacute;ation de la base de donn&amp;eacute;es (quelques m&amp;eacute;ga qui se met &amp;agrave; jour toute seule ensuite) a pris une minute ou deux avec tous mes disques branch&amp;eacute;s. Ensuite tout est quasi instantan&amp;eacute;. 
&lt;/p&gt;
&lt;p&gt;
Bien entendu Everything ne cherche pas le contenu des fichiers. Windows autorise des noms longs depuis quelques lustres, tant pis pour ceux qui donnent encore des noms courts et ne voulant rien dire &amp;agrave; leurs fichiers ! 
&lt;/p&gt;
&lt;p&gt;
Everything sait utiliser les expressions r&amp;eacute;guli&amp;egrave;res ou bien une notation tr&amp;egrave;s simple permettant de faire des AND et des exclusions (mode de recherche simplifi&amp;eacute;). La liste des fichiers est tri&amp;eacute;e, ce qu&amp;rsquo;on peut changer &amp;agrave; volont&amp;eacute;, et les fichiers sont cliquables pour des actions de base (ex&amp;eacute;cuter, supprimer, etc). 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.e-naxos.com/Blog/image.axd?picture=WindowsLiveWriter/EverythingeverywhereAccdertousvosfichier/6B47266F/etmain.png"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px" src="http://www.e-naxos.com/Blog/image.axd?picture=WindowsLiveWriter/EverythingeverywhereAccdertousvosfichier/3BAE2945/etmain_thumb.png" border="0" alt="etmain" title="etmain" width="513" height="361" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Mais il y a mieux ! Everything peut aussi fournir ce service &amp;ldquo;Everywhere&amp;rdquo; ! 
&lt;/p&gt;
&lt;h2&gt;Everywhere&lt;/h2&gt;
&lt;p&gt;
Ce petit utilitaire est en effet assez puissant pour incorporer un serveur Web (dont le port est param&amp;eacute;trable, ainsi que la s&amp;eacute;curit&amp;eacute; d&amp;rsquo;acc&amp;egrave;s par mot de passe) ! 
&lt;/p&gt;
&lt;p&gt;
Il devient ainsi possible depuis n&amp;rsquo;importe quelle machine sur le r&amp;eacute;seau de faire une recherche sur les fichiers de la machine &amp;eacute;quip&amp;eacute;e de Everything depuis un browser internet : 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.e-naxos.com/Blog/image.axd?picture=WindowsLiveWriter/EverythingeverywhereAccdertousvosfichier/5C5A144C/ETWeb.png"&gt;&lt;img style="display: inline; border: 0px" src="http://www.e-naxos.com/Blog/image.axd?picture=WindowsLiveWriter/EverythingeverywhereAccdertousvosfichier/404BE612/ETWeb_thumb.png" border="0" alt="ETWeb" title="ETWeb" width="528" height="423" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
L&amp;rsquo;image ci-dessus montre l&amp;rsquo;&amp;eacute;cran d&amp;rsquo;une machine acc&amp;eacute;dant au serveur Everything de la machine Saturne (sur le port 100, r&amp;eacute;glage personnel, le port 80 &amp;eacute;tant occup&amp;eacute; par IIS). Il suffit de saisir la phrase de recherche et de cliquer sur le bouton Search pour obtenir un listing d&amp;eacute;taill&amp;eacute; depuis lequel il est possible de t&amp;eacute;l&amp;eacute;charger le fichier par exemple. Tr&amp;egrave;s pratique. 
&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;
Pouvoir chercher en quelques millisecondes sur des Tera de stockage n&amp;rsquo;est une pas une fantaisie de geek bien entendu, c&amp;rsquo;est une fonction de base que tout OS devrait &amp;ecirc;tre capable de fournir. La tendance Apple o&amp;ugrave; l&amp;rsquo;utilisateur ne doit rien savoir et rien pouvoir faire, ou bien l&amp;rsquo;exc&amp;egrave;s de vouloir trop bien faire, ou tout simplement une mauvaise analyse du besoin, un peu de tout &amp;ccedil;a peut-&amp;ecirc;tre&amp;hellip; En tout cas la recherche de fichiers sous XP, Vista et aujourd&amp;rsquo;hui Seven est une vraie plaie. Il a fallu attendre Internet Explorer 8 pour que le mode de recherche dans une page soit enfin pratique (du m&amp;ecirc;me genre que celui de FireFox), j&amp;rsquo;esp&amp;egrave;re qu&amp;rsquo;il ne faudra pas attendre encore trois ou quatre versions de Windows avant qu&amp;rsquo;un mode de recherche simple et rapide soit enfin int&amp;eacute;gr&amp;eacute; &amp;agrave; l&amp;rsquo;OS ! Surtout si Seven fait une carri&amp;egrave;re comme XP (ce que je lui souhaite), dans 4 versions ce seront mes petits enfants que je formerai au nouvel outil ! 
&lt;/p&gt;
&lt;p&gt;
Comme entre temps il faut bien se d&amp;eacute;brouiller, je vous conseille de t&amp;eacute;l&amp;eacute;charger et d&amp;rsquo;utiliser Everything ! 
&lt;/p&gt;
&lt;p&gt;
Bonne recherche&amp;hellip; Et Stay Tuned ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/1nVDu0zzy8k" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/1nVDu0zzy8k/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/10/25/Everything-everywhere-!-Acceder-a-tous-vos-fichiers-de-partout.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=5d8a8489-1217-4a6c-8867-77f66b3e3e61</guid>
      <pubDate>Sun, 25 Oct 2009 21:01:00 +0200</pubDate>
      <category>En vrac</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=5d8a8489-1217-4a6c-8867-77f66b3e3e61</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=5d8a8489-1217-4a6c-8867-77f66b3e3e61</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/10/25/Everything-everywhere-!-Acceder-a-tous-vos-fichiers-de-partout.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=5d8a8489-1217-4a6c-8867-77f66b3e3e61</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=5d8a8489-1217-4a6c-8867-77f66b3e3e61</feedburner:origLink></item>
    <item>
      <title>Lequel est le plus foncé sous WPF/Silverlight : Gray ou DarkGray ?</title>
      <description>&lt;p&gt;
La r&amp;eacute;ponse n&amp;#39;est pas forc&amp;eacute;ment celle que vous pensez ! 
&lt;/p&gt;
&lt;h2&gt;La taille du cul des vaches&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;
Rappelez-vous, il y a de de cela plusieurs ann&amp;eacute;es circulait sur Internet une histoire (vraie ou fausse peu importe) qui d&amp;eacute;montrait que le diam&amp;egrave;tre des fus&amp;eacute;es de la Nasa d&amp;eacute;pendait, par une suite invraisemblable de relations de cause &amp;agrave; effet,&amp;nbsp;de la taille du cul des vaches au temps des romains. On passait par la taille des charriots dont la largeur d&amp;eacute;pendait justement de celle du fessier des ces honorables bovins, ce qui imposait une distance entre les roues, elles-m&amp;ecirc;me cr&amp;eacute;ant des traces au sol qui firent que les premi&amp;egrave;res voitures &amp;agrave; cheval, pour emprunter les routes aux orni&amp;egrave;res profondes trac&amp;eacute;es par les charrues se devaient de respecter la m&amp;ecirc;me distance inter-roue, etc. On en arrivait ainsi au diam&amp;egrave;tre des fus&amp;eacute;es qui, pour passer sur les trains, qui devaient passer dans les tunels, dont la taille d&amp;eacute;pendait etc, etc... Au final un objet ultra technologique et on ne plus moderne se retrouvait &amp;agrave; respecter une taille qui d&amp;eacute;rivait de celle du cul des vaches des romains... 
&lt;/p&gt;
&lt;p&gt;
Je n&amp;#39;ai pas pu retrouver cette histoire le Web pour vous mettre la r&amp;eacute;f&amp;eacute;rence, si un lecteur la conna&amp;icirc;t qu&amp;#39;il soit sympa et qu&amp;#39;il laisse le lien en commentaire... 
&lt;/p&gt;
&lt;h2&gt;Une histoire plus vraie qu&amp;#39;on le pense&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;
Bien entendu je n&amp;#39;ai jamais pu savoir &amp;agrave; l&amp;#39;&amp;eacute;poque s&amp;#39;il s&amp;#39;agissait d&amp;#39;un hoax, d&amp;#39;une v&amp;eacute;rit&amp;eacute;e romanc&amp;eacute;e ou bien d&amp;#39;une v&amp;eacute;rit&amp;eacute; historique. Mais l&amp;#39;histoire que je vais vous raconter aujourd&amp;#39;hui me fait penser, des ann&amp;eacute;es plus tard, que cette histoire &amp;eacute;tait probablement vraie... 
&lt;/p&gt;
&lt;p&gt;
Je tire librement inspiration d&amp;#39;un billet publi&amp;eacute; en 2006 par Tim Sneath, ceux qui d&amp;eacute;sirent lire ce billet original (en anglais) n&amp;#39;ont qu&amp;#39;&amp;agrave; cliquer &lt;a href="http://blogs.msdn.com/tims/archive/2006/06/02/614616.aspx" target="_blank"&gt;ici&lt;/a&gt;. 
&lt;/p&gt;
&lt;h2&gt;Les couleurs sous WPF / Silverlight&lt;/h2&gt;
&lt;h3&gt;24 bit RGB&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;
En Xaml il existe plusieurs fa&amp;ccedil;ons d&amp;#39;exprimer une couleur. Une des options est d&amp;#39;utiliser la notation 24 bits hexad&amp;eacute;cimale de type RGB (Red/Green/Blue, rouge/vert/bleu) : 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Rectangle&lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;Fill&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt;#B2AAFF&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;Stroke&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt;#10F2DA&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;...&lt;/font&gt;&lt;font color="#0000ff"&gt; /&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp; 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;32 bit ARGB&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;
Comme WPF et Silverlight savent g&amp;eacute;rer la transparence via le canal dit Alpha, on peut sp&amp;eacute;cifier une couleur par un code hexad&amp;eacute;cimal 32 bits dit A-RGB (Alpha / RGB) : 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Line&lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;Stroke&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt;#7F006666&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Consolas" size="2"&gt; /&amp;gt;&lt;/font&gt;&lt;/font&gt; 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Ce qui donnera une ligne en Cyan &amp;agrave; 50% d&amp;#39;opacit&amp;eacute;. 
&lt;/p&gt;
&lt;h3&gt;scRGB&lt;/h3&gt;
&lt;p&gt;
Plus subtile et bien moins connu (et encore moins utilis&amp;eacute;e) est la notation &lt;a href="http://en.wikipedia.org/wiki/ScRGB" target="_blank"&gt;scRGB &lt;/a&gt;qui permet d&amp;#39;exprimer une couleur sous la forme de 4 nombres d&amp;eacute;cimaux de type Single ce qui autorise la repr&amp;eacute;sentation d&amp;#39;un &lt;a href="http://fr.wikipedia.org/wiki/Gamut" target="_blank"&gt;gamut &lt;/a&gt;ultra large. A quoi cela peut-il servir d&amp;#39;utiliser un syst&amp;egrave;me de notation des couleurs qui d&amp;eacute;passe de loin les limites du RGB qui va de #000000 &amp;agrave; #FFFFFF ? Cr&amp;eacute;er un noir plus noir que le noir ou un blanc plus blanc que blanc, &amp;agrave; part si on est on un publiciste en mal d&amp;#39;argument pour une nouvelle lessive, cela semble idiot. 
&lt;/p&gt;
&lt;p&gt;
Et pourtant cela ne l&amp;#39;est pas. Il n&amp;#39;y a qu&amp;#39;en mati&amp;egrave;re de lessive que &amp;quot;plus blanc que blanc&amp;quot; est une &amp;acirc;nerie (dont Coluche se d&amp;eacute;lecta dans un sketch c&amp;eacute;l&amp;egrave;bre). Lorsqu&amp;#39;on parle infographie cela peut avoir un sens tr&amp;egrave;s concret : conserver les couleurs originales si celles-ci doivent subir de nombreux traitements, comme par exemple une correction du contraste ou de la Hue&amp;nbsp;(teinte dans le syst&amp;egrave;me &lt;a href="http://fr.wikipedia.org/wiki/Teinte_saturation_lumi%C3%A8re" target="_blank"&gt;HSL&lt;/a&gt;). En effet, &amp;agrave; force de calcul, d&amp;#39;arrondis et d&amp;#39;approximations, votre filtre de correction peut finir par cr&amp;eacute;er des &amp;agrave;-plat horribles. En utilisant le syst&amp;egrave;me scRGB, le code (qu&amp;#39;il soit C# ou XAML) pourra conserver le maximum d&amp;#39;information sur chaque composante couleur. 
&lt;/p&gt;
&lt;p&gt;
Un exemple de notation scRGB : 
&lt;/p&gt;
&lt;p&gt;
&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Rectangle&lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;Stroke&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt;sc#1, 0.6046357, 0.223508522, 0.182969958&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;Fill&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt;sc#1, 0.7785599, 1, 0&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;font color="#0000ff"&gt; &lt;br /&gt;
&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RadiusX&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt;25&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;RadiusY&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt;25&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;Width&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt;250&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;Height&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt;80&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;StrokeThickness&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt;5&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;Margin&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt;60&lt;/font&gt;&amp;quot;&lt;font color="#0000ff"&gt; /&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
(cela donne un rectangle jaune &amp;agrave; bords arrondis bistres). 
&lt;/p&gt;
&lt;h3&gt;Les couleurs nomm&amp;eacute;es&lt;/h3&gt;
&lt;p&gt;
Enfin, il est possible d&amp;#39;utiliser des noms pour d&amp;eacute;finir des couleurs. 
&lt;/p&gt;
&lt;p&gt;
WPF et Silverlight divergent sur ce point car, &amp;eacute;conomie de code oblige pour le Framework r&amp;eacute;duit de Silverlight, ce dernier ne contient pas toutes les d&amp;eacute;finitions de couleur de son a&amp;icirc;n&amp;eacute; WPF. Mais le principe reste rigoureusement le m&amp;ecirc;me (je vous joint d&amp;#39;ailleurs en fin d&amp;#39;article un code qui d&amp;eacute;finit toutes les couleurs WPF utilisables sous Silverlight). 
&lt;/p&gt;
&lt;p&gt;
On peut ainsi utiliser des noms tels que : &lt;font face="Consolas" size="2" color="#008000"&gt;Green&lt;/font&gt;, &lt;font face="Consolas" size="2" color="#4682b4"&gt;SteelBlue&lt;/font&gt; ou &lt;font face="Consolas" size="2" color="#c71585"&gt;MediumVioletRed&lt;/font&gt;. Ce qui donne en XAML : 
&lt;/p&gt;
&lt;font color="#8b008b"&gt;&lt;font color="#8b008b"&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;font size="2"&gt;&amp;lt;Rectangle &lt;/font&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;&lt;font color="#ff0000"&gt;&lt;font color="#ff0000"&gt;Stroke&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;=&amp;quot;yellow&amp;quot; &lt;/font&gt;&lt;/font&gt;&lt;font color="#ff0000"&gt;&lt;font color="#ff0000"&gt;Fill&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;=&amp;quot;red&amp;quot; &lt;/font&gt;&lt;/font&gt;&lt;font color="#ff0000"&gt;&lt;font color="#ff0000"&gt;Width &lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;=&amp;quot;50&amp;quot; &lt;/font&gt;&lt;/font&gt;&lt;font color="#ff0000"&gt;&lt;font color="#ff0000"&gt;Height&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;=&amp;quot;50&amp;quot; &lt;/font&gt;&lt;/font&gt;&lt;font color="#8b008b"&gt;&lt;font color="#8b008b"&gt;/&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;h2&gt;Et le cul des vaches ?&lt;/h2&gt;
&lt;p&gt;
C&amp;#39;est l&amp;agrave; que l&amp;#39;affaire devient croustillante... Attendez la suite pour juger ! 
&lt;/p&gt;
&lt;p&gt;
Par souci de compatibilit&amp;eacute; avec HTML et SVG, Microsoft a repris la liste des couleurs d&amp;eacute;finies dans ces standards. Une bonne id&amp;eacute;e, on a souvent accus&amp;eacute; Microsoft de ne pas respecter les standards, ce que j&amp;#39;ai toujours trouv&amp;eacute; idiot puisque justement l&amp;#39;innovation vient de ce qui est diff&amp;eacute;rent et non de l&amp;#39;uniformisation. Et bien justement, quand les d&amp;eacute;veloppeurs de chez Microsoft se plient &amp;agrave; cette servile obligation, cela donne des choses bien curieuses (&amp;agrave; l&amp;#39;insu de leur plein gr&amp;eacute; comme disait l&amp;#39;idiot p&amp;eacute;daleur). 
&lt;/p&gt;
&lt;p&gt;
En effet, la liste des couleurs HTML est pleine de bizarreries et d&amp;#39;&lt;a href="http://fr.wikipedia.org/wiki/Idiosyncrasie" target="_blank"&gt;idiosyncrasies&lt;/a&gt; qu&amp;#39;il eut &amp;eacute;t&amp;eacute; pr&amp;eacute;f&amp;eacute;rable de corriger. Expurg&amp;eacute;e de ces annomalies la liste des couleurs HTML aurait pu faire une belle liste pour XAML, mais voil&amp;agrave;, compatibilit&amp;eacute; oblige (en fait rien ne l&amp;#39;obligeait, sauf les habitudes), on se retrouve dans l&amp;#39;un des environnements de d&amp;eacute;veloppement le plus moderne &amp;agrave; trainer des b&amp;ecirc;tises d&amp;#39;un autre &amp;acirc;ge ! La fameuse taille du cul des vaches au temps des romains influen&amp;ccedil;ant le diam&amp;egrave;tre des fus&amp;eacute;es de la Nasa... 
&lt;/p&gt;
&lt;p&gt;
Par exemple, le spectre couvert par les couleurs HTML ne respecte pas m&amp;ecirc;me une r&amp;eacute;partition &amp;agrave; peu pr&amp;egrave;s homog&amp;egrave;ne, ce qui fait qu&amp;#39;on dispose de tr&amp;egrave;s nombreuses teintes dans les rouges ou les oranges alors que les verts sont tr&amp;egrave;s mal couverts. 
&lt;/p&gt;
&lt;p&gt;
Autre exemple, les couleurs ont parfois des noms &amp;eacute;sot&amp;eacute;riques qui montrent &amp;agrave; quel point les auteurs originaux n&amp;#39;avaient aucune volont&amp;eacute; de rendre l&amp;#39;ensemble compr&amp;eacute;hensible. En dehors d&amp;#39;un am&amp;eacute;ricain pure souche, qui peut bien en Italie, en France ou en Slov&amp;eacute;nie s&amp;#39;imaginer de quel bleu il s&amp;#39;agit lorsque HTML nous indique un &amp;quot;DodgerBlue&amp;quot; ? La charte couleur des Tshirts d&amp;#39;une &amp;eacute;quipe d&amp;#39;un sport totalement inconnu (le baseball) chez nous n&amp;#39;&amp;eacute;voque rien (les &lt;a href="http://fr.wikipedia.org/wiki/Dodgers_de_Los_Angeles" target="_blank"&gt;dodgers &lt;/a&gt;sont en effet une &amp;eacute;quipe de baseball de Los Angeles, tr&amp;egrave;s connus certes, mais uniquement des am&amp;eacute;ricains et des rares amateurs &amp;eacute;trangers). 
&lt;/p&gt;
&lt;h2&gt;Des origines encore plus lointaines&lt;/h2&gt;
&lt;p&gt;
Mais si cela s&amp;#39;arr&amp;ecirc;tait l&amp;agrave; le rapprochement avec la petite histoire sur l&amp;#39;arri&amp;egrave;re train des vaches pourrait sembler un peu capilotract&amp;eacute;e. En fait nous sommes exactement dans le m&amp;ecirc;me cas. Car les choses ne s&amp;#39;arr&amp;ecirc;tent pas &amp;agrave; HTML. Ces couleurs remontent en r&amp;eacute;alit&amp;eacute; aux premi&amp;egrave;res impl&amp;eacute;mentations sous UNIX du syst&amp;egrave;me &lt;a href="http://fr.wikipedia.org/wiki/X_Window_System" target="_blank"&gt;X-Window&lt;/a&gt;&amp;nbsp;! HTML d&amp;eacute;finit 16 couleurs qui sont directement mapp&amp;eacute;es sur les 16 couleurs de la palette &lt;a href="http://fr.wikipedia.org/wiki/Enhanced_Graphics_Adapter" target="_blank"&gt;EGA&lt;/a&gt;. Mais plus loin encore, les premiers browsers comme &lt;a href="http://fr.wikipedia.org/wiki/NCSA_Mosaic" target="_blank"&gt;Mosaic &lt;/a&gt;(1992) supportaient aussi les &lt;a href="http://fr.wikipedia.org/wiki/Noms_de_couleur_X11" target="_blank"&gt;couleurs nomm&amp;eacute;es de X11&lt;/a&gt; ! Malheureusement certaines couleurs HTML avaient des homonymes X11 qui, bien entendu, ne donnait pas exactement la m&amp;ecirc;me teinte... par exemple &lt;font color="#00ff00"&gt;ce vert &lt;/font&gt;HTML donnait &lt;font color="#008000"&gt;ce vert&lt;/font&gt; sous X11. 
&lt;/p&gt;
&lt;h2&gt;Un gris plus fonc&amp;eacute; que le gris fonc&amp;eacute;&lt;/h2&gt;
&lt;p&gt;
Et c&amp;#39;est ainsi que&amp;nbsp;de tout ce m&amp;eacute;lange&amp;nbsp;le Gray HTML fut d&amp;eacute;fini par&amp;nbsp;&lt;font face="Consolas" size="2" color="#808080"&gt;#808080&lt;/font&gt; alors que le DarkGray est d&amp;eacute;fini par&amp;nbsp; &lt;font face="Consolas, Lucida Console, monospace" size="2" color="#a9a9a9"&gt;#A9A9A9&lt;/font&gt;, un gris plus clair que le gris... 
&lt;/p&gt;
&lt;p&gt;
On en revient &amp;agrave; la question pos&amp;eacute;e dans le titre de ce billet. Et vous voyez que la r&amp;eacute;ponse est loin d&amp;#39;&amp;ecirc;tre celle qui semble s&amp;#39;imposer en toute logique ! 
&lt;/p&gt;
&lt;p&gt;
WPF et Silverlight r&amp;eacute;utilisent cette liste de couleurs qui ne remonte pas aux temps des romains, mais pour l&amp;#39;informatique, l&amp;#39;&amp;eacute;poque de X11 c&amp;#39;est m&amp;ecirc;me pire : de la pr&amp;eacute;histoire ! 
&lt;/p&gt;
&lt;p&gt;
Du coup, il semble bien plus intelligent d&amp;#39;utiliser les codes couleurs RGB, ARGB ou scRGB que les couleurs nomm&amp;eacute;es si on ne veut pas obtenir des r&amp;eacute;sultats &amp;eacute;tranges... 
&lt;/p&gt;
&lt;h2&gt;Incroyable non ?&lt;/h2&gt;
&lt;p&gt;
On pourrait tirer milles conclusions de cette petite histoire. Je vous laisse y r&amp;eacute;fl&amp;eacute;chir, je pr&amp;eacute;f&amp;egrave;re ouvrir des portes que d&amp;#39;ass&amp;eacute;ner des jugements d&amp;eacute;finitifs. Poser des questions ou cr&amp;eacute;er le questionnement est souvent bien plus utile que d&amp;#39;apporter des r&amp;eacute;ponses toutes faites. 
&lt;/p&gt;
&lt;p&gt;
On peut aussi juste en rire, c&amp;#39;est bon pour la sant&amp;eacute; :-) 
&lt;/p&gt;
&lt;p&gt;
Stay Tuned ! 
&lt;/p&gt;
&lt;p&gt;
(pour ceux qui ont lu jusque l&amp;agrave;, le cadeau annonc&amp;eacute; : &lt;a href="http://www.e-naxos.com/Blog/file.axd?file=2009%2f10%2fColorHelper.cs"&gt;ColorHelper.cs (16,31 kb)&lt;/a&gt;&amp;nbsp;) 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/yHHWoP8q8oE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/yHHWoP8q8oE/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/10/15/Lequel-est-le-plus-fonce-sous-WPFSilverlight-Gray-ou-DarkGray-.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=b34151e3-2eaa-4b95-91ab-a467422f493d</guid>
      <pubDate>Thu, 15 Oct 2009 05:12:00 +0200</pubDate>
      <category>Articles</category>
      <category>Design</category>
      <category>Framework .NET</category>
      <category>Silverlight</category>
      <category>WPF</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=b34151e3-2eaa-4b95-91ab-a467422f493d</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=b34151e3-2eaa-4b95-91ab-a467422f493d</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/10/15/Lequel-est-le-plus-fonce-sous-WPFSilverlight-Gray-ou-DarkGray-.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=b34151e3-2eaa-4b95-91ab-a467422f493d</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=b34151e3-2eaa-4b95-91ab-a467422f493d</feedburner:origLink></item>
    <item>
      <title>Silverlight : Enum.GetValues qui n'existe pas, binding et autres considérations</title>
      <description>&lt;p&gt;
Silverlight, comme vous le savez, propose dans quelques m&amp;eacute;ga octets un mini framework .NET qui est tellement bien &amp;quot;d&amp;eacute;coup&amp;eacute;&amp;quot; que la plupart du temps on ne se rend m&amp;ecirc;me pas compte qu&amp;#39;il manque des dizaines de m&amp;eacute;ga de code binaire... Pourtant entre une installation compl&amp;egrave;te du Framework 3.5 ou 4.0 &amp;agrave; venir et l&amp;#39;installation du plugin Silverlight il y a comme une &amp;eacute;norme diff&amp;eacute;rence ! De deux choses l&amp;#39;une, soit Silverlight ne sait rien faire tellement il est diminu&amp;eacute; par ce d&amp;eacute;coupage, ce qui n&amp;#39;est pas le cas, soit le Framework complet est juste gonfl&amp;eacute; avec des fichiers inutiles pour &amp;quot;faire s&amp;eacute;rieux&amp;quot;, ce qui n&amp;#39;est pas le cas non plus :-) 
&lt;/p&gt;
&lt;h2&gt;Un d&amp;eacute;coupage savant&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;
Donc ce n&amp;#39;est ni l&amp;#39;un ni l&amp;#39;autre. La troisi&amp;egrave;me possibilit&amp;eacute;, qui est la bonne r&amp;eacute;ponse, est que le Framework complet est d&amp;#39;une richesse infinie dans les moindres d&amp;eacute;tails, et que le Framework Silverlight &amp;quot;ruse&amp;quot; en zappant beaucoup de d&amp;eacute;tails mais sans perdre l&amp;#39;essentiel. Cela donne l&amp;#39;impression qu&amp;#39;on peut tout faire en Silverlight comme en WPF. C&amp;#39;est &amp;quot;presque&amp;quot; vrai. Assez rapidement on tombe sur les fameux petits d&amp;eacute;tails qui manquent. Cela implique de les compenser par du code. 
&lt;/p&gt;
&lt;p&gt;
Cela dit loin d&amp;#39;&amp;ecirc;tre une critique n&amp;eacute;gative de Silverlight s&amp;#39;en est au contraire une apologie ! Je trouve en effet le d&amp;eacute;coupage savant qui a &amp;eacute;t&amp;eacute; effectu&amp;eacute; dans Silverlight particuli&amp;egrave;rement bien fait. L&amp;#39;approche est tr&amp;egrave;s sens&amp;eacute;e : il est rarissime (m&amp;ecirc;me impossible) qu&amp;#39;une application utilise et n&amp;eacute;cessite d&amp;#39;acc&amp;eacute;der &amp;agrave; toutes les m&amp;eacute;thodes, toutes les propri&amp;eacute;t&amp;eacute;s de toutes les classes du Framework tellement celui-ci est riche. Du coup, en faisant des coupes bien choisies, on peut laisser les squelettes de presque tout le Framework ainsi que les principales m&amp;eacute;thodes et propri&amp;eacute;t&amp;eacute;s utilis&amp;eacute;es le plus souvent. On obtient le Framework Silverlight dans lequel un code standard trouvera 95% de tout ce qu&amp;#39;il lui faut pour tourner. Beaucoup d&amp;#39;applications simples ne verront m&amp;ecirc;me pas qu&amp;#39;il manque quelque chose. En revanche pour les autres cas, le d&amp;eacute;veloppeur ajoutera les contournements n&amp;eacute;cessaires ce qui grossira un peu son code binaire Silverlight, mais d&amp;#39;une petite fraction tr&amp;egrave;s supportable. Rien &amp;agrave; voir avec le co&amp;ucirc;t d&amp;#39;une installation du Framework complet. 
&lt;/p&gt;
&lt;p&gt;
Il n&amp;#39;en reste pas moins vrai que parfois pour des choses tr&amp;egrave;s simples on se retrouve un peu le bec dans l&amp;#39;eau. &amp;quot;Tiens, c&amp;#39;est bizarre, j&amp;#39;aurais jur&amp;eacute; que la m&amp;eacute;thode xxx existait !&amp;quot; Et non, on n&amp;#39;a pas r&amp;ecirc;v&amp;eacute;, elle existe bien, mais dans le Framework complet, pas dans celui de Silverlight. Un exemple tout simple : la m&amp;eacute;thode &lt;font face="courier new,courier"&gt;GetValues()&lt;/font&gt; de la classe &lt;font face="courier new,courier"&gt;Enum&lt;/font&gt;. 
&lt;/p&gt;
&lt;h2&gt;Enum.GetValues o&amp;ugrave; es tu ?&lt;/h2&gt;
&lt;p&gt;
Un cas d&amp;#39;utilisation tr&amp;egrave;s basique qui fait voir imm&amp;eacute;diatement qu&amp;#39;il manque quelque chose : essayez de faire un binding entre une combobox et une &amp;eacute;num&amp;eacute;ration. Truc classique par excellence. 
&lt;/p&gt;
&lt;p&gt;
Que le binding soit fait par Xaml ou bien par code, &amp;agrave; un moment o&amp;ugrave; un autre il faut que l&amp;#39;&amp;eacute;num&amp;eacute;ration sache retourner la liste de ses valeurs. C&amp;#39;est justement la fonction de la m&amp;eacute;thode &lt;font face="courier new,courier"&gt;Enum.GetValues()&lt;/font&gt;. 
&lt;/p&gt;
&lt;p&gt;
Mais dans le Framework Silverlight cette m&amp;eacute;thode n&amp;#39;existe tout simplement pas. Victime de la cure d&amp;#39;amaigrissement &amp;eacute;voqu&amp;eacute;e plus haut. Il ne s&amp;#39;agit donc ni d&amp;#39;un oubli ni d&amp;#39;un dommage collat&amp;eacute;ral, c&amp;#39;est un parti pris, assum&amp;eacute;. 
&lt;/p&gt;
&lt;h2&gt;Et alors on fait comment ?&lt;/h2&gt;
&lt;p&gt;
Assum&amp;eacute;, assum&amp;eacute;... comme il y va ! Non, je vous l&amp;#39;assure, c&amp;#39;est assum&amp;eacute;. Par l&amp;#39;&amp;eacute;quipe qui d&amp;eacute;veloppe le Framework Silverlight en tout cas.&amp;nbsp;Mais pas forc&amp;eacute;ment par les d&amp;eacute;veloppeurs qui l&amp;#39;utilisent ! Car pour eux c&amp;#39;est une autre histoire&amp;nbsp;puisque, en effet, il va falloir r&amp;eacute;inventer cette m&amp;eacute;thode. 
&lt;/p&gt;
&lt;p&gt;
A&amp;nbsp;l&amp;#39;aide d&amp;#39;un peu de Linq to Object et de Reflexion, on peut s&amp;#39;en sortir. 
&lt;/p&gt;
&lt;h2&gt;Linq et Reflexion&lt;/h2&gt;
&lt;p&gt;
Il existe en effet un moyen d&amp;#39;obtenir les valeurs d&amp;#39;une Enum par la r&amp;eacute;flexion, en utilisant la m&amp;eacute;thode&amp;nbsp;&lt;font face="courier new,courier"&gt;GetFields()&lt;/font&gt; sur le type de l&amp;#39;Enum dont on souhaite obtenir les valeurs.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&lt;font face="courier new,courier"&gt;GetFields()&lt;/font&gt; retourne un tableau de &lt;font face="courier new,courier"&gt;FieldInfo&lt;/font&gt;. Une Enum pr&amp;eacute;sente alors ses diff&amp;eacute;rentes valeurs comme un tableau de champs. En plus de ces champs, &lt;font face="courier new,courier"&gt;GetFields()&lt;/font&gt; retournera aussi des &amp;eacute;l&amp;eacute;ments qui ne sont pas des valeurs&amp;nbsp;de l&amp;#39;&amp;eacute;num&amp;eacute;ration mais d&amp;#39;autres champs de la classe. Au sein de &lt;font face="courier new,courier"&gt;FieldInfo&lt;/font&gt; vous trouverez un ensemble de m&amp;eacute;thodes nomm&amp;eacute;es &lt;font face="courier new,courier"&gt;&lt;strong&gt;Is&lt;/strong&gt;xxx()&lt;/font&gt;, l&amp;#39;une d&amp;#39;entre elles nous int&amp;eacute;resse plus particuli&amp;egrave;rement ici; c&amp;#39;est &lt;font face="courier new,courier"&gt;IsLiteral&lt;/font&gt;. Toutes les valeurs&amp;nbsp;de l&amp;#39;&amp;eacute;num&amp;eacute;ration&amp;nbsp;retournent True. La solution est alors simple en ajoutant &amp;agrave; la R&amp;eacute;flexion un peu de Linq to Object : 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;var enumType = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(monEnumeration);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;var fields =  from field &lt;span class="kwrd"&gt;in&lt;/span&gt; enumType.GetFields()
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;              &lt;span class="kwrd"&gt;where&lt;/span&gt; field.IsLiteral
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;              select field.GetValue(&lt;span class="kwrd"&gt;null&lt;/span&gt;).ToString();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;LaCombobox.ItemsSource = fields;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
A partir du type de l&amp;#39;&amp;eacute;num&amp;eacute;ration (ligne 1) on construit une requ&amp;ecirc;te&amp;nbsp;Linq to Object qui filtre tous les champs ayant &lt;font face="courier new,courier"&gt;IsLiteral&lt;/font&gt; &amp;agrave; vrai et qui s&amp;eacute;lectionne la valeur de ce champ sous la forme d&amp;#39;une string. 
&lt;/p&gt;
&lt;p&gt;
Ne reste plus qu&amp;#39;&amp;agrave; faire le binding entre cette requ&amp;ecirc;te Linq et &lt;font face="courier new,courier"&gt;ItemsSource&lt;/font&gt; de la combo box. 
&lt;/p&gt;
&lt;p&gt;
Il faudra ajouter un peu de code&amp;nbsp;pour&amp;nbsp;transformer la&amp;nbsp;cha&amp;icirc;ne s&amp;eacute;lectionn&amp;eacute;e dans la combo en une valeur de l&amp;#39;&amp;eacute;num&amp;eacute;ration gr&amp;acirc;ce &amp;agrave; un&amp;nbsp;appel &amp;agrave; &lt;font face="courier new,courier"&gt;Enum.Parse()&lt;/font&gt;. 
&lt;/p&gt;
&lt;p&gt;
C&amp;#39;est la version simple et courte. Bien entendu dans le cas o&amp;ugrave; on souhaite faire du binding plus automatis&amp;eacute;,&amp;nbsp;notamment directement en Xaml, la solution donn&amp;eacute;e ici est un peu trop simple. L&amp;#39;esprit est le bon mais il manque des petites choses comme&amp;nbsp;un convertisseur de valeurs. 
&lt;/p&gt;
&lt;h2&gt;D&amp;#39;autres versions plus sophistiqu&amp;eacute;es&lt;/h2&gt;
&lt;p&gt;
Il est bien s&amp;ucirc;r possible d&amp;#39;aller plus loin et de formuler une solution plus sophistiqu&amp;eacute;e qui permettent de faire du binding en Xaml notamment. Je vous laisse y r&amp;eacute;fl&amp;eacute;chir, &amp;ccedil;a fait un bon excercice C# et ce n&amp;#39;est pas un MVP C# qui vous dira que s&amp;#39;entra&amp;icirc;ner mentalement de la sorte sur le langage est inutile ! :-) 
&lt;/p&gt;
&lt;p&gt;
Mais sachez que d&amp;#39;autres y ont d&amp;eacute;j&amp;agrave; pens&amp;eacute; et ont propos&amp;eacute; des solutions souvent assez proches (ce probl&amp;egrave;me ne peut pas &amp;ecirc;tre r&amp;eacute;solu de dix milles fa&amp;ccedil;ons). En voici quelques unes dans lesquelles vous pourrez piocher mati&amp;egrave;re &amp;agrave; aller plus loin : 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a href="http://www.dolittle.com/blogs/einar/archive/2008/01/13/missing-enum-getvalues-when-doing-silverlight-for-instance.aspx" target="_blank"&gt;Blog&amp;#39;A&amp;#39;Little (missing GetValues)&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a href="http://forums.silverlight.net/forums/t/45699.aspx" target="_blank"&gt;Forum Silverlight (binding button group)&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a href="http://forums.silverlight.net/forums/p/23171/299949.aspx" target="_blank"&gt;Forum Silverlight (databinding to an enumeration)&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a href="http://brantob.wordpress.com/2008/10/08/binding-a-combo-box-to-an-enum-with-silverlight-2/" target="_blank"&gt;Brant&amp;#39;s Web blog (binding combobox&lt;/a&gt;) 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a href="http://www.telerik.com/community/forums/silverlight/combobox/enumeration-binding-to-a-combobox.aspx" target="_blank"&gt;Telerik forums (enumeration binding)&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	et d&amp;#39;autres que vous trouverez certainement vous-m&amp;ecirc;mes ! 
	&lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Silverlight c&amp;#39;est sympa et en plus &amp;ccedil;a fait travailler les m&amp;eacute;ninges, que du bon !&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Stay Tuned ! 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/28C28V8P22Y" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/28C28V8P22Y/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/10/09/Silverlight-EnumGetValues-qui-nexiste-pas-binding-et-autres-considerations.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=8d8f4a13-698b-4666-b68e-d8fe9a7d0f1e</guid>
      <pubDate>Fri, 09 Oct 2009 00:23:00 +0200</pubDate>
      <category>Articles</category>
      <category>Astuce</category>
      <category>LINQ</category>
      <category>Réflexion</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=8d8f4a13-698b-4666-b68e-d8fe9a7d0f1e</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=8d8f4a13-698b-4666-b68e-d8fe9a7d0f1e</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/10/09/Silverlight-EnumGetValues-qui-nexiste-pas-binding-et-autres-considerations.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=8d8f4a13-698b-4666-b68e-d8fe9a7d0f1e</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=8d8f4a13-698b-4666-b68e-d8fe9a7d0f1e</feedburner:origLink></item>
    <item>
      <title>Fichiers PFX de signature de projet Visual Studio / objet déjà existant après migration Windows 7</title>
      <description>&lt;p&gt;
Vous l&amp;#39;avez compris, l&amp;#39;entr&amp;eacute;e de blog d&amp;#39;aujourd&amp;#39;hui ne parle pas de Silverlight ni d&amp;#39;autres sujets technologiques passionnants mais d&amp;#39;un probl&amp;egrave;me tr&amp;egrave;s ennuyeux intervenant apr&amp;egrave;s la migration sous Windows 7. Cela concerne les projets sign&amp;eacute;s num&amp;eacute;riquement sous Visual Studio, ceux poss&amp;eacute;dant un fichier PFX donc. 
&lt;/p&gt;
&lt;p&gt;
Une fois cette migration effectu&amp;eacute;e, tout semble tellement bien marcher que vous lancer fi&amp;egrave;rement Visual Studio sans vous douter du complot sournois qui se trame contre vous et qui se r&amp;eacute;v&amp;egrave;lera au moment o&amp;ugrave; vous tenterez d&amp;#39;ouvrir une solution contenant des projets sign&amp;eacute;s... Vous allez me dire, l&amp;#39;attente est courte. En effet, il est rare d&amp;#39;ouvrir VS juste pour le plaisir de le regarder, assez rapidement, m&amp;ecirc;me pour les plus lents d&amp;#39;entre nous, on finit par faire Fichier / Ouvrir (les plus cr&amp;eacute;atifs pr&amp;eacute;f&amp;eacute;rant Fichier / Nouveau, mais ce n&amp;#39;est pas le sujet du jour). 
&lt;/p&gt;
&lt;p&gt;
A ce moment l&amp;agrave;, tous les projets sign&amp;eacute;s d&amp;eacute;clenchent une importation du fichier PFX (m&amp;ecirc;me si vous &amp;ecirc;tes toujours sur la m&amp;ecirc;me machine et que rien n&amp;#39;a chang&amp;eacute;, n&amp;#39;oubliez pas que cette machine vient de migrer de Vista &amp;agrave; 7 !). Comme vous &amp;ecirc;tes un d&amp;eacute;veloppeur honn&amp;ecirc;te, vous connaissez bien entendu les mots de passe des fichiers PFX de vos projets. Donc pas de probl&amp;egrave;me vous tapez le mot de passe. Bang ! Erreur &amp;quot;l&amp;#39;objet existe d&amp;eacute;j&amp;agrave;&amp;quot; (Object already exists). Et pour peu que votre solution contienne des dizaines de projets, ce qui est mon cas assez fr&amp;eacute;quemment, vous allez boucler sur cette s&amp;eacute;quence pour tous les fichiers PFX. A la fin vous pourrez travailler sur votre solution, mais &amp;agrave; toute tentative de compilation vous vous reprendrez la m&amp;ecirc;me s&amp;eacute;quence : importation de la cl&amp;eacute;, demande de mot de passe, &amp;eacute;chec pour cause d&amp;#39;objet existant, etc pour chaque projet sign&amp;eacute;. 
&lt;/p&gt;
&lt;p&gt;
C&amp;#39;est un peu g&amp;ecirc;nant... Mais il existe une raison et une solution ! 
&lt;/p&gt;
&lt;p&gt;
La raison, en tout cas pour ce que j&amp;#39;en ai vu, c&amp;#39;est que la migration vers W7 modifie les droits du r&amp;eacute;pertoire dans lequel sont cach&amp;eacute;s les cl&amp;eacute;s import&amp;eacute;es. Pourquoi ? Je n&amp;#39;en sais rien et pour l&amp;#39;instant je n&amp;#39;ai rien trouv&amp;eacute; sur le Web &amp;agrave; ce sujet. 
&lt;/p&gt;
&lt;p&gt;
En tout cas, le probl&amp;egrave;me &amp;eacute;tant identifi&amp;eacute;, il existe une solution : changer les droits et s&amp;#39;approprier le dit r&amp;eacute;pertoire. Ca peut &amp;ecirc;tre plus compliqu&amp;eacute; que pr&amp;eacute;vu, en tout cas j&amp;#39;ai gal&amp;eacute;r&amp;eacute; un peu (j&amp;#39;avoue franchement ne pas avoir un niveau d&amp;#39;expert&amp;nbsp;en mati&amp;egrave;re de gestion de s&amp;eacute;curit&amp;eacute; sous Windows). En effet il faut d&amp;eacute;j&amp;agrave; trouver le r&amp;eacute;pertoire en question. (roulements de tambours) c&amp;#39;est... c&amp;#39;est... &lt;font face="courier new,courier"&gt;&lt;strong&gt;C:\Users\All Users\Microsoft\Crypto\RSA&lt;/strong&gt;&lt;/font&gt; 
&lt;/p&gt;
&lt;p&gt;
Maintenant que faire... Clic droit sur le r&amp;eacute;pertoire (dont l&amp;#39;image poss&amp;egrave;de un petit verrou d&amp;#39;ailleurs, verrou qui disparaitra en fin de manip), onglet s&amp;eacute;curit&amp;eacute; et on essaye de s&amp;#39;approprier tout &amp;ccedil;a. Ca plantouille car Windows r&amp;eacute;pond qu&amp;#39;on n&amp;#39;a pas les droits sur xxxx (&amp;agrave; remplacer par le nom imbuvable de chaque fichier de ce r&amp;eacute;pertoire, justement ceux posant probl&amp;egrave;me). 
&lt;/p&gt;
&lt;p&gt;
Bref, il faut y aller &amp;agrave; la main. On entre dans le r&amp;eacute;petoire et on fait un clic droit / s&amp;eacute;curit&amp;eacute; sur chaque fichier. Certains laissent voir la page S&amp;eacute;curit&amp;eacute; imm&amp;eacute;diatement. Laissez tomber. Mais un certain nombre d&amp;#39;autres fichiers affichent un message vous indiquant que vous n&amp;#39;avez pas le droit de voir l&amp;#39;onglet S&amp;eacute;curit&amp;eacute; ! Heureusement Windows vous permet de vous les approprier, donc d&amp;#39;en devenir le propri&amp;eacute;taire (au passage je vois mal l&amp;#39;int&amp;eacute;r&amp;ecirc;t d&amp;#39;interdire un truc en proposant de l&amp;#39;autoriser, je vous l&amp;#39;ai dit, je ne suis pas un expert en S&amp;eacute;curit&amp;eacute; Windows !). C&amp;#39;est ce que j&amp;#39;ai fait pour chaque fichier. En fin de manip j&amp;#39;ai recommenc&amp;eacute; la modification des droits sur le r&amp;eacute;pertoire lui-m&amp;ecirc;me, et l&amp;agrave; c&amp;#39;est pass&amp;eacute;. Plus de petit verrou affich&amp;eacute; dans le symbole dossier. 
&lt;/p&gt;
&lt;p&gt;
Et imm&amp;eacute;diatement, Visual Studio ne redemande plus l&amp;#39;importation des cl&amp;eacute;s. Ca remarche. Ouf ! 
&lt;/p&gt;
&lt;p&gt;
Je suis convaincu que je m&amp;#39;y suis pris comme un pied pour r&amp;eacute;gler le probl&amp;egrave;me (il doit y avoir plus simple et plus propre que de devenir propri&amp;eacute;taire de chaque fichier un par un), en tout cas &amp;ccedil;a r&amp;egrave;gle bien le probl&amp;egrave;me qui avait &amp;eacute;t&amp;eacute; bien identifi&amp;eacute; : probl&amp;egrave;me de droits sur le r&amp;eacute;pertoire des cl&amp;eacute;s. 
&lt;/p&gt;
&lt;p&gt;
Pour l&amp;#39;instant c&amp;#39;est la seule surprise que j&amp;#39;ai eu en migrant cette machine de Vista &amp;agrave; Windows 7. Le reste marche tr&amp;egrave;s bien et on ne perd rien ce qui est tr&amp;egrave;s appr&amp;eacute;ciable (comme j&amp;#39;aurai aim&amp;eacute; que cette option de migration sans douleur existe sur les anciennes versions de Windows !). 
&lt;/p&gt;
&lt;p&gt;
J&amp;#39;esp&amp;egrave;re que le r&amp;eacute;cit de cette m&amp;eacute;saventure (et surtout sa solution) &amp;eacute;vitera &amp;agrave; certains de perdre quelques heures... Si oui, n&amp;#39;h&amp;eacute;sitez pas &amp;agrave; me le dire, &amp;ccedil;a fait toujours plaisir de savoir qu&amp;#39;un billet a &amp;eacute;t&amp;eacute; utile ! 
&lt;/p&gt;
&lt;p&gt;
Et sir parmi vous il y en a qui sont plus dou&amp;eacute;s que moi niveau s&amp;eacute;curit&amp;eacute; Windows, qu&amp;#39;ils n&amp;#39;h&amp;eacute;sitent pas &amp;agrave; indiquer la &amp;quot;bonne&amp;quot; manip pour arriver au r&amp;eacute;sultat je modifierai en cons&amp;eacute;quence le pr&amp;eacute;sent billet... 
&lt;/p&gt;
&lt;p&gt;
Dans tous les cas,&amp;nbsp;Stay Tuned ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/BZNaSla_vIU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/BZNaSla_vIU/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/10/08/Fichiers-PFX-de-signature-de-projet-Visual-Studio-objet-deja-existant-apres-migration-Windows-7.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=64fb5011-79f9-458b-80ea-c37d8e9ea603</guid>
      <pubDate>Thu, 08 Oct 2009 01:16:00 +0200</pubDate>
      <category>Astuce</category>
      <category>Bug</category>
      <category>Sécurité</category>
      <category>Visual Studio</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=64fb5011-79f9-458b-80ea-c37d8e9ea603</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=64fb5011-79f9-458b-80ea-c37d8e9ea603</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/10/08/Fichiers-PFX-de-signature-de-projet-Visual-Studio-objet-deja-existant-apres-migration-Windows-7.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=64fb5011-79f9-458b-80ea-c37d8e9ea603</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=64fb5011-79f9-458b-80ea-c37d8e9ea603</feedburner:origLink></item>
    <item>
      <title>Silverlight : Contrôle et zone cliquable, astuce...</title>
      <description>&lt;p&gt;
Une petite astuce toute simple pour aujourd&amp;#39;hui&amp;nbsp;(une fois que l&amp;#39;on conna&amp;icirc;t la r&amp;eacute;ponse).
&lt;/p&gt;
&lt;h2&gt;Un contr&amp;ocirc;le tr&amp;egrave;s basique pour commencer&lt;/h2&gt;
&lt;p&gt;
Prenons un contr&amp;ocirc;le, un UserControl carr&amp;eacute; avec un joli cercle &amp;agrave; l&amp;#39;int&amp;eacute;rieur. Pour que tout cela soit facile &amp;agrave; comprendre et &amp;agrave; tester, disons que le UserControl fait 200x200 pixels, et que l&amp;#39;ellipse &amp;agrave; l&amp;#39;int&amp;eacute;rieur remplie toute la zone (c&amp;#39;est un cercle donc). Cette ellipse aura un Stroke noir par exemple et une &amp;eacute;paisseur de trait de 12. Le LayoutRoot sera un Canvas.
&lt;/p&gt;
&lt;p&gt;
Donc, nous avons : un UserControl de 200x200 contenant un Canvas (toutes les propri&amp;eacute;t&amp;eacute;s par d&amp;eacute;faut), ce Canvas contient une ellipse qui remplit la zone du contr&amp;ocirc;le,&amp;nbsp;l&amp;#39;ellipse poss&amp;egrave;de un Stroke de 12 en noir. En gros nous avons dessin&amp;eacute; un cercle noir sur fond transparent.
&lt;/p&gt;
&lt;p&gt;
&amp;quot;Hou la la ! Mais c&amp;#39;est du super haut niveau tout &amp;ccedil;a !&amp;quot; ... On ne s&amp;#39;inqui&amp;egrave;te pas, &amp;ccedil;a va tr&amp;egrave;s vite se compliquer ...
&lt;/p&gt;
&lt;p&gt;
Premi&amp;egrave;re petite am&amp;eacute;lioration : nous allons mettre un curseur personnalis&amp;eacute; &amp;agrave; notre contr&amp;ocirc;le. Dans les propri&amp;eacute;t&amp;eacute;s du UserControl, propri&amp;eacute;t&amp;eacute; Cursor, on choisit Hand, (la main). Et on ex&amp;eacute;cute (F5).
&lt;/p&gt;
&lt;h2&gt;Ca se complique...&lt;/h2&gt;
&lt;p&gt;
Passer la souris au-dessus de votre magnifique contr&amp;ocirc;le : la main s&amp;#39;affiche bien, mais uniquement lorsque votre souris survole le Stroke du cercle ! Rien&amp;nbsp;&amp;agrave; l&amp;#39;int&amp;eacute;rieur.
&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est ce qu&amp;#39;il se passe ?&lt;/h2&gt;
&lt;p&gt;
Pour ce que j&amp;#39;en comprends, tout ce qui n&amp;#39;a pas une brosse n&amp;#39;existe pas. Notre contr&amp;ocirc;le et le Canvas sous-jacent n&amp;#39;ont pour l&amp;#39;instant aucune couleur de fond (Background). L&amp;#39;ellipse n&amp;#39;a pas de Fill non plus. Tous ces espaces &amp;quot;sans rien&amp;quot; ne sont visiblement pas d&amp;eacute;tect&amp;eacute;s. Bug ou feature, apr&amp;egrave;s tout &amp;ccedil;a peut &amp;ecirc;tre l&amp;#39;un ou l&amp;#39;autre selon le point de vue...
&lt;/p&gt;
&lt;h2&gt;Mais comment r&amp;eacute;gler le probl&amp;egrave;me ?&lt;/h2&gt;
&lt;p&gt;
En fait qu&amp;#39;importe qu&amp;#39;il s&amp;#39;agisse d&amp;#39;un probl&amp;egrave;me ou d&amp;#39;un choix d&amp;eacute;lib&amp;eacute;r&amp;eacute; des concepteurs, nous devons remplir ces &amp;quot;riens&amp;quot; si nous voulons que le curseur de souris (et la zone cliquable du contr&amp;ocirc;le) apparaisse sur toute la surface.
&lt;/p&gt;
&lt;p&gt;
Mais il est hors de question d&amp;#39;aller placer une brosse, donc une couleur, pour faire ce travail ! On pourrait bien entendu mettre un Background blanc au Canvas, cela r&amp;egrave;glerait le probl&amp;egrave;me. Mais si nous changeons le fond de notre page, nous allons obtenir un cercle dans un carr&amp;eacute; blanc sur un fond diff&amp;eacute;rent. Une horreur. Quant &amp;agrave; s&amp;#39;enliser dans l&amp;#39;erreur pour faire en sorte de trouver une astuce pour que le fond de notre UserControl soit synchro avec celui de son conteneur parent... 
&lt;/p&gt;
&lt;h2&gt;Une &amp;quot;fausse&amp;quot; brosse&lt;/h2&gt;
&lt;p&gt;
Il faut remplir notre ellipse pour que le curseur soit visible et que m&amp;ecirc;me son espace int&amp;eacute;rieur soit cliquable. Mais pas avec n&amp;#39;importe quoi. Xaml nous fournit une brosse un peu sp&amp;eacute;ciale, disons une &amp;quot;non brosse&amp;quot;, ou une &amp;quot;fausse&amp;quot; brosse puisque visuellement elle ne se voit pas. Il s&amp;#39;agit de la brosse &amp;quot;&lt;font face="courier new,courier"&gt;Transparent&lt;/font&gt;&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
D&amp;egrave;s lors, il suffit d&amp;#39;ajouter dans le code Xaml de notre ellipse&lt;font face="courier new,courier"&gt; Fill=&amp;quot;Transparent&amp;quot;&lt;/font&gt; et de relancer l&amp;#39;application. Miracle ! Le curseur en forme de main est visible m&amp;ecirc;me &amp;agrave; l&amp;#39;int&amp;eacute;rieur de l&amp;#39;ellipse. Et si nous changeons la couleur de fond de la page, comme cette brosse est transparente, on n&amp;#39;y verra que du feu ... 
&lt;/p&gt;
&lt;p&gt;
Sous Blend vous pouvez agir directement dans le code Xaml ou bien simplement cliquer sur le carr&amp;eacute; de binding de la propri&amp;eacute;t&amp;eacute; Fill et choisir &amp;quot;custom expression&amp;quot;. Tapez &amp;quot;Transparent&amp;quot; (sans les guillemets) dans le champ de saisie et l&amp;#39;affaire est jou&amp;eacute;e.
&lt;/p&gt;
&lt;p&gt;
Comme quoi, m&amp;ecirc;me un UserControl ne contenant qu&amp;#39;un cercle peut d&amp;eacute;j&amp;agrave; soulever des probl&amp;egrave;mes pas si simples &amp;agrave; r&amp;eacute;soudre. Ca force &amp;agrave; l&amp;#39;humilit&amp;eacute;... :-)
&lt;/p&gt;
&lt;p&gt;
Stay Tuned !
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/7LwnD_gpnzU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/7LwnD_gpnzU/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/10/07/Silverlight-Controle-et-zone-cliquable-astuce.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=a926ce33-d375-439a-89f4-77cc17811122</guid>
      <pubDate>Wed, 07 Oct 2009 04:27:00 +0200</pubDate>
      <category>Design</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=a926ce33-d375-439a-89f4-77cc17811122</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=a926ce33-d375-439a-89f4-77cc17811122</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/10/07/Silverlight-Controle-et-zone-cliquable-astuce.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=a926ce33-d375-439a-89f4-77cc17811122</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=a926ce33-d375-439a-89f4-77cc17811122</feedburner:origLink></item>
    <item>
      <title>Security Essentials enfin disponible ! (un anti virus gratuit)</title>
      <description>&lt;p&gt;
Il y a un bon moment d&amp;eacute;j&amp;agrave; (nov 2008)&amp;nbsp;je vous parlais dans le billet &amp;quot;&lt;a href="http://www.e-naxos.com/Blog/post/2008/11/19/Morro-Vache-(ou-les-nuits-blanches-dAvast-McAfee-et-Symantec).aspx" target="_blank"&gt;&lt;font color="#cccccc"&gt;Morro .. Vache ? (ou les nuits blanches d&amp;#39;Avast, McAfee et Symantec)&lt;/font&gt;&lt;/a&gt;&amp;quot; du projet de Microsoft de rendre sa solution de s&amp;eacute;curit&amp;eacute; One Care gratuite, notamment la partie anti-virus. En juin 2009 je vous annon&amp;ccedil;ais (dans le billet &amp;quot;&lt;a href="http://www.e-naxos.com/Blog/post/2009/06/22/Microsoft-Security-Essentials-en-beta.aspx" target="_blank"&gt;&lt;font color="#cccccc"&gt;Microsoft Security Essentials en b&amp;ecirc;ta&lt;/font&gt;&lt;/a&gt;&amp;quot;) que la solution &lt;strong&gt;Security Essentials&lt;/strong&gt; &amp;eacute;tait pass&amp;eacute;e en phase b&amp;eacute;ta, mais uniquement aux USA.
&lt;/p&gt;
&lt;p&gt;
D&amp;eacute;sormais &lt;strong&gt;vous aussi vous pouvez utiliser Security Essentials gratuitement&lt;/strong&gt; ! Simplement en vous rendant sur &lt;a href="http://www.microsoft.com/security_essentials/default.aspx?mkt=fr-fr" target="_blank"&gt;&lt;strong&gt;le site de Security Essentials &lt;/strong&gt;&lt;/a&gt;et en t&amp;eacute;l&amp;eacute;chargeant le logiciel. Il existe des versions localis&amp;eacute;es (en Fran&amp;ccedil;ais entre autres) et l&amp;#39;installation s&amp;#39;effectue en un clin d&amp;#39;oeil. Apr&amp;egrave;s le t&amp;eacute;l&amp;eacute;chargement des mises &amp;agrave; jour et un balayage rapide de vos disques, SE va s&amp;#39;occuper de tous les virus, malwares et autres spywares qui veulent saboter votre PC.
&lt;/p&gt;
&lt;p&gt;
Comparativement &amp;agrave; la meilleure solution gratuite alternative utilis&amp;eacute;e jusqu&amp;#39;&amp;agrave; maintenant, Avast, Security Essentials est moins gourmand, plus efficace, mais en revanche s&amp;#39;occupe de moins de choses. Par exemple Avast utilise 7 processus diff&amp;eacute;rents pour le mail, les sites web filtr&amp;eacute;s (anti pub), etc. Lorsqu&amp;#39;on utilise S.E. on ne dispose plus de ces petits avantages qu&amp;#39;on retrouvent soit avec des logiciels gratuits suppl&amp;eacute;mentaires, soit en configurant correctement son PC et son browser ! 
&lt;/p&gt;
&lt;p&gt;
Personnellement j&amp;#39;ai opt&amp;eacute; pour cette derni&amp;egrave;re approche suivant le principe que toute solution de s&amp;eacute;curit&amp;eacute; fiable se doit d&amp;#39;&amp;ecirc;tre simple avant d&amp;#39;&amp;ecirc;tre sophistiqu&amp;eacute;e... Ainsi, en param&amp;eacute;trant correctement IE8 et le pare-feu de Windows, sans parler bien entendu du param&amp;eacute;trage de la box internet, on arrive &amp;agrave; une s&amp;eacute;curit&amp;eacute; certainement aussi totale qu&amp;#39;avec 50 logiciels ultra sophistiqu&amp;eacute;s...
&lt;/p&gt;
&lt;p&gt;
Dans tous les cas, avec Security Essentials, Microsoft s&amp;#39;invite dans le petit monde des anti virus gratuits. Nul doute que la surench&amp;egrave;re que cela va imposer &amp;agrave; ses concurrents va mettre un coup de pied dans la foumili&amp;egrave;re un peu trop tranquille qu&amp;#39;&amp;eacute;tait devenu ce march&amp;eacute; des anti-virus !
&lt;/p&gt;
&lt;p&gt;
Sortez couvert !
&lt;/p&gt;
&lt;p&gt;
(et Stay Tuned, cela va sans dire :-) )
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/zFLsT_ua8SI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/zFLsT_ua8SI/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/09/30/Security-Essentials-enfin-disponible-!-(un-anti-virus-gratuit).aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=f306ce86-6a03-4885-a05a-385e699194b0</guid>
      <pubDate>Wed, 30 Sep 2009 00:27:00 +0200</pubDate>
      <category>Annonce</category>
      <category>Logiciel</category>
      <category>Sécurité</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=f306ce86-6a03-4885-a05a-385e699194b0</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=f306ce86-6a03-4885-a05a-385e699194b0</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/09/30/Security-Essentials-enfin-disponible-!-(un-anti-virus-gratuit).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=f306ce86-6a03-4885-a05a-385e699194b0</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=f306ce86-6a03-4885-a05a-385e699194b0</feedburner:origLink></item>
    <item>
      <title>44 Videos US et 11 Ateliers en français sur Silverlight !</title>
      <description>&lt;p&gt;
Dans un billet de 2008 je vous parlais de l&amp;#39;extraordinaire travail publi&amp;eacute; par &lt;a href="http://mtaulty.com/communityserver/blogs/mike_taultys_blog/default.aspx" target="_blank"&gt;Mike Taulty&lt;/a&gt;,&amp;nbsp; &lt;a href="http://www.e-naxos.com/Blog/post.aspx?id=2daeb364-08f2-474f-84d5-3d703b1f854b" target="_blank"&gt;44 vid&amp;eacute;o autour de Silverlight &lt;/a&gt;(V 2 &amp;agrave; l&amp;#39;&amp;eacute;poque) !&amp;nbsp;Cette s&amp;eacute;rie reste toujours d&amp;#39;actualit&amp;eacute; pour se former, mais elle&amp;nbsp;peut g&amp;ecirc;ner&amp;nbsp;ceux qui ne pratiquent pas assez bien l&amp;#39;anglais pour capter chaque le&amp;ccedil;on. Si j&amp;#39;en reparle c&amp;#39;est que les liens que j&amp;#39;avais donn&amp;eacute;s &amp;agrave; l&amp;#39;&amp;eacute;poque ne sont plus bons&amp;nbsp;et qu&amp;#39;il &amp;eacute;tait n&amp;eacute;cessaire de les r&amp;eacute;actualiser (gr&amp;acirc;ce &amp;agrave; la vigilance d&amp;#39;un lecteur que je remercie au passage !). C&amp;#39;est chose faite dans le pr&amp;eacute;sent billet. 
&lt;/p&gt;
&lt;p&gt;
Mais&amp;nbsp;j&amp;#39;en profite aussi pour vous parler &lt;strong&gt;d&amp;#39;une superbe s&amp;eacute;rie d&amp;#39;ateliers&lt;/strong&gt; que Microsoft vient de mettre en ligne. Le &lt;strong&gt;coach Silverlight&lt;/strong&gt; (&lt;a href="http://blogs.msdn.com/davrous/" target="_blank"&gt;David Rousset &lt;/a&gt;bien&amp;nbsp;connu pour son blog&amp;nbsp;notamment) a beaucoup travaill&amp;eacute; cet &amp;eacute;t&amp;eacute; pendant que vous profitiez de la plage ! Il &amp;eacute;tait pr&amp;eacute;vu &amp;agrave; l&amp;#39;origine que les 12 ateliers soient mis en ligne progressivement (David veut &amp;eacute;crire un petit topo avec chaque module et &amp;ccedil;a r&amp;eacute;clame un peu de temps). Mais devant le succ&amp;egrave;s des premiers modules et l&amp;#39;insistance des lecteurs, Microsoft a d&amp;eacute;cid&amp;eacute; de mettre tous les ateliers en ligne, David compl&amp;egrave;tera les modules de leur petit topo au fur et &amp;agrave; mesure. 
&lt;/p&gt;
&lt;p&gt;
Si on compte bien, 44 + 11&amp;nbsp;&amp;ccedil;a donne&amp;nbsp;55 modules de formation gratuits pour prendre en main Silverlight... Les longues soir&amp;eacute;es d&amp;#39;automne vont &amp;ecirc;tre charg&amp;eacute;es et vous pouvez d&amp;#39;ores et d&amp;eacute;j&amp;agrave; pr&amp;eacute;voir de laisser votre Wii &amp;agrave; vos enfants, vous n&amp;#39;allez&amp;nbsp;pas beaucoup y toucher dans les semaines &amp;agrave; venir !&amp;nbsp;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
L&amp;#39;acc&amp;egrave;s direct aux sommaire des 44 casts US : &lt;a href="http://misfitgeek.com/blog/44-silverlight-videos/"&gt;http://misfitgeek.com/blog/44-silverlight-videos/&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Le sommaire pour se mettre l&amp;#39;eau &amp;agrave; la bouche : 
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Hello World&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Anatomy of an Application&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - The VS Environment&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Content Controls&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Built-In Controls&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Width, Height, Margins, Padding, Alignment&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Using a GridSplitter&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Grid Layout&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - StackPanel Layout&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Canvas Layout&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Databinding UI to .NET Classes&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Simple Styles&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Custom Types in XAML&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Binding with Conversion&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - List Based Data Binding&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Simple User Control&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Templating a Button&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Resources from XAP/DLL/Site Of Origin&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Animations &amp;amp; Storyboards&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Uploads with WebClient&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Downloads with WebClient&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Calling HTTPS Web Services&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Calling Web Services&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Making Cross Domain Requests&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Using HttpWebRequest&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - File Dialogs and User Files&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Using Sockets&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Using Isolated Storage&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - .NET Code Modifying HTML&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Using Isolated Storage Quotas&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Calling JavaScript from .NET&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Evaluating JavaScript from .NET Code&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Handling HTML Events in .NET Code&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Handling .NET Events in JavaScript&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Calling .NET from JavaScript&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Displaying a Custom Splash Screen&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Passing Parameters from your Web Page&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Loading Media at Runtime&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Dynamically Loading Assemblies/Code&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Reading/Writing XML&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Multiple Threads with BackgroundWorker&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Insert/Update/Delete with the DataGrid&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Getting Started with the DataGrid&lt;/strong&gt; &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Silverlight - Embedding Custom Fonts&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Le coach fran&amp;ccedil;ais : &lt;a href="http://msdn.microsoft.com/fr-fr/silverlight/msdn.coachsilverlight.aspx"&gt;http://msdn.microsoft.com/fr-fr/silverlight/msdn.coachsilverlight.aspx&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Et le sommaire pour vous donner encore plus envie d&amp;#39;y aller tout de suite : 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl41" href="http://msdn.microsoft.com/fr-fr/silverlight/ee431709.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl41',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Pr&amp;eacute;sentation g&amp;eacute;n&amp;eacute;rale de Silverlight 3&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl43" href="http://msdn.microsoft.com/fr-fr/silverlight/ee423633.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl43',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Quels outils utiliser ?&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl45" href="http://msdn.microsoft.com/fr-fr/silverlight/ee423639.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl45',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Les bases d&amp;rsquo;une application Silverlight&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl47" href="http://msdn.microsoft.com/fr-fr/silverlight/ee441169.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl47',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Atelier 1 : Concepts principaux : XAML, formes de base, gestion &amp;eacute;v&amp;egrave;nements&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl49" href="http://msdn.microsoft.com/fr-fr/silverlight/ee441170.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl49',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Atelier 2 : Gestion de la vid&amp;eacute;o avec Silverlight et Web Client&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl51" href="http://msdn.microsoft.com/fr-fr/silverlight/ee441171.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl51',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Atelier 3 : Les styles, le templating et le DataBinding&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl53" href="http://msdn.microsoft.com/fr-fr/silverlight/ee441172.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl53',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Atelier 4 : Binding entre &amp;eacute;l&amp;eacute;ments, transformations et projection 3D&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl55" href="http://msdn.microsoft.com/fr-fr/silverlight/ee441173.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl55',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Atelier 5 : Animations classiques, Easy Animations et moteur physique&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl57" href="http://msdn.microsoft.com/fr-fr/silverlight/ee441174.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl57',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Atelier 6 : WCF et Silverlight 3&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl59" href="http://msdn.microsoft.com/fr-fr/silverlight/ee441175.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl59',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Atelier 7 : SandBoxing, Open/SaveFileDialog, Quota&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl61" href="http://msdn.microsoft.com/fr-fr/silverlight/ee441176.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl61',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Atelier 8 : Pixel Shaders&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl63" href="http://msdn.microsoft.com/fr-fr/silverlight/ee441177.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl63',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Atelier 9 : L&amp;rsquo;acc&amp;eacute;l&amp;eacute;ration mat&amp;eacute;rielle avec le GPU&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl65" href="http://msdn.microsoft.com/fr-fr/silverlight/ee441178.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl65',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Atelier 10 : Out of Browser et les autres nouveaut&amp;eacute;s de Silverlight 3&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a id="ctl00_mainContentContainer_ctl02_ctl06_ctl67" href="http://msdn.microsoft.com/fr-fr/silverlight/ee441179.aspx" onclick="javascript:Track('ctl00_mainContentContainer_ctl02_ctl06_ctl39|ctl00_mainContentContainer_ctl02_ctl06_ctl67',this);"&gt;&lt;strong&gt;&lt;font color="#0033cc"&gt;Atelier 11 : Introduction &amp;agrave; .NET RIA Services&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; 
	&lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Stay Tuned pour d&amp;#39;autres infos ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/rxY7_apwxZo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/rxY7_apwxZo/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/09/25/44-Videos-US-et-11-Ateliers-en-francais-sur-Silverlight-!.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=4c025b80-f93b-47ac-b826-d8d25013ce9c</guid>
      <pubDate>Fri, 25 Sep 2009 22:41:00 +0200</pubDate>
      <category>Annonce</category>
      <category>Design</category>
      <category>Données</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=4c025b80-f93b-47ac-b826-d8d25013ce9c</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=4c025b80-f93b-47ac-b826-d8d25013ce9c</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/09/25/44-Videos-US-et-11-Ateliers-en-francais-sur-Silverlight-!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=4c025b80-f93b-47ac-b826-d8d25013ce9c</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=4c025b80-f93b-47ac-b826-d8d25013ce9c</feedburner:origLink></item>
    <item>
      <title>Blend survey : donnez votre avis pour le prochain Blend 4 !</title>
      <description>&lt;p&gt;
Microsoft pr&amp;eacute;pare d&amp;eacute;j&amp;agrave; la prochaine version de Blend qui, avec la version 3, est d&amp;eacute;j&amp;agrave; un outil d&amp;#39;une grande maturit&amp;eacute;. Mais on peut toujours faire mieux... Alors au lieu de grogner dans votre coin,&amp;nbsp;dites ce que vous aimez&amp;nbsp;ou pas, proposez ce qui vous semble manquer, bref&amp;nbsp;r&amp;eacute;pondez au sondage lanc&amp;eacute; par l&amp;#39;&amp;eacute;quipe Blend : &lt;a href="https://connect.microsoft.com/Expression/Survey/Survey.aspx?SurveyID=9391"&gt;https://connect.microsoft.com/Expression/Survey/Survey.aspx?SurveyID=9391&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Attention, ce sondage est assez long (pas &amp;eacute;norme mais bien plus que trois cases &amp;agrave; cocher) pr&amp;eacute;voyez un petit quart d&amp;#39;heure, et, of course, totalement en anglais avec pas mal de zones de commentaires qu&amp;#39;il faudra remplir dans la m&amp;ecirc;me langue. N&amp;#39;oubliez pas que google traduction est votre ami et qu&amp;#39;il vaut mieux donner votre avis que de vous taire, m&amp;ecirc;me si certains commentaires sont traduits par une machine (demandez &amp;agrave; un coll&amp;egrave;gue plus anglophone que vous de relire quand m&amp;ecirc;me :-) ).
&lt;/p&gt;
&lt;p&gt;
A la cl&amp;eacute;, un Zune &amp;agrave; gagner par tirage au sort. Mais surtout, un Blend 4 plus proche de vos besoins.
&lt;/p&gt;
&lt;p&gt;
Alors exprimez-vous !
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/u3mXvxfENBI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/u3mXvxfENBI/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/09/16/Blend-survey-donnez-votre-avis-pour-le-prochain-Blend-4-!.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=54354e6e-5164-4e55-89cf-a657e99f4bce</guid>
      <pubDate>Wed, 16 Sep 2009 05:16:00 +0200</pubDate>
      <category>Annonce</category>
      <category>Design</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=54354e6e-5164-4e55-89cf-a657e99f4bce</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=54354e6e-5164-4e55-89cf-a657e99f4bce</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/09/16/Blend-survey-donnez-votre-avis-pour-le-prochain-Blend-4-!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=54354e6e-5164-4e55-89cf-a657e99f4bce</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=54354e6e-5164-4e55-89cf-a657e99f4bce</feedburner:origLink></item>
    <item>
      <title>Création de jeux et détection de touches clavier multiples sous Silverlight</title>
      <description>&lt;p&gt;
Silverlight est con&amp;ccedil;u pour s&amp;#39;int&amp;eacute;grer dans une cha&amp;icirc;ne de d&amp;eacute;veloppement &amp;quot;s&amp;eacute;rieuse&amp;quot;. Son but est principalement la cr&amp;eacute;ation de RIA (Rich Internet Application) le plus souvent associ&amp;eacute;es &amp;agrave; des applications m&amp;eacute;tier. Il s&amp;#39;agit en fait de porter WPF sur le Web et de faire ainsi &lt;strong&gt;converger applications &amp;quot;desktop&amp;quot; et applications Web de fa&amp;ccedil;on transparente&lt;/strong&gt;. Mais Silverlight est &lt;strong&gt;aussi un merveilleux outil pour &amp;eacute;crire des jeux&lt;/strong&gt; en ligne (ou m&amp;ecirc;me desktop gr&amp;acirc;ce &amp;agrave; la fonction Out-Of-Browser). Plus loin, et j&amp;#39;en parle souvent, les techniques visuelles du jeu ne sont pas &amp;agrave; n&amp;eacute;gliger pour &lt;strong&gt;cr&amp;eacute;er des applications professionnelles disposant d&amp;#39;interfaces innovantes&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
Raison de plus pour se pencher sur la question. Dans les jours pass&amp;eacute;s je vous ai parl&amp;eacute; de la gestion du son (notamment en vous proposant un petit composant capable de rendre possible la synchronisation son/animation - &lt;a href="http://www.e-naxos.com/Blog/post/2009/09/09/AnimatableSoundPlayer-Ou-comment-synchroniser-du-son-sur-une-animation-Silverlight.aspx"&gt;&lt;font color="#cccccc"&gt;AnimatableSoundPlayer. Ou comment synchroniser du son sur une animation Silverlight&lt;/font&gt;&lt;/a&gt;&amp;nbsp;et &lt;a href="http://www.e-naxos.com/Blog/post/2009/09/08/Animations-Sons-Synchronisation-Ease-inout-sous-Blend.aspx"&gt;&lt;font color="#cccccc"&gt;Animations, Sons, Synchronisation, Ease in/out sous Blend&lt;/font&gt;&lt;/a&gt;), aujourd&amp;#39;hui je vais aborder la &lt;strong&gt;gestion du clavier&lt;/strong&gt;. Pour ce qui est de la boucle de jeu, je vous renvoie &amp;agrave; mon billet exposant l&amp;#39;exemple de la neige qui tombe (&lt;a href="http://www.e-naxos.com/Blog/post/2009/08/03/c2ab-Il-neige-c2bb-ou-les-boucles-de28099animation-les-fps-et-les-sprites-sous-Silverlight.aspx"&gt;&lt;strong&gt;&lt;font color="#cccccc"&gt;&amp;laquo; Il neige &amp;raquo; ou les boucles d&amp;rsquo;animation, les fps et les sprites sous Silverlight&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt; ). 
&lt;/p&gt;
&lt;p&gt;
D&amp;#39;abord un petit exemple live. Une fois que vous aurez cliqu&amp;eacute; sur le rectangle &amp;quot;click here to start&amp;quot; vous pourrez d&amp;eacute;placer le carr&amp;eacute; rouge et changer sa taille. Les d&amp;eacute;placements se font &amp;agrave; l&amp;#39;aide des 4 fl&amp;egrave;ches de direction. Pour agrandir l&amp;#39;objet on utilise la combinaison de touche Shift-KeyUp (et Shift-KeyDown pour diminuer la taille). La touche Ctrl est un acc&amp;eacute;l&amp;eacute;rateur pour les mouvements. Ctrl-KeyUp/Down/Left/Right permet donc d&amp;#39;aller plus vite. Ce qui est int&amp;eacute;ressant dans cet exemple est bien entendu la &lt;strong&gt;d&amp;eacute;tection des appuis simultan&amp;eacute;s sur les touches&lt;/strong&gt; et la gestion de ceux-ci. Jouer deux secondes et on y revient : 
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/KeyTrapper/KeyTrapper.xap;width=400;height=400] 
&lt;/p&gt;
&lt;p&gt;
Tout le probl&amp;egrave;me ici est donc de d&amp;eacute;tecter plusieurs touches appuy&amp;eacute;es en m&amp;ecirc;me temps. Silverlight propose une gestion de clavier tr&amp;egrave;s simple : les &amp;eacute;v&amp;eacute;nements KeyDown et KeyUp. Avec &amp;ccedil;a il faut se d&amp;eacute;brouiller. 
&lt;/p&gt;
&lt;p&gt;
Pour une gestion de d&amp;eacute;placement rudimentaire (les 4 directions par les 4 fl&amp;egrave;ches) cela pourrait parfaitement convenir. Mais comment g&amp;eacute;rer les d&amp;eacute;placements en diagonal (KeyUp+KeyLeft par exemple) ou pire des choses du genre Shift-Ctrl-KeyUp/Barre d&amp;#39;espace ? Il faudrait se rappeler dans l&amp;#39;&amp;eacute;v&amp;eacute;nement KeyDown si l&amp;#39;une ou l&amp;#39;autre des touches a &amp;eacute;t&amp;eacute; enfonc&amp;eacute;e et si elle est toujours Down... De plus aucune assurance de l&amp;#39;ordre dans lequel les touches vont arriver (la simultan&amp;eacute;it&amp;eacute; n&amp;#39;existe pas du point de vue du pilote clavier, une touche est forc&amp;eacute;ment avant l&amp;#39;autre). 
&lt;/p&gt;
&lt;p&gt;
Bref cela semble d&amp;#39;un seul coup se compliquer &amp;eacute;norm&amp;eacute;ment ! 
&lt;/p&gt;
&lt;p&gt;
Oui et non. Oui puisque la solution n&amp;#39;est pas directe, non parceque celle-ci n&amp;#39;est pas si compliqu&amp;eacute;e &amp;agrave; trouver. 
&lt;/p&gt;
&lt;h2&gt;La classe KeyLogger&lt;/h2&gt;
&lt;p&gt;
Ne cherchez pas dans l&amp;#39;aide du Framework Silverlight, cette classe n&amp;#39;existe pas :-) Il s&amp;#39;agit justement de la classe que je vous propose aujourd&amp;#39;hui de cr&amp;eacute;er pour g&amp;eacute;rer le petit probl&amp;egrave;me des touches simultan&amp;eacute;es. 
&lt;/p&gt;
&lt;h3&gt;Probl&amp;eacute;matique&lt;/h3&gt;
&lt;p&gt;
On doit pouvoir &amp;agrave; tout moment dans la boucle principale du jeu tester si certaines combinaisons de touches sont actives ou non. On doit aussi pouvoir tester l&amp;#39;appui sur une seule touche. 
&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;
Il n&amp;#39;y a pas de miracle, pour savoir si une ou dix touches sont appuy&amp;eacute;es il faut se souvenir de toutes les touches ayant re&amp;ccedil;u un KeyDown et pas encore de KeyUp. Se souvenir, en informatique, cela signifie stocker des donn&amp;eacute;es. C&amp;#39;est bien ce que nous allons faire en cr&amp;eacute;ant un tableau dont les &amp;eacute;l&amp;eacute;ments seront des&amp;nbsp;bool&amp;eacute;ens et dont l&amp;#39;index sera la valeur de l&amp;#39;&amp;eacute;num&amp;eacute;ration Key (classe du Framework listant les touches accessibles du clavier). Ne reste plus qu&amp;#39;&amp;agrave; g&amp;eacute;rer nous-m&amp;ecirc;mes les KeyUp et KeyDown pour mettre &amp;agrave; vrai/faux les cases correspondantes dans le tableau. Pour tester une combinaison de touches (ou une touche) il suffit alors d&amp;#39;interroger le tableau pour savoir si les touches que nous voulons tester sont toutes &amp;agrave; true. 
&lt;/p&gt;
&lt;h3&gt;Le code&lt;/h3&gt;
&lt;p&gt;
Une fois le probl&amp;egrave;me et la solution pos&amp;eacute;s, il ne reste plus qu&amp;#39;&amp;agrave; coder. Plut&amp;ocirc;t que d&amp;#39;alourdir ce post, je vous renvoie au code source du projet t&amp;eacute;l&amp;eacute;chargeable en fin de billet. Ouvrez-le sous Blend ou Visual Studio, vous comprendrez rapidement comment il fonctionne. 
&lt;/p&gt;
&lt;p&gt;
Le UserControl principal de l&amp;#39;application exemple commence par cr&amp;eacute;er une instance du KeyLogger et l&amp;#39;attache &amp;agrave; lui-m&amp;ecirc;me. On pourrait fort bien attacher un KeyLogger diff&amp;eacute;rent &amp;agrave; diff&amp;eacute;rentes zones &amp;eacute;cran, ici nous optons pour un seul gestionnaire centralis&amp;eacute;. 
&lt;/p&gt;
&lt;p&gt;
La d&amp;eacute;tection du clavier ne marche que si le contr&amp;ocirc;le a le focus. Donner par d&amp;eacute;faut celui-ci au UserControl n&amp;#39;est pas forc&amp;eacute;ment &amp;eacute;vident, je n&amp;#39;ai pas trouv&amp;eacute; de solution qui marche syst&amp;eacute;matiquement. D&amp;#39;o&amp;ugrave; la petite astuce du bouton de d&amp;eacute;marrage&amp;nbsp;: en cliquant dessus je lance l&amp;#39;animation qui le fait dispara&amp;icirc;tre et qui diminue l&amp;#39;opacit&amp;eacute; des instructions mais surtout j&amp;#39;en profite de r&amp;eacute;clamer le focus. Cette technique a l&amp;#39;avantage de fonctionner &amp;agrave; tous les coups. 
&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;
Remplacer le rectangle rouge par une petite fus&amp;eacute;e, ajoutez des blocs rocheux, d&amp;eacute;tectez la barre d&amp;#39;espace pour tirer, utilisez la gestion de sprites pour animer les tirs de laser, agr&amp;eacute;mentez d&amp;#39;une gestion de collision, compl&amp;eacute;tez par une gestion de l&amp;#39;inertie des mouvements... et vous aurez une r&amp;eacute;plique de Asteroid ! Yaka. :-) 
&lt;/p&gt;
&lt;p&gt;
D&amp;eacute;placer des objets ou contr&amp;ocirc;ler des animations via le clavier est l&amp;#39;une des bases de la cr&amp;eacute;ation de jeux. Avec l&amp;#39;exemple de la neige qui tombe nous avions d&amp;eacute;j&amp;agrave; vu la gestion des sprites, vous disposez maintenant des briques pour commencer &amp;agrave; r&amp;eacute;fl&amp;eacute;chir &amp;agrave; des petits jeux sympas (&amp;eacute;viter la cent-milli&amp;egrave;me version de Asteroid ou de Space Invader bien entendu :-) )! 
&lt;/p&gt;
&lt;p&gt;
Amusez-vous bien, et .... Stay Tuned ! 
&lt;/p&gt;
&lt;p&gt;
Code source du projet de la classe KeyLogger : &lt;a href="http://www.e-naxos.com/Blog/file.axd?file=2009%2f9%2fKeyTrapper.zip"&gt;KeyTrapper.zip (78,30 kb)&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/8XKA40Lc0jo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/8XKA40Lc0jo/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/09/10/Boucle-de-jeu-et-detection-de-touches-clavier-multiples-sous-Silverlight.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=f4cc923a-a28b-4727-ab17-70693225fd82</guid>
      <pubDate>Thu, 10 Sep 2009 22:39:00 +0200</pubDate>
      <category>Articles</category>
      <category>Design</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=f4cc923a-a28b-4727-ab17-70693225fd82</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=f4cc923a-a28b-4727-ab17-70693225fd82</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/09/10/Boucle-de-jeu-et-detection-de-touches-clavier-multiples-sous-Silverlight.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=f4cc923a-a28b-4727-ab17-70693225fd82</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=f4cc923a-a28b-4727-ab17-70693225fd82</feedburner:origLink></item>
    <item>
      <title>AnimatableSoundPlayer. Ou comment synchroniser du son sur une animation Silverlight</title>
      <description>&lt;p&gt;
Hier je vous parlais d&amp;#39;animation et de sons et je vous pr&amp;eacute;sentais une &lt;a href="http://www.e-naxos.com/Blog/post/2009/09/08/Animations-Sons-Synchronisation-Ease-inout-sous-Blend.aspx" target="_blank"&gt;petite d&amp;eacute;monstration (l&amp;#39;oscilloscope) &lt;/a&gt;dont le but &amp;eacute;tait de montrer qu&amp;#39;on pouvait rapidement obtenir un effet visuel assez complexe sans programmation pour peu qu&amp;#39;on se donne la peine d&amp;#39;utiliser Blend et ses neurones... Pour synchroniser le bip avec le spot lumineux j&amp;#39;avais alors utilis&amp;eacute; une ruse en indiquant qu&amp;#39;h&amp;eacute;las Silverlight ne permettait pas de &lt;strong&gt;synchroniser du son dans une animation&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
Je vous proposais alors une id&amp;eacute;e de solution en promettant une impl&amp;eacute;mentation le temps de vous laisser r&amp;eacute;fl&amp;eacute;chir. 
&lt;/p&gt;
&lt;p&gt;
Regarder d&amp;#39;abord la d&amp;eacute;mo ci-dessous. En cliquant sur &amp;quot;Start&amp;quot; vous lancerez une animation (StoryBoard) dont le but premier est de d&amp;eacute;placer la boule verte un peu comme dans un billard. Elle rebondit sur des taquets pour finir dans un gobelet. Bien entendu tout cela est assez moche, les beaux dessins ne font pas partie de la question :-) Mais, en revanche, et si votre carte son fonctionne, vous noterez que plusieurs sons peuvent &amp;ecirc;tre entendus en parfaite synchronisation avec les &amp;quot;chocs&amp;quot; de la boule sur les taquets ou dans le gobelet final. Je vous laisse essayer et on en reparle : 
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/SyncSound/SyncSound.xap;width=251;height=242] 
&lt;/p&gt;
&lt;p&gt;
Bon. Vous avez vu et aussi entendu ? 
&lt;/p&gt;
&lt;p&gt;
Comment est-ce possible (sachant que pour l&amp;#39;utilisateur Blend qui cr&amp;eacute;&amp;eacute; l&amp;#39;animation tout cela ne r&amp;eacute;clame aucun code) ? 
&lt;/p&gt;
&lt;p&gt;
Forc&amp;eacute;ment il y a du code... En fait un petit &lt;strong&gt;UserControl&lt;/strong&gt; dont le principe est fort simple. 
&lt;/p&gt;
&lt;h2&gt;AnimatableSoundPlayer &lt;/h2&gt;
&lt;p&gt;
C&amp;#39;est son petit nom. Un joueur de sons animable. Joueur de sons car ce UserControl n&amp;#39;a pas de visuel. On pourrait en r&amp;eacute;alit&amp;eacute; jouer des vid&amp;eacute;os de la m&amp;ecirc;me fa&amp;ccedil;on il suffirait de relooker le contr&amp;ocirc;le, mais ce n&amp;#39;&amp;eacute;tait pas le but. Joueur de son animable car ce qui manque au &lt;font face="courier new,courier"&gt;MediaElement&lt;/font&gt; c&amp;#39;est bien d&amp;#39;avoir des propri&amp;eacute;t&amp;eacute;s &amp;quot;animables&amp;quot; pouvant &amp;ecirc;tre modifi&amp;eacute;es sur une timeline. 
&lt;/p&gt;
&lt;p&gt;
Le UserControl &lt;strong&gt;AnimatableSoundPlayer&lt;/strong&gt; est ainsi une coquille presque vide, il ne contient qu&amp;#39;un &lt;font face="courier new,courier"&gt;MediaElement&lt;/font&gt;. Tout le reste est du code, fort peu en r&amp;eacute;alit&amp;eacute;. 
&lt;/p&gt;
&lt;p&gt;
Dans un premier temps j&amp;#39;ai ajout&amp;eacute; plusieurs propri&amp;eacute;t&amp;eacute;s de d&amp;eacute;pendance qui relaient les propri&amp;eacute;t&amp;eacute;s du MediaElement : la &lt;font face="courier new,courier"&gt;Source&lt;/font&gt; (une Uri), le &lt;font face="courier new,courier"&gt;Volume&lt;/font&gt;, etc. Ensuite j&amp;#39;ai fait de m&amp;ecirc;me pour les principales m&amp;eacute;thodes (&lt;font face="courier new,courier"&gt;Play&lt;/font&gt;, &lt;font face="courier new,courier"&gt;Stop&lt;/font&gt;...). 
&lt;/p&gt;
&lt;p&gt;
Deux choses ont &amp;eacute;t&amp;eacute; ajout&amp;eacute;es. C&amp;ocirc;t&amp;eacute; m&amp;eacute;thodes j&amp;#39;ai cr&amp;eacute;er &lt;strong&gt;PlayFromStart&lt;/strong&gt;(). Elle ne fait que faire &amp;quot;Stop(); Play();&amp;quot;. C&amp;#39;est tout b&amp;ecirc;te mais tr&amp;egrave;s souvent on a besoin d&amp;#39;encha&amp;icirc;ner ces deux m&amp;eacute;thodes pour s&amp;#39;assurer qu&amp;#39;un son est bien rejouer depuis le d&amp;eacute;but, il faut rembobiner la bande avec Stop() pour r&amp;eacute;&amp;eacute;couter un son. 
&lt;/p&gt;
&lt;p&gt;
La seconde chose ajout&amp;eacute;e est la plus importante. Il s&amp;#39;agit de la &lt;strong&gt;propri&amp;eacute;t&amp;eacute; de d&amp;eacute;pendance AnimatablePlay&lt;/strong&gt; de type double. Pourquoi double ? Simplement parce Silverlight sait animer des doubles et par forc&amp;eacute;ment autrechose... Le m&amp;eacute;canisme int&amp;eacute;ressant se trouve dans la m&amp;eacute;thode &lt;strong&gt;AnimatablePlayChanged&lt;/strong&gt;, le callback de modification de la valeur initialis&amp;eacute; lors de la cr&amp;eacute;ation de la propri&amp;eacute;t&amp;eacute; de d&amp;eacute;pendance. A l&amp;#39;int&amp;eacute;rieur de ce callback nous trouvons la logique de cette propri&amp;eacute;t&amp;eacute;&amp;nbsp;: 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; AnimatablePlay property
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Gets or sets the animatable play.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Value = 0 means &amp;lt;see cref=&amp;quot;Stop&amp;quot;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Value sup.to 0 means &amp;lt;see cref=&amp;quot;PlayFromStart&amp;quot;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Value inf.to 0 means &amp;lt;see cref=&amp;quot;Play&amp;quot;/&amp;gt; / &amp;lt;see cref=&amp;quot;Pause&amp;quot;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;value&amp;gt;The animatable play.&amp;lt;/value&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        [Category(&lt;span class="str"&gt;&amp;quot;Media&amp;quot;&lt;/span&gt;)]
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; AnimatablePlay
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;double&lt;/span&gt;)GetValue(AnimatablePlayProperty); }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            set { SetValue(AnimatablePlayProperty, &lt;span class="kwrd"&gt;value&lt;/span&gt;); }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; DependencyProperty AnimatablePlayProperty =
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            DependencyProperty.Register(&lt;span class="str"&gt;&amp;quot;AnimatablePlay&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;double&lt;/span&gt;),
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(SynchedSoundPlayer), &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyMetadata(0.0d, AnimatablePlayChanged));
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  19:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AnimatablePlayChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            var mp = ((SynchedSoundPlayer)d);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((&lt;span class="kwrd"&gt;double&lt;/span&gt;)e.NewValue &amp;gt; 0d) mp.PlayFromStart();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((&lt;span class="kwrd"&gt;double&lt;/span&gt;)e.NewValue == 0d) mp.Stop();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((&lt;span class="kwrd"&gt;double&lt;/span&gt;)e.NewValue &amp;lt; 0d)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (mp.internalMP.CurrentState == MediaElementState.Playing) mp.Pause();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                &lt;span class="kwrd"&gt;else&lt;/span&gt; mp.Play();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  31:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Simple et efficace : toute valeur positive d&amp;eacute;clenche un &amp;quot;&lt;font face="courier new,courier"&gt;PlayFromStart&lt;/font&gt;&amp;quot;, d&amp;#39;o&amp;ugrave; l&amp;#39;utilit&amp;eacute; de cette m&amp;eacute;thode qui nous assure que le son est bien rejou&amp;eacute; depuis le d&amp;eacute;but. Toute valeur nulle appelle &amp;quot;&lt;font face="courier new,courier"&gt;Stop&lt;/font&gt;&amp;quot; et toute valeur n&amp;eacute;gative entra&amp;icirc;ne un cycle &lt;font face="courier new,courier"&gt;Play&lt;/font&gt;/&lt;font face="courier new,courier"&gt;Pause&lt;/font&gt; selon l&amp;#39;&amp;eacute;tat actuel du contr&amp;ocirc;le. 
&lt;/p&gt;
&lt;p&gt;
Le UserControl relaie aussi l&amp;#39;&amp;eacute;v&amp;eacute;nement &lt;font face="courier new,courier"&gt;MediaFailed&lt;/font&gt; si on d&amp;eacute;sire &amp;ecirc;tre pr&amp;eacute;venu en cas de difficult&amp;eacute; rencontr&amp;eacute;e par le MediaElement pour charger le son (qui peut &amp;ecirc;tre dans le Xap comme dans la pr&amp;eacute;sente d&amp;eacute;mo ou sur un serveur distant). 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Gr&amp;acirc;ce &amp;agrave; cette convention il devient tr&amp;egrave;s simple de synchroniser des sons avec une animation !&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
Si on suit l&amp;#39;exemple live propos&amp;eacute; plus haut : Trois sons sont jou&amp;eacute;s, un num&amp;eacute;ro est indiqu&amp;eacute; sur chaque &amp;quot;obstacle&amp;quot; pour mieux se rep&amp;eacute;rer. Sur ces trois sons il y en a un qui utilis&amp;eacute; deux fois. Pour synchroniser ces trois sons on reprend la timeline de la boule verte et &amp;agrave; chaque fois qu&amp;#39;on d&amp;eacute;sire qu&amp;#39;un son soit jou&amp;eacute; on incr&amp;eacute;mente sa propri&amp;eacute;t&amp;eacute; AnimatablePlay. Simple. Vu la taille des valeurs maximales d&amp;#39;un double, on ne risque pas de tomber sur une limite... surtout qu&amp;#39;il n&amp;#39;est pas interdit de faire un retour &amp;agrave; z&amp;eacute;ro quand on le veut. 
&lt;/p&gt;
&lt;p&gt;
Un petit d&amp;eacute;tail &amp;agrave; savoir : quand on cr&amp;eacute;&amp;eacute; une animation, par d&amp;eacute;faut Silverlight effectue une interpolation des valeurs fix&amp;eacute;es dans les keyframes qui se suivent. Si vous tapez la valeur 1 &amp;agrave; la frame A et que vous tapez 2 &amp;agrave; la frame B, durant le temps qui s&amp;eacute;pare A de B la valeur augmentera progressivement de 1 vers 2. C&amp;#39;est le comportement par d&amp;eacute;faut, ce qui est bien utile puisque justement le plus souvent on d&amp;eacute;sire avoir une continuit&amp;eacute; dans le changement des valeurs (d&amp;eacute;placements notamment). En revanche il y a des cas o&amp;ugrave; on pr&amp;eacute;f&amp;egrave;re que la valeur change brutalement, une &amp;quot;anti animation&amp;quot; en quelque sorte. Cela est parfois utile. Pour utiliser &lt;font face="courier new,courier"&gt;AnimatableSoundPlayer&lt;/font&gt; ce n&amp;#39;est pas une option, &lt;em&gt;c&amp;#39;est une obligation&lt;/em&gt;. Il faut que les valeurs ne changent que lorsqu&amp;#39;une nouvelle keyframe est rencontr&amp;eacute;e. Sinon le son sera rejou&amp;eacute; sans cesse depuis le d&amp;eacute;but &amp;agrave; toutes les valeurs interm&amp;eacute;diaires, ce qui n&amp;#39;est pas du tout l&amp;#39;effet recherch&amp;eacute;. 
&lt;/p&gt;
&lt;p&gt;
Pour arriver &amp;agrave; ce r&amp;eacute;sultat il suffit de ne pas oublier de param&amp;eacute;trer les keyframes servant &amp;agrave; animer le son afin qu&amp;#39;&amp;agrave; la place d&amp;#39;une &lt;font face="courier new,courier"&gt;EasingDoubleKeyFrame&lt;/font&gt; le type devienne &lt;font face="courier new,courier"&gt;DiscreteDoubleKeyFrame&lt;/font&gt;. Sous Blend il suffit de cliquer sur la keyframe en question et de la passer en mode &amp;quot;Hold in&amp;quot;. C&amp;#39;est la seule contrainte du composant. 
&lt;/p&gt;
&lt;p&gt;
Et voil&amp;agrave; ! Avec un peu d&amp;#39;imagination on peut parfaitement cr&amp;eacute;er un composant r&amp;eacute;utilisable qui ne prend que quelques lignes de code et qui permet de synchroniser du son dans une animation Silverlight. C&amp;#39;est pas magique ? 
&lt;/p&gt;
&lt;p&gt;
Je suis certain que vous trouverez des tas d&amp;#39;am&amp;eacute;liorations &amp;agrave; porter au composant, alors n&amp;#39;h&amp;eacute;sitez surtout pas &amp;agrave; m&amp;#39;en faire part je pourrais m&amp;ecirc;me diffuser vos versions modifi&amp;eacute;es si vous le voulez. 
&lt;/p&gt;
&lt;p&gt;
Le code du projet fourni contient l&amp;#39;exemple complet ainsi que le code du composant et les sons utilis&amp;eacute;s. 
&lt;/p&gt;
&lt;p&gt;
Quelques restrictions : Si vous modifiez le code obligez vous &amp;agrave; publier le code source de votre version gratuitement. Si vous publier un article ou un billet de blog, soyez sympa&amp;nbsp;et&amp;nbsp;indiquez le lien vers&amp;nbsp;mon billet. Si vous utilisez mon code dans un projet, commercial ou non, dites le moi &amp;ccedil;a me fera plaisir. &lt;br /&gt;
Si vous respectez ce petit deal, alors faites ce que voulez du code. Dans la n&amp;eacute;gative que les foudres du Grand Bug C&amp;eacute;leste s&amp;#39;abattent sur vous et chaque octet que vous coderez jusqu&amp;#39;&amp;agrave; la fin de vos jours (c&amp;#39;est bien horrible &amp;ccedil;a non ? &lt;img src="/Blog/editors/tiny_mce/plugins/emotions/images/smiley-laughing.gif" border="0" alt="Laughing" title="Laughing" width="18" height="18" /&gt;). 
&lt;/p&gt;
&lt;p&gt;
Enfin bon, dans tous les cas, si vous en voulez encore du Silverlight, vous connaissez le refrain : Stay Tuned !!! 
&lt;/p&gt;
&lt;p&gt;
Le code du projet : &lt;a href="http://www.e-naxos.com/Blog/file.axd?file=2009%2f9%2fSyncSound.zip"&gt;SyncSound.zip (209,05 kb)&lt;/a&gt; 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/D8S6JARvsMA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/D8S6JARvsMA/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/09/09/AnimatableSoundPlayer-Ou-comment-synchroniser-du-son-sur-une-animation-Silverlight.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=360a998c-9234-44ec-9081-3942c671586f</guid>
      <pubDate>Wed, 09 Sep 2009 06:38:00 +0200</pubDate>
      <category>Articles</category>
      <category>Astuce</category>
      <category>Design</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=360a998c-9234-44ec-9081-3942c671586f</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=360a998c-9234-44ec-9081-3942c671586f</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/09/09/AnimatableSoundPlayer-Ou-comment-synchroniser-du-son-sur-une-animation-Silverlight.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=360a998c-9234-44ec-9081-3942c671586f</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=360a998c-9234-44ec-9081-3942c671586f</feedburner:origLink></item>
    <item>
      <title>Animations, Sons, Synchronisation, Ease in/out sous Blend</title>
      <description>&lt;p&gt;
Effets visuels et sonores font partie des nouveaux &amp;eacute;l&amp;eacute;ments avec lesquels le concepteur de logiciel doit apprendre &amp;agrave; jouer pour cr&amp;eacute;er des interfaces attrayantes. Les r&amp;eacute;flexes du d&amp;eacute;veloppeur le porte &amp;agrave; se jeter sur son clavier, tout comme ceux du graphiste le pousse &amp;agrave; sortir son bloc et son crayon. Comme tout r&amp;eacute;flexe il faut savoir s&amp;#39;en m&amp;eacute;fier... 
&lt;/p&gt;
&lt;p&gt;
Prenons l&amp;#39;exemple de l&amp;#39;affichage ci-dessous qui simule un oscilloscope : 
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/MovingSpot/MovingSpot.xap;width=288;height=237] 
&lt;/p&gt;
&lt;p&gt;
(passez la souris sur &amp;quot;settings&amp;quot; pour ouvrir la fen&amp;ecirc;tre de param&amp;egrave;tres qui permet de jouer sur la lumonisit&amp;eacute; des carr&amp;eacute;s de ciblage, le flout&amp;eacute; du spot et sur le volume du bip) 
&lt;/p&gt;
&lt;p&gt;
Pour cr&amp;eacute;er l&amp;#39;effet du spot et de ses &amp;eacute;chos visuels le d&amp;eacute;veloppeur aura donc tendance &amp;agrave; se ruer sur son clavier et, s&amp;#39;inpirant des sprites (voir mon billet sur la &lt;a href="http://www.e-naxos.com/Blog/post/2009/08/03/c2ab-Il-neige-c2bb-ou-les-boucles-de28099animation-les-fps-et-les-sprites-sous-Silverlight.aspx" target="_blank"&gt;cr&amp;eacute;ation d&amp;#39;un effet de neige&lt;/a&gt;), il voudra cr&amp;eacute;er une classe pour le spot, puis recherchera la formule math&amp;eacute;matique de la courbe du d&amp;eacute;placement du spot pour animer ce dernier, les &amp;eacute;chos &amp;eacute;tant cr&amp;eacute;&amp;eacute;s &amp;agrave; la vol&amp;eacute;e avec une animation d&amp;#39;opacit&amp;eacute; d&amp;eacute;croissante. Tout cela va fonctionner parfaitement. Au bout du compte on disposera m&amp;ecirc;me d&amp;#39;un v&amp;eacute;ritable affichage de type oscilloscope r&amp;eacute;utilisable avec des courbes diff&amp;eacute;rentes. 
&lt;/p&gt;
&lt;p&gt;
Mais s&amp;#39;agissant juste d&amp;#39;un affichage, d&amp;#39;un effet visuel, n&amp;#39;est-ce pas un peu lourd ? 
&lt;/p&gt;
&lt;p&gt;
On peut en effet r&amp;eacute;aliser la chose bien plus rapidement et sans avoir de debug &amp;agrave; faire (puisque pas de code) si on &amp;quot;pense&amp;quot; design, pur dessin. Et au lieu d&amp;#39;ouvrir Visual Studio, ouvrons Blend... 
&lt;/p&gt;
&lt;p&gt;
Bien plus que l&amp;#39;exemple lui-m&amp;ecirc;me (assez simple) c&amp;#39;est cette d&amp;eacute;marche sur laquelle je souhaite attirer votre attention. 
&lt;/p&gt;
&lt;p&gt;
C&amp;ocirc;t&amp;eacute; r&amp;eacute;alisation comment cela se passe alors ? Deux contraintes nous sont donn&amp;eacute;es : animer un spot selon une courbe &amp;quot;r&amp;eacute;aliste&amp;quot; et avoir un rendu de la r&amp;eacute;manence de l&amp;#39;&amp;eacute;cran. Prenons le d&amp;eacute;placement pour commencer: il suffit de positionner un cercle &amp;agrave; gauche de l&amp;#39;&amp;eacute;cran de l&amp;#39;oscilloscope (une image r&amp;eacute;alis&amp;eacute;e sous Design), d&amp;#39;ouvrir un StoryBoard et de cr&amp;eacute;er une keyframe &amp;agrave; 2 secondes du d&amp;eacute;but puis de d&amp;eacute;placer le cercle jusqu&amp;#39;&amp;agrave; le faire sortir de l&amp;#39;&amp;eacute;cran. Le mouvement horizontal est r&amp;eacute;gl&amp;eacute;. Concernant le mouvement vertical et la simulation d&amp;#39;une courbe amortie, l&amp;#39;astuce consiste &amp;agrave; d&amp;eacute;placer en d&amp;eacute;but d&amp;#39;animation le spot sur l&amp;#39;axe Y pour le faire monter. C&amp;#39;est tout, l&amp;#39;effet de courbe sera rendu en utilisant astucieusement les nouveaux modes d&amp;#39;Ease in et out de Silverlight /Blend. Le point de d&amp;eacute;placement Y sera dot&amp;eacute; d&amp;#39;un &lt;em&gt;Quintic In&lt;/em&gt; pour amortir le mouvement, le dernier point de l&amp;#39;animation sera lui dot&amp;eacute; d&amp;#39;un &lt;em&gt;Elastic Out&lt;/em&gt; avec 5 oscillations et un Spingness de -2. On peut bien entendu ajuster ces &amp;eacute;l&amp;eacute;ments &amp;agrave; sa guise. 
&lt;/p&gt;
&lt;p&gt;
L&amp;#39;effet du d&amp;eacute;placement est ainsi rendu sans d&amp;eacute;veloppement. Bien entendu il s&amp;#39;agit d&amp;#39;un simple affichage qui n&amp;#39;effectue pas le rendu d&amp;#39;une &amp;quot;vraie&amp;quot; courbe pass&amp;eacute;e en param&amp;egrave;tre. Mais ce n&amp;#39;&amp;eacute;tait pas ce qu&amp;#39;on voulait. Juste un effet visuel &amp;quot;r&amp;eacute;aliste&amp;quot; en y passant le moins de temps possible. 
&lt;/p&gt;
&lt;p&gt;
Pour l&amp;#39;&amp;eacute;cho visuel ? La ruse est un peu grosse mais elle passe plut&amp;ocirc;t pas mal : il suffit de copier le spot et son animation deux fois puis de d&amp;eacute;caler l&amp;eacute;g&amp;egrave;rement les timelines vers la droite. On change ensuite l&amp;#39;opacit&amp;eacute; du 1er et du 2d &amp;eacute;cho (de fa&amp;ccedil;on d&amp;eacute;croissante). L&amp;#39;effet est ainsi rendu sans aucun code. 
&lt;/p&gt;
&lt;p&gt;
Un oscilloscope plus vrai que nature&amp;nbsp;! Il ne lui manque que la parole pourrait-on dire. Justement, ajoutons un son pour &amp;quot;faire plus vrai&amp;quot; (disons plut&amp;ocirc;t &amp;quot;plus cin&amp;eacute;ma&amp;quot; car les vrais oscillos ne font pas de bip). Au d&amp;eacute;part on avait envisag&amp;eacute; de lancer l&amp;#39;animation du spot en mode bouclage infini. H&amp;eacute;las les storyboards n&amp;#39;ont qu&amp;#39;un seul &amp;eacute;v&amp;eacute;nement : &lt;em&gt;Completed&lt;/em&gt; qui ne sera jamais d&amp;eacute;clench&amp;eacute; en plus (puisque bouclage infini). Comment attraper le d&amp;eacute;but de l&amp;#39;animation pour jouer le son et le synchroniser avec l&amp;#39;affichage du sport ? 
&lt;/p&gt;
&lt;p&gt;
Pas facile, et pas vraiment de solution pour l&amp;#39;instant. Mais il n&amp;#39;est pas interdit de faire marcher ses neurones ! Nous allons simplement supprimer le mode infini &amp;agrave; la boucle d&amp;#39;animation du spot. Ensuite nous allons pouvoir g&amp;eacute;rer l&amp;#39;&amp;eacute;v&amp;eacute;nement Completed de celle-ci. Dans le gestionnaire il suffira alors de relancer l&amp;#39;animation, on en profitera alors pour activer le son qui est plac&amp;eacute; dans un MediaElement (donc Stop() puis Play()). 
&lt;/p&gt;
&lt;p&gt;
Le son est maintenant synchronis&amp;eacute; avec l&amp;#39;affichage. 
&lt;/p&gt;
&lt;p&gt;
Mais si le son devait &amp;ecirc;tre d&amp;eacute;clench&amp;eacute; au milieu de l&amp;#39;animation ? Hmm.. L&amp;agrave; nous serions un peu coinc&amp;eacute; je pense. Tout de suite le d&amp;eacute;veloppeur dirait &amp;quot;ha je l&amp;#39;avais bien dit, si j&amp;#39;avais fait une gestion de sprite j&amp;#39;aurais presque fini!&amp;quot;. Peut-&amp;ecirc;tre. Mais revenir &amp;agrave; une animation pas &amp;agrave; pas pour avoir la main n&amp;#39;est toujours pas ce qu&amp;#39;on veut. 
&lt;/p&gt;
&lt;p&gt;
Il est dommage que Silverlight ne puisse pas animer le play et le stop d&amp;#39;un MediaElement, c&amp;#39;est un point faible car un comportement largement utilis&amp;eacute;&amp;nbsp;sous Flash par exemple. Mais si tel &amp;eacute;tait notre besoin, l&amp;agrave; encore, il serait possible de r&amp;eacute;fl&amp;eacute;chir un peu au lieu de repartir sur une animation pas &amp;agrave; pas complexe. 
&lt;/p&gt;
&lt;p&gt;
Par exemple nous pourrions cr&amp;eacute;er un petit UserControl poss&amp;eacute;dant une propri&amp;eacute;t&amp;eacute; PlaySound (une propri&amp;eacute;t&amp;eacute; de d&amp;eacute;pendance bien entendu sinon elle ne sera pas animable) pouvant passer de 0&amp;nbsp;&amp;agrave; 1 pour b&amp;eacute;n&amp;eacute;ficier de l&amp;#39;animation des Doubles sachant que seul le passage &amp;agrave; la valeur exacte 1.0 d&amp;eacute;clenchera la s&amp;eacute;quence Stop/Play du MediaElement int&amp;eacute;gr&amp;eacute;. D&amp;egrave;s lors ne resterait plus qu&amp;#39;&amp;agrave; poser ce contr&amp;ocirc;le sur notre application et d&amp;#39;animer sa propri&amp;eacute;t&amp;eacute; PlaySound en la faisant passer de 0&amp;nbsp;&amp;agrave; 1.0... 
&lt;/p&gt;
&lt;p&gt;
Voil&amp;agrave; un bon exercice sur lequel je vous laisse vous amuser un peu. La solution dans un prochain billet ! 
&lt;/p&gt;
&lt;p&gt;
Pour le reste de l&amp;#39;exemple il n&amp;#39;y a rien de bien compliqu&amp;eacute;. La petite fiche des settings est dessin&amp;eacute;e sous Expression Design, son titrage a &amp;eacute;t&amp;eacute; converti en Paths poru &amp;eacute;viter d&amp;#39;avoir &amp;agrave; int&amp;eacute;grer la fonte &amp;agrave; l&amp;#39;application Silverlight. Les sliders sont reli&amp;eacute;s aux propri&amp;eacute;t&amp;eacute;s qu&amp;#39;ils modifient par la nouvelle possibilit&amp;eacute; de binding &amp;eacute;l&amp;eacute;ment &amp;agrave; &amp;eacute;l&amp;eacute;ment de Silverlight 3. 
&lt;/p&gt;
&lt;p&gt;
Pour le petit composant permettant de synchroniser le son dans une animation, je ne dirais qu&amp;#39;une chose : Stay Tuned ! 
&lt;/p&gt;
&lt;p&gt;
J&amp;#39;allais oublier, le code du projet : &lt;a href="http://www.e-naxos.com/Blog/file.axd?file=2009%2f9%2fMovingSpot.zip"&gt;MovingSpot.zip (91,58 kb)&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/G1p2bFAA3PA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/G1p2bFAA3PA/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/09/08/Animations-Sons-Synchronisation-Ease-inout-sous-Blend.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=5629c5f5-2909-48af-85ae-203d59c7d98e</guid>
      <pubDate>Tue, 08 Sep 2009 23:45:00 +0200</pubDate>
      <category>Design</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=5629c5f5-2909-48af-85ae-203d59c7d98e</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=5629c5f5-2909-48af-85ae-203d59c7d98e</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/09/08/Animations-Sons-Synchronisation-Ease-inout-sous-Blend.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=5629c5f5-2909-48af-85ae-203d59c7d98e</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=5629c5f5-2909-48af-85ae-203d59c7d98e</feedburner:origLink></item>
    <item>
      <title>La mer, les propriétés de dépendance et les user control's...</title>
      <description>&lt;p&gt;
La mer... un souvenir qui va s&amp;#39;effacer jusqu&amp;#39;&amp;agrave; l&amp;#39;ann&amp;eacute;e prochaine... Mais pour prolonger le plaisir nous avons Silverlight ! 
&lt;/p&gt;
&lt;p&gt;
Et comment mieux rendre gr&amp;acirc;ce &amp;agrave; la Grande Bleue qu&amp;#39;en fabriquant un User Control la mettant en sc&amp;egrave;ne ? Et bien c&amp;#39;est ce que nous allons faire, ce qui permettra ludiquement d&amp;#39;aborder un probl&amp;egrave;me &amp;eacute;pineux concernant les propri&amp;eacute;t&amp;eacute;s de d&amp;eacute;pendance sous Silverlight. Mais d&amp;#39;abord le visuel : 
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/LaMer/LaMer.xap;width=480;height=480] 
&lt;/p&gt;
&lt;p&gt;
La mer bleue, ou la mer rouge, au choix... et c&amp;#39;est bien ce choix qui va poser probl&amp;egrave;me. 
&lt;/p&gt;
&lt;h2&gt;La base du UserControl&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;
Concernant le composant lui-m&amp;ecirc;me je suis parti d&amp;#39;un &lt;font face="courier new,courier"&gt;UserControl&lt;/font&gt; vide cr&amp;eacute;&amp;eacute; pour l&amp;#39;occasion. A l&amp;#39;int&amp;eacute;rieur un &lt;font face="courier new,courier"&gt;Path&lt;/font&gt; dessin&amp;eacute; avec l&amp;#39;outil plume. Ce path est dupliqu&amp;eacute; deux fois (ce qui donne donc 3 exemplaires au final). Les deux copies sont modifi&amp;eacute;es : l&amp;#39;une tass&amp;eacute;e en largeur, l&amp;#39;autre agrandie sur le m&amp;ecirc;me axe. 
&lt;/p&gt;
&lt;p&gt;
Un &lt;font face="courier new,courier"&gt;StoryBoard&lt;/font&gt; compl&amp;egrave;te le tout : les trois vagues sont d&amp;eacute;plac&amp;eacute;es de gauche &amp;agrave; droite, l&amp;#39;animation est mise en mode Auto-Reverse et boucle infinie. Pour un mouvement plus doux en d&amp;eacute;but et fin j&amp;#39;ai ajout&amp;eacute; un ease in/out choisi parmi les nouveaux modes offerts par SL 3. 
&lt;/p&gt;
&lt;p&gt;
Le tout est englob&amp;eacute; dans une grid pour b&amp;eacute;n&amp;eacute;ficier du clipping, le layout root &amp;eacute;tant une &lt;font face="courier new,courier"&gt;ViewBox&lt;/font&gt;, mais cette partie l&amp;agrave; de la cuisine interne du composant n&amp;#39;est pas forc&amp;eacute;ment la plus subtile. Pour terminer j&amp;#39;ajoute un rectangle sans bordure qui est plac&amp;eacute; en mode Stretch au fond du Z-Order, il servira a d&amp;eacute;finir un &amp;eacute;ventuel background. 
&lt;/p&gt;
&lt;p&gt;
Jusqu&amp;#39;&amp;agrave; l&amp;agrave; rien de bien compliqu&amp;eacute;, juste un peu d&amp;#39;imagination est suffisant. 
&lt;/p&gt;
&lt;p&gt;
L&amp;agrave; o&amp;ugrave; &amp;ccedil;a se complique c&amp;#39;est lorsqu&amp;#39;il faut g&amp;eacute;rer la couleur des vagues et celle du rectangle de fond... 
&lt;/p&gt;
&lt;h2&gt;H&amp;eacute;ritage et propri&amp;eacute;t&amp;eacute; de d&amp;eacute;pendance sous Silverlight&lt;/h2&gt;
&lt;p&gt;
Pour terminer correctement le UserControl il faut en effet penser &amp;agrave; son utilisation. C&amp;#39;est &amp;agrave; dire &amp;agrave; ajouter des propri&amp;eacute;t&amp;eacute;s qui permettront &amp;agrave; l&amp;#39;utilisateur du contr&amp;ocirc;le (le d&amp;eacute;veloppeur ou l&amp;#39;int&amp;eacute;grateur sous Blend) de modifier ses caract&amp;eacute;ristiques sans avoir besoin, bien entendu, de bricoler le source du contr&amp;ocirc;le lui-m&amp;ecirc;me. 
&lt;/p&gt;
&lt;p&gt;
Ici, nous souhaitons pouvoir modifier la couleur des vagues et celle du fond. Parfait me direz-vous, cela tombe bien, un &lt;font face="courier new,courier"&gt;UserControl &lt;/font&gt;descend de &lt;font face="courier new,courier"&gt;Control&lt;/font&gt; qui lui-m&amp;ecirc;me d&amp;eacute;finit deux propri&amp;eacute;t&amp;eacute;s on ne peut plus &amp;agrave; propos : &lt;font face="courier new,courier"&gt;Foreground&lt;/font&gt; et &lt;font face="courier new,courier"&gt;Background&lt;/font&gt;. Il &amp;quot;suffit&amp;quot; de les surcharger. 
&lt;/p&gt;
&lt;p&gt;
En effet, &amp;quot;il suffit de&amp;quot;. Yaka. 
&lt;/p&gt;
&lt;p&gt;
Premi&amp;egrave;re chose, ces propri&amp;eacute;t&amp;eacute;s sont dites de d&amp;eacute;pendance (&lt;em&gt;dependency property&lt;/em&gt;). Voir &amp;agrave; ce sujet mon article &lt;a href="http://www.e-naxos.com/Blog/post/2009/03/31/Les-proprietes-de-dependance-et-les-proprietes-jointes-sous-WPF.aspx" target="_blank"&gt;&lt;font color="#cccccc"&gt;Les propri&amp;eacute;t&amp;eacute;s de d&amp;eacute;pendance et les propri&amp;eacute;t&amp;eacute;s jointes sous WPF (article &amp;agrave; t&amp;eacute;l&amp;eacute;charger)&lt;/font&gt;&lt;/a&gt;. Ces propri&amp;eacute;t&amp;eacute;s ne sont pas d&amp;eacute;finies comme ce qu&amp;#39;on nomme aujourd&amp;#39;hui pour les diff&amp;eacute;rencier les &amp;quot;propri&amp;eacute;t&amp;eacute;s CLR&amp;quot;, les propri&amp;eacute;t&amp;eacute;s habituelles. Je vous renvoie &amp;agrave; l&amp;#39;article cit&amp;eacute; ici pour creuser la question si vous ne connaissez pas les propri&amp;eacute;t&amp;eacute;s de d&amp;eacute;pendance. 
&lt;/p&gt;
&lt;p&gt;
D&amp;egrave;s lors, et telles que fonctionnent ces propri&amp;eacute;t&amp;eacute;s sp&amp;eacute;cifiques de Silverlight et WPF, pour les surcharger il faut passer par un syst&amp;egrave;me de m&amp;eacute;tadonn&amp;eacute;es autorisant l&amp;#39;affectation d&amp;#39;une m&amp;eacute;thode callback. Dans cette derni&amp;egrave;re il est facile de r&amp;eacute;percuter sur le visuel les changements de valeur de la propri&amp;eacute;t&amp;eacute;. L&amp;#39;override d&amp;#39;une propri&amp;eacute;t&amp;eacute; de d&amp;eacute;pendance est donc assez simple. Sous WPF. Et c&amp;#39;est l&amp;agrave; qu&amp;#39;est le probl&amp;egrave;me. 
&lt;/p&gt;
&lt;p&gt;
En effet, tout &amp;agrave; l&amp;#39;air tellement merveilleux sous Silverlight depuis la version 2 qui acc&amp;egrave;pte du code C#, qu&amp;#39;on en oublie que si tout le Framework .NET pouvait tenir dans quelques m&amp;eacute;ga octets on se demanderait bien pourquoi l&amp;#39;installation du dit Framework pour une application classique (desktop) r&amp;eacute;clame des dizaines et des dizaines de m&amp;eacute;ga octets... Y&amp;#39;a un truc. Y&amp;#39;a m&amp;ecirc;me une grosse astuce je dirais : forc&amp;eacute;ment yapatou. En clair, le Framework Silverlight est un d&amp;eacute;coupage chirurgical de haute pr&amp;eacute;cision pour donner l&amp;#39;impression que tout fonctionne tout en &amp;eacute;vitant 90% du code du Framework. Et il y a des petits bouts qui manquent, et parfois des gros ! 
&lt;/p&gt;
&lt;p&gt;
Concernant les propri&amp;eacute;t&amp;eacute;s de d&amp;eacute;pendance, l&amp;#39;&amp;eacute;quipe de Silverlight a impl&amp;eacute;ment&amp;eacute; le principal mais a laiss&amp;eacute; de c&amp;ocirc;t&amp;eacute; les subtilit&amp;eacute;s. Les m&amp;eacute;tadonn&amp;eacute;es sont par exemple moins sophistiqu&amp;eacute;es. Mais il n&amp;#39;y a pas que les donn&amp;eacute;es qui ont &amp;eacute;t&amp;eacute; simplifi&amp;eacute;es, les m&amp;eacute;thodes aussi. Et de fait, en tout cas pour l&amp;#39;instant, il manque aux propri&amp;eacute;t&amp;eacute;s de d&amp;eacute;pendance Silverlight la possibilit&amp;eacute; de les surcharger. 
&lt;/p&gt;
&lt;p&gt;
Aie ! Comment r&amp;eacute;utiliser &lt;font face="courier new,courier"&gt;Foreground&lt;/font&gt; et &lt;font face="courier new,courier"&gt;Background&lt;/font&gt; d&amp;eacute;finies dans &lt;font face="courier new,courier"&gt;Control&lt;/font&gt; et accessibles dans le &lt;font face="courier new,courier"&gt;UserControl&lt;/font&gt; s&amp;#39;il n&amp;#39;est pas possible de modifier les m&amp;eacute;tadonn&amp;eacute;es et d&amp;#39;enregistrer notre propre callback ? J&amp;#39;ai longuement cherch&amp;eacute; car le probl&amp;egrave;me est loin d&amp;#39;&amp;ecirc;tre &amp;eacute;vident &amp;agrave; r&amp;eacute;soudre. Certains pr&amp;eacute;conisent m&amp;ecirc;me face &amp;agrave; ce probl&amp;egrave;me de red&amp;eacute;finir vos propres propri&amp;eacute;t&amp;eacute;s. C&amp;#39;est tellement horrible comme solution que je m&amp;#39;y suis refus&amp;eacute;. Comment avoir le courrage de d&amp;eacute;finir une couleur de fond et une couleur d&amp;#39;avant plan au sein d&amp;#39;un composant visuel qui affichera fi&amp;egrave;rement de toute fa&amp;ccedil;on &lt;font face="courier new,courier"&gt;Foreground&lt;/font&gt; et &lt;font face="courier new,courier"&gt;Background&lt;/font&gt; qui n&amp;#39;auront, h&amp;eacute;las, aucun effet ? Quant &amp;agrave; faire une r&amp;eacute;introduction de ces propri&amp;eacute;t&amp;eacute;s (avec le mot cl&amp;eacute; &amp;quot;new&amp;quot;), n&amp;#39;y pensez pas, j&amp;#39;ai essay&amp;eacute; et &amp;ccedil;a coince un peu (par code &amp;ccedil;a marche, mais le XAML se fiche de la red&amp;eacute;finition et utilise toujours la propri&amp;eacute;t&amp;eacute; originale, ce n&amp;#39;est pas un bug mais une feature ou plut&amp;ocirc;t un effet assum&amp;eacute; du fameux d&amp;eacute;coupage savant dans le Framework). 
&lt;/p&gt;
&lt;p&gt;
J&amp;#39;avoue que pour l&amp;#39;instant cet oubli volontaire dans Silverlight me chagrine. Pourquoi l&amp;#39;&amp;eacute;quipe Silverlight, qui fait la chasse au gaspi un peu partout, s&amp;#39;est amus&amp;eacute;e &amp;agrave; d&amp;eacute;finir ces deux propri&amp;eacute;t&amp;eacute;s dans la classe &lt;font face="courier new,courier"&gt;Control&lt;/font&gt; si on ne peut pas en h&amp;eacute;riter, sachant que &lt;font face="courier new,courier"&gt;Control&lt;/font&gt; ne sert &amp;agrave; rien d&amp;#39;autre qu&amp;#39;&amp;agrave; cr&amp;eacute;er des classes h&amp;eacute;rit&amp;eacute;es&amp;nbsp; ? C&amp;#39;est assez myst&amp;egrave;rieux m&amp;ecirc;me si je suppose qu&amp;#39;il s&amp;#39;agit d&amp;#39;un probl&amp;egrave;me de compatibilit&amp;eacute; avec WPF, Silverlight en faisant moins que son grand fr&amp;egrave;re mais toujours en permettant que cela soit transparent pour le code. Bref, &amp;agrave; satisfaire deux besoins oppos&amp;eacute;s, d&amp;#39;un c&amp;ocirc;t&amp;eacute; en coder le moins possible pour assurer la taille la plus petite au plugin et de l&amp;#39;autre assurer la compatibilit&amp;eacute; du code avec WPF, on finit par tomber sur des paradoxes de ce genre. 
&lt;/p&gt;
&lt;p&gt;
L&amp;#39;Element binding (ajout&amp;eacute; dans SL 3) n&amp;#39;est pas utilisable non plus, &amp;agrave; moins de donner un nom au &lt;font face="courier new,courier"&gt;UserControl&lt;/font&gt; (je veux dire &amp;agrave; l&amp;#39;int&amp;eacute;rieur m&amp;ecirc;me de la d&amp;eacute;finition de celui-ci). Ce qui n&amp;#39;est pas acceptable car si l&amp;#39;utilisateur du composant change ce dernier, le binding est cass&amp;eacute;. Pire si l&amp;#39;utilisateur tente de placer deux instances sur une fiche, il y aura un conflit de nom. Solution inacceptable donc. J&amp;#39;ai test&amp;eacute;, je pense, toutes les combines possibles. Mais j&amp;#39;ai enfin trouv&amp;eacute; celle qui fonctionne ! 
&lt;/p&gt;
&lt;h2&gt;La Solution&lt;/h2&gt;
&lt;p&gt;
La piste de l&amp;#39;Element binding, nouvelle feature de SL 3, n&amp;#39;&amp;eacute;tait pas mauvaise. Le probl&amp;egrave;me c&amp;#39;est qu&amp;#39;en Xaml cela r&amp;eacute;clamait de pouvoir indiquer le nom de la source (le UserControl) alors m&amp;ecirc;me qu&amp;#39;&amp;agrave; l&amp;#39;int&amp;eacute;rieur de la d&amp;eacute;finition de notre contr&amp;ocirc;le il n&amp;#39;&amp;eacute;tait pas question de lui donner un x:Name fig&amp;eacute;. 
&lt;/p&gt;
&lt;p&gt;
Mais en revanche, ce qui est possible en Xaml l&amp;#39;est tout autant par code (et souvent inversement d&amp;#39;ailleurs). Par chance, la classe permettant de d&amp;eacute;finir un Binding n&amp;#39;utilise pas les noms pour la source ni le destinataire. Elle utilise les noms des propri&amp;eacute;t&amp;eacute;s mais l&amp;agrave; on les connait et ils ne changeront pas. Du coup, en d&amp;eacute;finissant le Binding dans le constructeur (ou plut&amp;ocirc;t dans le gestionnaire de l&amp;#39;&amp;eacute;v&amp;eacute;nement Loaded) on peut r&amp;eacute;f&amp;eacute;rencer &amp;quot;this&amp;quot;, c&amp;#39;est &amp;agrave; dire l&amp;#39;instance du UserControl, sans conna&amp;icirc;tre son nom. On peut donc cr&amp;eacute;er un lien &amp;eacute;l&amp;eacute;ment &amp;agrave; &amp;eacute;l&amp;eacute;ment entre la propri&amp;eacute;t&amp;eacute; Fill des Path&amp;#39;s et la propri&amp;eacute;t&amp;eacute; Foreground du UserControl (idem pour le Fill du rectangle et la propri&amp;eacute;t&amp;eacute; Background du UserControl). 
&lt;/p&gt;
&lt;p&gt;
Et &amp;ccedil;a marche ! Lorsqu&amp;#39;on compile tout &amp;ccedil;a et qu&amp;#39;on pose un composant &amp;quot;LaMer&amp;quot; sur une fiche on peut modifier la propri&amp;eacute;t&amp;eacute; Foreground et les vagues changent de couleur. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; LaMer()
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="rem"&gt;// Required to initialize variables&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            InitializeComponent();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            Loaded += &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Windows.RoutedEventHandler(LaMer_Loaded);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LaMer_Loaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, System.Windows.RoutedEventArgs e)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            &lt;span class="rem"&gt;// l&amp;#39;astuce est l&amp;agrave; !&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            var b = &lt;span class="kwrd"&gt;new&lt;/span&gt; Binding(&lt;span class="str"&gt;&amp;quot;Foreground&amp;quot;&lt;/span&gt;) { Source = &lt;span class="kwrd"&gt;this&lt;/span&gt;, Mode = BindingMode.OneWay };
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            Vague1.SetBinding(Shape.FillProperty, b);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            Vague2.SetBinding(Shape.FillProperty, b);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            Vague3.SetBinding(Shape.FillProperty, b);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            var bb = &lt;span class="kwrd"&gt;new&lt;/span&gt; Binding(&lt;span class="str"&gt;&amp;quot;Background&amp;quot;&lt;/span&gt;) { Source = &lt;span class="kwrd"&gt;this&lt;/span&gt;, Mode = BindingMode.OneWay };
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            rectBackground.SetBinding(Shape.FillProperty, bb);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  19:  &lt;/span&gt;           
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            VaguesAnim.Begin();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Pour le Background on fait pareil avec le rectangle. Mais, allez-vous me dire (si si, vous y auriez pens&amp;eacute;, un jour :-) ), pourquoi aller mettre un rectangle pour obtenir une couleur de fond alors m&amp;ecirc;me qu&amp;#39;il y a d&amp;eacute;j&amp;agrave; une grille en dessous ? La grille poss&amp;egrave;de aussi une propri&amp;eacute;t&amp;eacute; Background. Pourquoi, hein ? 
&lt;/p&gt;
&lt;p&gt;
La r&amp;eacute;ponse est simple, j&amp;#39;ai forc&amp;eacute;ment essay&amp;eacute;, et &amp;ccedil;a fait un magnifique plantage avec une erreur dont le message fait peur en plus (du genre &amp;quot;anomalie irr&amp;eacute;m&amp;eacute;diable dans cinq secondes tout va sauter, non &amp;ccedil;a a d&amp;eacute;j&amp;agrave; saut&amp;eacute;!&amp;quot;). Le message d&amp;#39;erreur &amp;eacute;tant assez peu clair quant aux raisons du plantage j&amp;#39;ai fini par abandonner. Ce qui marche une ligne avant pour la propri&amp;eacute;t&amp;eacute; Fill des rectangle avec la propri&amp;eacute;t&amp;eacute; Foreground du UserControl ne fonctionne pas du tout pour le Background de la grille li&amp;eacute;e au Background du UserControl. L&amp;agrave;, ce n&amp;#39;est pas une feature, je penche s&amp;eacute;rieusement pour un gros bug. 
&lt;/p&gt;
&lt;p&gt;
Cela &amp;eacute;tant donn&amp;eacute;, j&amp;#39;ai donc ajout&amp;eacute; un rectangle en fond pour qu&amp;#39;il puisse justement servir de ... Background. Et l&amp;agrave; &amp;ccedil;a passe. Ouf ! 
&lt;/p&gt;
&lt;h2&gt;Ouf !&lt;/h2&gt;
&lt;p&gt;
Silverlight c&amp;#39;est g&amp;eacute;nial, c&amp;#39;est tout .NET et tout WPF dans un petit plugin. Mais d&amp;egrave;s qu&amp;#39;on sort du carr&amp;eacute; de verdure, on tombe dans les bois et l&amp;agrave; des loups il y en a quelques uns qui vous attendent au tournant ! Cela est logique, on s&amp;#39;y attend, c&amp;#39;est le prix &amp;agrave; payer pour avoir .NET dans un browser Internet. Forc&amp;eacute;ment le costume est un peu serr&amp;eacute;, le tissu a &amp;eacute;t&amp;eacute; &amp;eacute;conomis&amp;eacute;. Mais cela ne change rien &amp;agrave; l&amp;#39;amour qu&amp;#39;on porte &amp;agrave; Silverlight, au contraire, on se rend compte ainsi &amp;agrave; quel point le travail de l&amp;#39;&amp;eacute;quipe Silverlight a &amp;eacute;t&amp;eacute; (et est encore) un v&amp;eacute;ritable casse-t&amp;ecirc;te et &amp;agrave; quel point ils ont r&amp;eacute;ussi un tour de force en faisant entrer un &amp;eacute;l&amp;eacute;phant dans une bo&amp;icirc;te d&amp;#39;allumettes... Tout de m&amp;ecirc;me, une fois arriv&amp;eacute; &amp;agrave; la solution j&amp;#39;ai pouss&amp;eacute; un grand Ouf! 
&lt;/p&gt;
&lt;p&gt;
Le code source du projet : &lt;a href="http://www.e-naxos.com/Blog/file.axd?file=2009%2f9%2fLaMer.zip"&gt;LaMer.zip (62,54 kb)&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Pour de nouvelles aventures : Stay Tuned !
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/Q7smdVZpPLw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/Q7smdVZpPLw/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/09/05/La-mer-les-proprietes-de-dependance-et-les-user-controls.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=8f9f72d7-9c52-4753-a830-980f0adfc647</guid>
      <pubDate>Sat, 05 Sep 2009 02:56:00 +0200</pubDate>
      <category>Articles</category>
      <category>Design</category>
      <category>Framework .NET</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=8f9f72d7-9c52-4753-a830-980f0adfc647</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=8f9f72d7-9c52-4753-a830-980f0adfc647</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/09/05/La-mer-les-proprietes-de-dependance-et-les-user-controls.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=8f9f72d7-9c52-4753-a830-980f0adfc647</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=8f9f72d7-9c52-4753-a830-980f0adfc647</feedburner:origLink></item>
    <item>
      <title>Les ChildWindow's de Silverlight 3</title>
      <description>&lt;p&gt;
Parmi les nouveaut&amp;eacute;s de Silverlight 3 se trouve la classe ChildWindow. Elle permet de cr&amp;eacute;er facilement en quelques clics un dialogue modal, le tout avec animation. 
&lt;/p&gt;
&lt;p&gt;
Savoir se servir de cette classe ne r&amp;eacute;clame pas forc&amp;eacute;ment des pages enti&amp;egrave;res d&amp;#39;explication, alors justement m&amp;#39;est venu l&amp;#39;id&amp;eacute;e d&amp;#39;en faire un tutor video... 
&lt;/p&gt;
&lt;p&gt;
C&amp;#39;est au visionnage de cette video que je vous invite pour comprendre comment utiliser cette nouvelle feature de Silverlight 3. 
&lt;/p&gt;
&lt;p&gt;
(le son micro n&amp;#39;est pas terrible, pour la prochaine video j&amp;#39;utiliserai autre chose de mieux ! Une astuce : double cliquez sur la video pour passer en plein &amp;eacute;cran. Sorry, la d&amp;eacute;finition est assez basse mais le fichier avi fait d&amp;eacute;j&amp;agrave; 30 Mo et l&amp;#39;original non compress&amp;eacute; fait plus de 9 Go ... Je vais voir comment am&amp;eacute;liorer tout &amp;ccedil;a pour la prochaine fois, promis !). 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div style="text-align: center"&gt;
&lt;iframe src="http://silverlight.services.live.com/invoke/106835/Les%20ChildWindow%20de%20Silverlight%203/iframe.html" frameborder="0" style="width: 500px; height: 400px"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;
Techniquement, la vid&amp;eacute;o est h&amp;eacute;berg&amp;eacute;e sur Silverlight Streaming et c&amp;#39;est par le biais d&amp;#39;un plugin Silverlight g&amp;eacute;r&amp;eacute; par ce site que la vid&amp;eacute;o peut &amp;ecirc;tre visionn&amp;eacute;e. 
&lt;/p&gt;
&lt;p&gt;
Bonne vid&amp;eacute;o ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/ePLweYqv4go" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/ePLweYqv4go/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/09/04/Les-ChildWindows-de-Silverlight-3.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=b9ccd31a-5e5b-4f5a-a0f9-1134d6566d4f</guid>
      <pubDate>Fri, 04 Sep 2009 03:07:00 +0200</pubDate>
      <category>Articles</category>
      <category>Design</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=b9ccd31a-5e5b-4f5a-a0f9-1134d6566d4f</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=b9ccd31a-5e5b-4f5a-a0f9-1134d6566d4f</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/09/04/Les-ChildWindows-de-Silverlight-3.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=b9ccd31a-5e5b-4f5a-a0f9-1134d6566d4f</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=b9ccd31a-5e5b-4f5a-a0f9-1134d6566d4f</feedburner:origLink></item>
    <item>
      <title>Le défit des nouvelles interfaces Silverlight et WPF - La cassure conceptuelle</title>
      <description>&lt;p&gt;
J&amp;#39;ai l&amp;#39;habitude de publier ici du code, des tutors et des informations qui sont majoritairement tr&amp;egrave;s techniques. Il y a certains sujets o&amp;ugrave; il me semble bon de prendre un peu de recul, les &lt;strong&gt;nouvelles interfaces utilisateurs&lt;/strong&gt; le m&amp;eacute;ritent largement. En effet, l&amp;#39;avalanche &amp;agrave; la fois technologique et visuelle qui accompagne Silverlight et WPF, peut faire oublier l&amp;#39;objectif r&amp;eacute;el et le changement de paradigme, le nez coll&amp;eacute; &amp;agrave; la vitrine, la t&amp;ecirc;te dans le guidon pour ingurgiter les propri&amp;eacute;t&amp;eacute;s de d&amp;eacute;pendance ou les RIA Services on ne prend pas assez le temps de r&amp;eacute;fl&amp;eacute;chir plus globalement... 
&lt;/p&gt;
&lt;p&gt;
Ce billet sera donc une pause dans ce rush, on s&amp;#39;assoit, on prend le temps de r&amp;eacute;fl&amp;eacute;chir. 
&lt;/p&gt;
&lt;h2&gt;Pourquoi &amp;quot;nouvelles&amp;quot; interfaces ?&lt;/h2&gt;
&lt;p&gt;
Comme vous l&amp;#39;avez certainement compris, quelque chose a chang&amp;eacute;. Il suffit de regarder &lt;a href="http://www.microsoft.com/surface/" target="_blank"&gt;Surface &lt;/a&gt;et son interface pour comprendre que ce changement n&amp;#39;est pas uniquement cosm&amp;eacute;tique, il est profond et touche aussi bien &amp;agrave; la &lt;strong&gt;repr&amp;eacute;sentation des donn&amp;eacute;es&lt;/strong&gt; qu&amp;#39;&amp;agrave; &lt;strong&gt;l&amp;#39;interaction homme / machine&lt;/strong&gt;. C&amp;#39;est pourquoi je parle ici de &lt;em&gt;&amp;quot;nouvelles&amp;quot; interfaces utilisateur&lt;/em&gt;. 
&lt;/p&gt;
&lt;h2&gt;N&amp;#39;est-ce qu&amp;#39;une question de mode ?&lt;/h2&gt;
&lt;p&gt;
Oui et non. 
&lt;/p&gt;
&lt;p&gt;
Oui car tout est mode chez l&amp;#39;humain... La fa&amp;ccedil;on de se coiffer, de s&amp;#39;habiller, la forme des voitures, celle des cafeti&amp;egrave;res, etc. L&amp;#39;informatique, dans sa partie visuelle et interactive n&amp;#39;&amp;eacute;chappe pas &amp;agrave; ce mouvement perp&amp;eacute;tuel. Le fait qu&amp;#39;un programme puisse se manipuler selon des concepts &amp;quot;&amp;agrave; la mode&amp;quot; n&amp;#39;est donc pas &amp;quot;honteux&amp;quot; ni m&amp;ecirc;me accessoire ! C&amp;#39;est ainsi que l&amp;#39;humain vit, c&amp;#39;est ainsi qu&amp;#39;il imprime sa marque &amp;agrave; l&amp;#39;environnement qui l&amp;#39;entoure. &lt;br /&gt;
L&amp;#39;humain est le seul animal a modifier son environnement pour le faire correspondre &amp;agrave; ses r&amp;ecirc;ves, l&amp;agrave; o&amp;ugrave; tous les autres animaux subissent de plein fouet la s&amp;eacute;lection darwinienne et ce qu&amp;#39;on appelle la pression de l&amp;#39;environnement sans rien pouvoir y changer. Il y a donc bien un ph&amp;eacute;nom&amp;egrave;ne de mode dans ces &amp;quot;nouvelles interfaces&amp;quot; mais nous venons de voir que mode et civilisation humaine sont deux choses ins&amp;eacute;parables... 
&lt;/p&gt;
&lt;p&gt;
Non car on a tendance &amp;agrave; associer les modes &amp;agrave; la simple cosm&amp;eacute;tique et que le changement qui s&amp;#39;op&amp;egrave;re est bien plus conceptuel qu&amp;#39;un simple &amp;quot;relookage&amp;quot;. J&amp;#39;y reviens plus loin. 
&lt;/p&gt;
&lt;h3&gt;Qu&amp;#39;est-ce qu&amp;#39;une mode ?&lt;/h3&gt;
&lt;p&gt;
Pour ce qui nous int&amp;eacute;resse ici, car sinon on pourrait en faire largement un sujet de th&amp;egrave;se, disons qu&amp;#39;une mode est une fa&amp;ccedil;on collective et temporaire de faire les choses ou de les repr&amp;eacute;senter. 
&lt;/p&gt;
&lt;h3&gt;Comment passe-t-on d&amp;#39;une mode &amp;agrave; l&amp;#39;autre ?&lt;/h3&gt;
&lt;p&gt;
Pour l&amp;#39;illustrer, une petite anecdote : 
&lt;/p&gt;
&lt;p&gt;
J&amp;#39;&amp;eacute;tais chez mon p&amp;egrave;re il y a quelques jours et il venait de s&amp;#39;acheter une machine &amp;agrave; caf&amp;eacute; Senseo (lass&amp;eacute; qu&amp;#39;il &amp;eacute;tait de se faire racketter par les dosettes Nespresso du bell&amp;acirc;tre &amp;quot;What else?&amp;quot;). Surprise !&amp;nbsp;ce mod&amp;egrave;le est rectangulaire alors que les Senseo, jusqu&amp;#39;&amp;agrave; lors, &amp;eacute;tait tout en rondeur (le nouveau mod&amp;egrave;le n&amp;#39;est d&amp;#39;ailleurs m&amp;ecirc;me pas encore sur leur site). Un changement de mode s&amp;#39;op&amp;egrave;re... Mais comment ? Ici on le voit, la mode &amp;eacute;tait aux rondeurs, elles semblent passer aux formes plus carr&amp;eacute;es. Il est de m&amp;ecirc;me en informatique : Windows nous a habitu&amp;eacute;s &amp;agrave; ses d&amp;eacute;buts &amp;agrave; des fen&amp;ecirc;tres bien rectangulaires aux angles bien droits. Ces fen&amp;ecirc;tres plates et rectangulaires ont fini par lasser. Windows avec XP et plus encore avec Vista et 7 est donc pass&amp;eacute; aux rondeurs. La &amp;quot;classe&amp;quot; absolue ayant &amp;eacute;t&amp;eacute; au d&amp;eacute;but de cette mode de faire tourner ses applications dans une fen&amp;ecirc;tre non rectangulaire ! Allons-nous revenir &amp;agrave; des fen&amp;ecirc;tres rectangulaires &amp;agrave; l&amp;#39;instar des formes de la nouvelles Senseo ? Le nouveau paradigme qui pr&amp;eacute;side &amp;agrave; la conception des &amp;quot;nouvelles interfaces&amp;quot; se r&amp;eacute;sume-t-il &amp;agrave; cela ? 
&lt;/p&gt;
&lt;h2&gt;La cassure conceptuelle&lt;/h2&gt;
&lt;p&gt;
De nombreuses modes en effet se sont juste r&amp;eacute;sum&amp;eacute;es&amp;nbsp;&amp;agrave; cela : un changement de forme. Quand tout est rond on finit par revenir &amp;agrave; quelque chose de plus carr&amp;eacute; et inversement. Le triangle, malgr&amp;eacute; sa tr&amp;egrave;s grande force symbolique ne se pr&amp;ecirc;te gu&amp;egrave;re &amp;agrave; l&amp;#39;affichage&amp;nbsp;&amp;eacute;cran. Exit le triangle, le losage n&amp;#39;&amp;eacute;tant gu&amp;egrave;re plus pratique, peut-&amp;ecirc;tre qu&amp;#39;un jour la mode sera aux fen&amp;ecirc;tres patato&amp;iuml;des ! 
&lt;/p&gt;
&lt;h3&gt;Les nouvelles interfaces homme / machine se situent-elles uniquement sur le plan esth&amp;eacute;tique ?&lt;/h3&gt;
&lt;p&gt;
Encore une fois : Oui et non. 
&lt;/p&gt;
&lt;p&gt;
Oui car il est impossible pour une repr&amp;eacute;sentation d&amp;#39;&amp;eacute;chapper &amp;agrave; la mode ambiante, ou celle &amp;agrave; venir. Il en va de m&amp;ecirc;me en &amp;eacute;criture par exemple. &lt;br /&gt;
On peut &amp;eacute;crire des choses tr&amp;egrave;s nouvelles sur un sujet, mais il faudra bien se plier aux exigences de la langue de son pays, telle qu&amp;#39;elle est parl&amp;eacute;e au moment o&amp;ugrave; l&amp;#39;on &amp;eacute;crit. &lt;br /&gt;
On voit mal un philosophe contemporain ou m&amp;ecirc;me un simple romancier publier un ouvrage en latin ou en vieux fran&amp;ccedil;ais. Certains mots sont plus &amp;quot;&amp;agrave; la mode&amp;quot; que d&amp;#39;autres, et s&amp;#39;il ne veut pas que sa prose &amp;quot;sente la naphtaline&amp;quot; il faudra qu&amp;#39;il emploie les mots, expressions et formes grammaticales de son temps. &lt;br /&gt;
Sinon il risque tout simplement de ne pas &amp;ecirc;tre lu/&amp;eacute;cout&amp;eacute;, pire de &lt;strong&gt;ne pas &amp;ecirc;tre compris&lt;/strong&gt;. Car la mode est un &lt;strong&gt;code culturel&lt;/strong&gt; qui&amp;nbsp;fait partie int&amp;eacute;grante de la &lt;strong&gt;communication&lt;/strong&gt; et donc de la &lt;strong&gt;compr&amp;eacute;hension&lt;/strong&gt; entre l&amp;#39;&amp;eacute;metteur et le r&amp;eacute;cepteur d&amp;#39;une information.&amp;nbsp;&lt;br /&gt;
Il y a donc toujours une part d&amp;#39;all&amp;eacute;geance &amp;agrave; la mode en cours dans toute forme de communication. Cette mode pouvant m&amp;ecirc;me varier au sein d&amp;#39;une m&amp;ecirc;me soci&amp;eacute;t&amp;eacute; selon la cible vis&amp;eacute;e (on ne s&amp;#39;adresse pas &amp;agrave; la c&amp;eacute;l&amp;egrave;bre m&amp;eacute;nag&amp;egrave;re de moins de 50 ans des sondages comme &amp;agrave; l&amp;#39;ado qui &amp;eacute;crit en langage texto). &lt;br /&gt;
La mode, ainsi exprim&amp;eacute;e, s&amp;#39;int&amp;egrave;gre dans un corpus de r&amp;egrave;gles sociales et morales plus large qu&amp;#39;on appelle les us et coutumes. Vouloir y &amp;eacute;chapper n&amp;#39;est pas forc&amp;eacute;ment faire preuve d&amp;#39;originalit&amp;eacute;. Refuser la mode par simple r&amp;eacute;action c&amp;#39;est aussi se couper de ses contemporains. Mais on peut aussi cr&amp;eacute;er la prochaine mode... 
&lt;/p&gt;
&lt;p&gt;
Non car on assiste aujourd&amp;#39;hui &amp;agrave; une cassure conceptuelle. Une rupture qui peut largement &amp;ecirc;tre minor&amp;eacute;e, voire ignor&amp;eacute;e, cach&amp;eacute;e qu&amp;#39;elle est, justement, derri&amp;egrave;re l&amp;#39;&amp;eacute;cran de fum&amp;eacute;e du simple ph&amp;eacute;nom&amp;egrave;ne de mode per&amp;ccedil;u comme seule modification esth&amp;eacute;tique. 
&lt;/p&gt;
&lt;h3&gt;Quelle est cette cassure conceptuelle ?&lt;/h3&gt;
&lt;p&gt;
Elle est de taille ! Prenons un exemple concret : vous devez cr&amp;eacute;er un logiciel de surveillance bancaire. Ici tout n&amp;#39;est que s&amp;eacute;ries de chiffres, de pourcentages, de tendances &amp;agrave; la hausse ou la baisse. Comment allez-vous cr&amp;eacute;er l&amp;#39;interface d&amp;#39;un tel logiciel ? 
&lt;/p&gt;
&lt;p&gt;
La plupart des informaticiens se plongeront d&amp;#39;abord dans le code et poseront ensuite rapidement quelques grilles, ces horribles tableaux rectangulaires que tout &amp;eacute;diteur de composants se doit d&amp;#39;avoir perfectionn&amp;eacute; &amp;agrave; sa mani&amp;egrave;re. 
&lt;/p&gt;
&lt;p&gt;
Va-t-il suffire de &amp;quot;templater&amp;quot; une DataGrid sous Blend en lui mettant des coins arrondis pour dire qu&amp;#39;on a utiliser correctement Silverlight ou WPF ? 
&lt;/p&gt;
&lt;p&gt;
L&amp;agrave;, en revanche une seule r&amp;eacute;ponse, claire et nette : Non ! 
&lt;/p&gt;
&lt;p&gt;
Se servir du potentiel cr&amp;eacute;atif de Silverlight et WPF ne consiste certainement pas &amp;agrave; relooker les cases &amp;agrave; cocher ni &amp;agrave; &amp;quot;coller&amp;quot; un drop shadow &amp;agrave; une bo&amp;icirc;te de dialogue ! Agir ainsi est un g&amp;acirc;chis &amp;eacute;norme, et surtout c&amp;#39;est ne pas avoir compris la cassure conceptuelle qu&amp;#39;impose ces outils. 
&lt;/p&gt;
&lt;p&gt;
Revenons &amp;agrave; notre hypoth&amp;eacute;tique application de surveillance. Supposons pour simplifier qu&amp;#39;elle permette &amp;agrave; l&amp;#39;utilisateur d&amp;#39;avoir un oeil sur les actions de son portefeuille. La surveillance pouvant &amp;ecirc;tre activ&amp;eacute;e ou d&amp;eacute;sactiv&amp;eacute;e pour chaque action. 
&lt;/p&gt;
&lt;p&gt;
La premi&amp;egrave;re tentation sera ainsi de repr&amp;eacute;senter la liste des actions sous la forme d&amp;#39;une grille de donn&amp;eacute;es. On aura l&amp;#39;impression de profiter de toute la technologie en templetant la grille pour ajouter le logo de la soci&amp;eacute;t&amp;eacute;, des petites pastilles qui changent de couleur quand le logiciel teste une action, une autre quand l&amp;#39;action est &amp;agrave; la hausse ou &amp;agrave; la baisse, etc. On ira m&amp;ecirc;me jusqu&amp;#39;&amp;agrave; ajouter quelques animations, c&amp;#39;est tellement &amp;quot;fun&amp;quot;. L&amp;#39;utilisateur naviguera entre les pages qui coulisseront &amp;agrave; l&amp;#39;&amp;eacute;cran de droite &amp;agrave; gauche et r&amp;eacute;ciproquement, etc. L&amp;agrave; on aura eu l&amp;#39;impression de faire du neuf et d&amp;#39;exploiter &amp;agrave; fond les possibilit&amp;eacute;s de Silverlight/WPF ! 
&lt;/p&gt;
&lt;p&gt;
H&amp;eacute;las, que nenni... En r&amp;eacute;alit&amp;eacute; ce qui aura &amp;eacute;t&amp;eacute; fait n&amp;#39;aura concern&amp;eacute; que la seule apparence. Mettre du rond l&amp;agrave; o&amp;ugrave; c&amp;#39;&amp;eacute;tait habituellement carr&amp;eacute; ou l&amp;#39;inverse. C&amp;#39;est la mode dans son sens le plus n&amp;eacute;gatif et le plus p&amp;eacute;joratif qui soit : une lubie temporaire qui fait que si on n&amp;#39;a pas les derni&amp;egrave;res Nike en cour de r&amp;eacute;cr&amp;eacute; on passe pour un ringard &amp;agrave; qui plus personne ne veut parler. Angoisse permanente de l&amp;#39;ado moderne. C&amp;#39;est le c&amp;ocirc;t&amp;eacute; aga&amp;ccedil;ant, &amp;quot;fashion victim&amp;quot;, la mode pour la mode, &amp;eacute;cervel&amp;eacute;e. Pourquoi ? &lt;strong&gt;Parce que la mode sans un vrai concept n&amp;#39;est rien&lt;/strong&gt;. 
&lt;/p&gt;
&lt;h2&gt;La force du concept&lt;/h2&gt;
&lt;p&gt;
Tout est concept, la r&amp;eacute;alisation n&amp;#39;est finalement que le passage oblig&amp;eacute; pour donner corps &amp;agrave; un concept. Un compositeur quand il poss&amp;egrave;de le concept, l&amp;#39;id&amp;eacute;e d&amp;#39;une nouvelle oeuvre, n&amp;#39;a pas besoin de savoir &amp;eacute;crire des partitions ni m&amp;ecirc;me de savoir jouer d&amp;#39;un instrument. Le vrai acte de cr&amp;eacute;ation est purement intellectuel. C&amp;#39;est un pur concept. Mais pour le communiquer &amp;agrave; ses semblables il lui faudra passer par la r&amp;eacute;alisation. Souvent d&amp;#39;ailleurs un compositeur fera appel &amp;agrave; un arrangeur pour tout ou partie de son oeuvre. Par exemple quelqu&amp;#39;un qui est sp&amp;eacute;cialis&amp;eacute; dans les parties de violons ou dans celles des cuivres. Tout le monde n&amp;#39;est pas Mozart, ce qui n&amp;#39;emp&amp;ecirc;che pas des tas de compositeurs d&amp;#39;&amp;ecirc;tre connus et reconnus. Pour les films il en va de m&amp;ecirc;me. L&amp;#39;auteur n&amp;#39;est que rarement le r&amp;eacute;alisateur, et encore moins souvent le dialoguiste. Cela enl&amp;egrave;ve-t-il de la valeur &amp;agrave; son manuscrit sans qui le film n&amp;#39;existerait pas ? 
&lt;/p&gt;
&lt;p&gt;
Le passage au tout conceptuel est justement l&amp;#39;apanage de l&amp;#39;art contemporain. Certains y voient une fumisterie car ils n&amp;#39;ont pas compris qu&amp;#39;ici la cassure a eu lieu : la r&amp;eacute;alisation n&amp;#39;est que la partie visible de l&amp;#39;iceberg, l&amp;#39;essentiel de l&amp;#39;oeuvre se trouve dans le ... concept. C&amp;#39;est pourquoi le bonhomme &amp;agrave; t&amp;ecirc;te carr&amp;eacute; dessin&amp;eacute; par votre fils de 5 ans n&amp;#39;a aucune valeur autre que sentimentale alors que celle d&amp;#39;un Picasso s&amp;#39;arrache &amp;agrave; coup de millions de dollars (m&amp;ecirc;me si ici la sp&amp;eacute;culation purement financi&amp;egrave;re vient g&amp;acirc;cher toute la beaut&amp;eacute; de l&amp;#39;art, mais c&amp;#39;est encore un autre sujet!). Picasso n&amp;#39;est pas un handicap&amp;eacute; moteur ne sachant pas faire mieux que des t&amp;ecirc;tes carr&amp;eacute;es, il dessine &amp;agrave; merveille, comme un Dali ou un Miro. Mais il a choisi de casser le moule, de s&amp;#39;exprimer autrement en &amp;eacute;chappant au carcan normatif, et pour cela il a beaucoup r&amp;eacute;fl&amp;eacute;chit ! Le changement est principalement et purement&amp;nbsp;conceptuel, bien avant d&amp;#39;&amp;ecirc;tre dans le geste du pinceau sur la toile. 
&lt;/p&gt;
&lt;h2&gt;Une autre repr&amp;eacute;sentation du monde&lt;/h2&gt;
&lt;p&gt;
Revenons &amp;agrave; notre application bancaire. Que c&amp;#39;est triste comme sujet... M&amp;ecirc;me relook&amp;eacute; sous Blend, que cet &amp;eacute;talage de chiffres sera r&amp;eacute;barbatif. N&amp;#39;y-a-til pas moyen de casser le cadre, d&amp;#39;&amp;eacute;chapper au carcan normatif ? Ne peut-on pas ajouter quelques grammes de douceurs dans ce monde de brutes ? Un poil de po&amp;eacute;sie ? 
&lt;/p&gt;
&lt;p&gt;
Si, cela est possible. A condition de re-conceptualiser le rapport homme / machine, et donc les interfaces. 
&lt;/p&gt;
&lt;h3&gt;Un peu de po&amp;eacute;sie&lt;/h3&gt;
&lt;p&gt;
Tr&amp;egrave;s honn&amp;ecirc;tement la bourse n&amp;#39;est pas un sujet qui m&amp;#39;inspire beaucoup de po&amp;eacute;sie mais faisons un effort ! 
&lt;/p&gt;
&lt;p&gt;
Dans notre exemple chaque action se singularise par un nom, une quantit&amp;eacute; poss&amp;eacute;d&amp;eacute;e, un cours et par un indicateur signalant si elle est surveill&amp;eacute;e ou non. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Transformons ces donn&amp;eacute;es en acteurs&lt;/strong&gt;. Car le changement conceptuel est en partie l&amp;agrave;. Chaque action sera ici un acteur autonome. Ne nous reste plus qu&amp;#39;&amp;agrave; choisir comment cet acteur sera &lt;strong&gt;repr&amp;eacute;sent&amp;eacute;&lt;/strong&gt; et dans quel &lt;strong&gt;univers&lt;/strong&gt; on va le faire vivre. 
&lt;/p&gt;
&lt;p&gt;
Par contraste choisissons un cadre na&amp;iuml;f &amp;agrave; l&amp;#39;oppos&amp;eacute; du monde de la finance : une sc&amp;egrave;ne champ&amp;ecirc;tre. Notre d&amp;eacute;cor sera une clairi&amp;egrave;re avec une for&amp;ecirc;t en arri&amp;egrave;re plan. La tendance du CAC40 ? Nous allons la repr&amp;eacute;senter par le temps qu&amp;#39;il fait : ciel bleu neutre quand l&amp;#39;indice est stable, soleil caniculaire lorsque que l&amp;#39;indice d&amp;eacute;passe un certain pourcentage de hausse par rapport &amp;agrave; la veille, pluie voire temp&amp;ecirc;te lorsque l&amp;#39;indice se casse la figure. 
&lt;/p&gt;
&lt;p&gt;
Voil&amp;agrave; d&amp;eacute;j&amp;agrave; une information conventionnelle et r&amp;eacute;barbative repr&amp;eacute;sent&amp;eacute;e d&amp;#39;une autre fa&amp;ccedil;on, non conventionnelle. Imaginez-vous un &amp;eacute;cran g&amp;eacute;ant, quelque part sur un mur du bureau. Un joli d&amp;eacute;cor de campagne anim&amp;eacute;. Quelques nuages arrivent dans le ciel. L&amp;#39;oeil averti de l&amp;#39;utilisateur saura que le CAC40 est en baisse l&amp;eacute;g&amp;egrave;re. Avec l&amp;#39;habitude, en comptant les nuages dans le ciel il saura m&amp;ecirc;me dire de combien de pourcent. Tout cela sans datagrid ni alignement de chiffres.... 
&lt;/p&gt;
&lt;p&gt;
Mais poussons plus loin les choses et int&amp;eacute;grons les actions &amp;agrave; ce paysage. &lt;br /&gt;
Supposons que chaque action soit repr&amp;eacute;sent&amp;eacute;e par un animal qui va &amp;eacute;voluer dans le d&amp;eacute;cor. &lt;br /&gt;
Total, ce goinfre, sera peut-&amp;ecirc;tre represent&amp;eacute; par un sanglier fouillant le sol. Air France sera repr&amp;eacute;sent&amp;eacute; par une libellule, les Ciments Lafarge par un castor, etc. Maintenant appliquons &amp;agrave; ses animaux des &lt;strong&gt;comportements en fonction des donn&amp;eacute;es&lt;/strong&gt; chiffr&amp;eacute;es. Le nom n&amp;#39;est plus une donn&amp;eacute;e &amp;agrave; affich&amp;eacute;e, le caract&amp;egrave;re choisi pour chaque action est une identit&amp;eacute;. Une donn&amp;eacute;e de moins &amp;agrave; afficher. La quantit&amp;eacute; d&amp;#39;action sera repr&amp;eacute;sent&amp;eacute;e par la position de l&amp;#39;animal :&amp;nbsp;&amp;agrave; l&amp;#39;avant-plan&amp;nbsp;quand on poss&amp;egrave;de beaucoup d&amp;#39;action de ce type,&amp;nbsp;loin quand on en poss&amp;egrave;de peu. Encore une colonne du data grid qui devient inutile. Le cours est-il &amp;agrave; la hausse ou la baisse que l&amp;#39;animal aura un comportement joyeux, bondissant dans le d&amp;eacute;cors, ou bien qu&amp;#39;il semblera mou, fig&amp;eacute;, voire couch&amp;eacute; sur le flanc au sol. Plus besoin de datagrid ! 
&lt;/p&gt;
&lt;p&gt;
Et le caract&amp;egrave;re actif/inactif de la surveillance d&amp;#39;une action ? Imaginons un enclos dans le d&amp;eacute;cor. Par simple Drag&amp;#39;drop (avec le doigt comme sur Surface) prenons un animal et posons-le dans l&amp;#39;enclos. Le logiciel interpr&amp;egrave;tera cela comme l&amp;#39;exact effet d&amp;#39;une case &amp;agrave; cocher &amp;quot;surveillance active&amp;quot; qui sera d&amp;eacute;coch&amp;eacute;e. Reprendre l&amp;#39;animal et le sortir de l&amp;#39;enclos aura l&amp;#39;effet inverse. 
&lt;/p&gt;
&lt;h2&gt;Une id&amp;eacute;e folle ?&lt;/h2&gt;
&lt;p&gt;
Fermez les yeux et imaginez ce tableau vivant un instant... Une sc&amp;egrave;ne de campagne avec des petits animaux qui se prom&amp;egrave;nent, le temps qui change, ah, tiens, une &amp;eacute;claircie. Le pauvre castor a l&amp;#39;air bien malade se matin... 
&lt;/p&gt;
&lt;p&gt;
Bien entendu, certains voudront savoir ce que j&amp;#39;ai fum&amp;eacute; aujourd&amp;#39;hui, c&amp;#39;est un risque que j&amp;#39;ai pris et que j&amp;#39;assume en &amp;eacute;crivant ce billet :-) 
&lt;/p&gt;
&lt;p&gt;
Mais ce que nous venons de faire ici est de transformer une application&amp;nbsp;r&amp;eacute;barbative qui, dans le meilleur des cas aurait &amp;eacute;t&amp;eacute; rendu sous la forme de tableaux de chiffres aux coins arrondis servis par quelques boutons anim&amp;eacute;s et une poign&amp;eacute;e de drop shadow, en une sc&amp;egrave;ne champ&amp;ecirc;tre, charmante. Quelque chose qui donne envie de regarder le programme fonctionner juste pour le plaisir. Car &lt;strong&gt;les donn&amp;eacute;es sont devenues des acteurs&lt;/strong&gt;, car le cadre du &lt;strong&gt;programme est devenu un univers&amp;nbsp;auto-suffisant&lt;/strong&gt;. 
&lt;/p&gt;
&lt;h2&gt;La cassure est l&amp;agrave;&lt;/h2&gt;
&lt;p&gt;
Plus de cases &amp;agrave; cocher, plus de colonnes de chiffres, plus rien de normatif ni conventionnel. Les donn&amp;eacute;es sont des acteurs autonomes qui &lt;strong&gt;racontent une histoire&lt;/strong&gt;. 
&lt;/p&gt;
&lt;h3&gt;Est-ce si fou ?&lt;/h3&gt;
&lt;p&gt;
Il est &amp;eacute;vident que l&amp;#39;exemple que j&amp;#39;ai pris des cours de la bourse et sa repr&amp;eacute;sentation gentillement niaise fa&amp;ccedil;on Walt Disney est un simple contrepied volontairement ironique, mais pas seulement. Imaginez-vous encore ce joli tableau dans le bureau d&amp;#39;un riche sp&amp;eacute;culateur... Ne pensez-vous pas que je pourrais vendre des installations compl&amp;egrave;tes, tr&amp;egrave;s cher, et que cela marcherait ? Certainement que si. Alors que personne ne voudrait acheter le &amp;eacute;ni&amp;egrave;me logiciel de gestion de portefeuille que je pourrais &amp;eacute;crire, m&amp;ecirc;me relook&amp;eacute; sous Blend ! Certains m&amp;ecirc;me parleraient alors de snobisme, de gadget. Ceux qui ne pourraient s&amp;#39;offrir mon syst&amp;egrave;me bien entendu.&amp;nbsp;Mais pas les utilisateurs qui l&amp;#39;ach&amp;egrave;teraient et qui en seraient tr&amp;egrave;s contents ! La &amp;quot;mode&amp;quot; serait lanc&amp;eacute;e ! 
&lt;/p&gt;
&lt;p&gt;
Ce qu&amp;#39;il faut donc comprendre ici c&amp;#39;est que les &amp;quot;nouvelles interfaces utilisateurs&amp;quot; l&amp;#39;UX (User eXperience), ce nouveau paradigme dont je parle ici bien souvent et depuis un moment maintenant, n&amp;#39;est pas &amp;quot;qu&amp;#39;une mode&amp;quot;, c&amp;#39;est un &lt;strong&gt;changement conceptuel&lt;/strong&gt;, donc en profondeur, du &lt;strong&gt;rapport entre l&amp;#39;homme et la machine&lt;/strong&gt;. C&amp;#39;est une &lt;strong&gt;nouvelle fa&amp;ccedil;on de penser les donn&amp;eacute;es&lt;/strong&gt; non plus comme des informations passives mais comme des acteurs autonomes &amp;eacute;voluant dans un univers vivant. 
&lt;/p&gt;
&lt;h2&gt;Et concr&amp;egrave;tement ?&lt;/h2&gt;
&lt;p&gt;
Tout cela est bien gentil, mais certains se disent (les plus courageux, ceux qui sont arriv&amp;eacute;s jusqu&amp;#39;&amp;agrave; cette ligne ! - merci au passage :-) ) que bon, ils ont un soft &amp;agrave; faire pour hier et qu&amp;#39;ils voient mal comment tout ce gentil d&amp;eacute;lire peut s&amp;#39;appliquer &amp;agrave; une compatibilit&amp;eacute; analytique ou une facturation. 
&lt;/p&gt;
&lt;p&gt;
Je leur r&amp;eacute;pondrais que si j&amp;#39;ai pu tranformer, m&amp;ecirc;me virtuellement dans ces lignes, une application de gestion portefeuille boursier en une sc&amp;egrave;ne de campagne tout peut &amp;ecirc;tre fait ! &lt;br /&gt;
Pourquoi ne pas transformer les comptes clients en bulles de couleurs &amp;eacute;voluant dans un aquarium, plus la bulle est grosse plus l&amp;#39;encours du client est important, ou bien pour les commerciaux, plus la bulle devient grosse plus il est temps d&amp;#39;appeler le client car il n&amp;#39;a pas pass&amp;eacute; de commande depuis longtemps. Quelques jolis &amp;eacute;crans plats sur les murs du service commercial ou dans le bureau du patron permettraient imm&amp;eacute;diatement de suivre la vie de l&amp;#39;entreprise, sans chiffres, sans cases &amp;agrave; cocher ni boutons radio, sans fen&amp;ecirc;tre aux coins ronds ou non... 
&lt;/p&gt;
&lt;h3&gt;Application exemple&lt;/h3&gt;
&lt;p&gt;
Dans mon temps perdu (autant dire pas grand chose) je suis en train de faire une petite application Silverlight qui met en pratique ces concepts pour faire comprendre comment on passe de mes explications &amp;agrave; un vrai logiciel qui fait quelque chose de r&amp;eacute;el. Le code C# de l&amp;#39;application est d&amp;eacute;j&amp;agrave; &amp;eacute;crit et test&amp;eacute;, c&amp;#39;est bien entendu le look qui prend le plus de temps dans un tel cas. Des mock-up en 3D, du sketching sur des bouts de papier, des dessins sous Expression Design, il me reste &amp;agrave; mettre tout cela en forme sous Blend. 
&lt;/p&gt;
&lt;p&gt;
Un autre exemple existe depuis quelques ann&amp;eacute;es, il n&amp;#39;est pas logiciel mais bien du domaine informatique tout de m&amp;ecirc;me : le lapin &lt;a href="http://www.nabaztag.com/fr/index.html" target="_blank"&gt;Nabaztag&lt;/a&gt;. Tiens, il baisse l&amp;#39;oreille gauche... le CAC 40 se casse la figure. Ah, il devient rouge, ma ch&amp;eacute;rie a laiss&amp;eacute; un message sur mon r&amp;eacute;pondeur... Le cr&amp;eacute;ateur du Nabaztag a tout compris de cette cassure conceptuelle et des nouvelles interfaces utilisateur... 
&lt;/p&gt;
&lt;p&gt;
Si le sujet vous int&amp;eacute;resse, et pour voir prochainement une illustration de ce que je viens d&amp;#39;expliquer ici, alors une seule solution : 
&lt;/p&gt;
&lt;p&gt;
Stay Tuned ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/xqocL8q-zjQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/xqocL8q-zjQ/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/09/01/Le-defit-des-nouvelles-interfaces-Silverlight-et-WPF-La-cassure-conceptuelle.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=9b29288a-02ca-4fc6-8a84-0996f6342b61</guid>
      <pubDate>Tue, 01 Sep 2009 18:55:00 +0200</pubDate>
      <category>Articles</category>
      <category>Design</category>
      <category>Données</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=9b29288a-02ca-4fc6-8a84-0996f6342b61</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=9b29288a-02ca-4fc6-8a84-0996f6342b61</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/09/01/Le-defit-des-nouvelles-interfaces-Silverlight-et-WPF-La-cassure-conceptuelle.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=9b29288a-02ca-4fc6-8a84-0996f6342b61</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=9b29288a-02ca-4fc6-8a84-0996f6342b61</feedburner:origLink></item>
    <item>
      <title>Silverlight et la sérialisation</title>
      <description>&lt;p&gt;
La s&amp;eacute;rialisation est un besoin fr&amp;eacute;quent que le framework .NET sait parfaitement g&amp;eacute;rer. La s&amp;eacute;rialisation binaire s&amp;#39;obtient d&amp;#39;ailleurs le plus naturellement du monde en ajoutant un simple attribut &lt;font face="courier new,courier"&gt;[Serializable]&lt;/font&gt; &amp;agrave; la d&amp;eacute;finition de la classe. Mais voil&amp;agrave;, essayez de d&amp;eacute;corer une classe avec &lt;font face="courier new,courier"&gt;SerializableAttribute&lt;/font&gt; sous Silverlight... Surprise ! Un message d&amp;#39;erreur vous pr&amp;eacute;vient que l&amp;#39;espace de nom ne peut &amp;ecirc;tre trouv&amp;eacute;. 
&lt;/p&gt;
&lt;h3&gt;Pas de s&amp;eacute;rialisation ?&lt;/h3&gt;
&lt;p&gt;
Non. Pas de s&amp;eacute;rialisation binaire en tout cas sous Silverlight jusqu&amp;#39;&amp;agrave; maintenant (v 3.0 au moment de ce billet). La classe &lt;font face="courier new,courier"&gt;SerializableAttribute&lt;/font&gt; n&amp;#39;est tout simplement pas d&amp;eacute;finie dans &lt;font face="courier new,courier"&gt;System&lt;/font&gt;. 
&lt;/p&gt;
&lt;p&gt;
Avant d&amp;#39;aller crier au scandale sur les blogs ou forums officiels essayons de r&amp;eacute;fl&amp;eacute;chir... 
&lt;/p&gt;
&lt;h3&gt;A quoi sert la s&amp;eacute;rialisation ?&lt;/h3&gt;
&lt;p&gt;
S&amp;eacute;rialiser, cela sert &amp;agrave; prendre un &amp;quot;clich&amp;eacute;&amp;quot; d&amp;#39;une instance dans le but d&amp;#39;&amp;ecirc;tre capable de recr&amp;eacute;er une copie parfaite de cette derni&amp;egrave;re au bout d&amp;#39;un certain temps. 
&lt;/p&gt;
&lt;p&gt;
Un certain temps... cela peut &amp;ecirc;tre une milliseconde ou bien 1 jour ou 1 an. Dans le premier cas le stockage du &amp;quot;clich&amp;eacute;&amp;quot; est en m&amp;eacute;moire g&amp;eacute;n&amp;eacute;ralement, mais dans le second, il s&amp;#39;agit le plus souvent d&amp;#39;un stockage persistant tel qu&amp;#39;un fichier disque ou une base de donn&amp;eacute;es. 
&lt;/p&gt;
&lt;h3&gt;Pas de gestion de disque local en RIA&lt;/h3&gt;
&lt;p&gt;
La nature m&amp;ecirc;me de Silverlight et le style bien particulier d&amp;#39;applications qu&amp;#39;il permet d&amp;#39;&amp;eacute;crire fait qu&amp;#39;il n&amp;#39;existe aucune gestion de disque local. En r&amp;eacute;alit&amp;eacute; il n&amp;#39;existe rien qui permette d&amp;#39;acc&amp;eacute;der &amp;agrave; la machine h&amp;ocirc;te, en lecture comme en &amp;eacute;criture, question de s&amp;eacute;curit&amp;eacute;. 
&lt;/p&gt;
&lt;p&gt;
On notera quelques exceptions &amp;agrave; cette r&amp;egrave;gle : l&amp;#39;OpenFileDialog qui permet d&amp;#39;ouvrir uniquement certains fichiers sur les disques de l&amp;#39;h&amp;ocirc;te et l&amp;#39;IsolatedStorage, espace de stockage local prot&amp;eacute;g&amp;eacute; pouvant &amp;ecirc;tre utilis&amp;eacute; par une application Silverlight. Toutefois OpenFileDialog ne r&amp;egrave;gle pas le probl&amp;egrave;me de persistance et si l&amp;#39;IsolatedStorage peut &amp;ecirc;tre exploit&amp;eacute; en ce sens il s&amp;#39;agit d&amp;#39;un espace restreint, inlocalisable par un utilisateur &amp;quot;normal&amp;quot; donc in-sauvegardable s&amp;eacute;lectivement. Autant dire que l&amp;#39;IsolatedStorage peut rendre des services ponctuels (cache de donn&amp;eacute;es principalement) mais que ce n&amp;#39;est certainement pas l&amp;#39;endroit o&amp;ugrave; stocker des donn&amp;eacute;es sensibles ou &amp;agrave; dur&amp;eacute;e de vie un peu longue. 
&lt;/p&gt;
&lt;p&gt;
Bref, en dehors de ces exceptions qui ne r&amp;egrave;glent pas tout &amp;agrave; fait le besoin de persistance des instances, une application de type RIA ne peut s&amp;eacute;rieusement g&amp;eacute;rer des donn&amp;eacute;es que distantes... 
&lt;/p&gt;
&lt;h3&gt;En tout logique...&lt;/h3&gt;
&lt;p&gt;
Reprenons : la s&amp;eacute;rialisation sert &amp;agrave; persister des instances pour un stockage &amp;agrave; plus ou moins longue &amp;eacute;ch&amp;eacute;ance ou une communication avec un serveur distant. La nature d&amp;#39;une application RIA supprime la libert&amp;eacute; d&amp;#39;un stockage local fiable et facilement maitrisable. 
&lt;/p&gt;
&lt;p&gt;
En toute logique s&amp;eacute;rialiser des instances sous Silverlight n&amp;#39;a donc aucun int&amp;eacute;r&amp;ecirc;t, sauf pour communiquer avec un serveur distant. 
&lt;/p&gt;
&lt;p&gt;
Comme le framework .NET pour Silverlight est une version light du framework complet il a bien fallu faire des coupes sombres... La s&amp;eacute;rialisation n&amp;#39;a pas &amp;eacute;chapp&amp;eacute; &amp;agrave; cette rigueur. La principale raison d&amp;#39;&amp;ecirc;tre de la s&amp;eacute;rialisation sous Silverlight &amp;eacute;tant la communication (quelle que soit la technologie cela se fait sur une base XML le plus souvent) et cela r&amp;eacute;clamant une s&amp;eacute;rialisation XML plut&amp;ocirc;t que binaire, &lt;font face="courier new,courier"&gt;SerializableAttribute&lt;/font&gt; et sa s&amp;eacute;rialisation binaire ont ainsi &amp;eacute;t&amp;eacute; &amp;quot;zapp&amp;eacute;s&amp;quot; ! 
&lt;/p&gt;
&lt;h3&gt;Une solution&lt;/h3&gt;
&lt;p&gt;
La situation est grave mais pas d&amp;eacute;sesp&amp;eacute;r&amp;eacute;e. S&amp;#39;il reste difficile le plus souvent d&amp;#39;utiliser directement sous Silverlight des classes con&amp;ccedil;ues pour le framework complet (et pas seulement &amp;agrave; cause de la s&amp;eacute;rialisation binaire), il est tout &amp;agrave; fait possible de s&amp;eacute;rialiser des instances sous Silverlight &amp;agrave; condition d&amp;#39;utiliser les m&amp;eacute;canismes qui servent aux communications avec les serveurs distants. 
&lt;/p&gt;
&lt;h3&gt;Le DataContract&lt;/h3&gt;
&lt;p&gt;
Silverlight utilise une partie du m&amp;eacute;canisme WCF du &lt;font face="courier new,courier"&gt;DataContract&lt;/font&gt; (mais l&amp;#39;attribut &lt;font face="courier new,courier"&gt;DataMember&lt;/font&gt; n&amp;#39;existe pas). On trouve m&amp;ecirc;me une classe le &lt;font face="courier new,courier"&gt;DataContractSerializer&lt;/font&gt; qui fournit le n&amp;eacute;cessaire pour s&amp;eacute;rialiser et d&amp;eacute;s&amp;eacute;rialiser des instances m&amp;ecirc;me si celles-ci ne sont d&amp;eacute;cor&amp;eacute;es d&amp;#39;aucun attribut particulier. 
&lt;/p&gt;
&lt;p&gt;
Au final la s&amp;eacute;rialisation sous Silverlight est plus simple que la s&amp;eacute;rialisation binaire par &lt;font face="courier new,courier"&gt;SerializableAttribute&lt;/font&gt; sous le framework complet ! 
&lt;/p&gt;
&lt;h3&gt;Un exemple de code&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://www.ingebrigtsen.info/post/2008/11/29/Serialization-in-Silverlight.aspx" target="_blank"&gt;Einar Ingebrigtsen&lt;/a&gt;, un MVP nordiste travaillant en scandinavie, &amp;agrave; eu la bonne id&amp;eacute;e de proposer deux m&amp;eacute;thodes utilitaires qui montrent comment utiliser le &lt;font face="courier new,courier"&gt;DataContractSerializer&lt;/font&gt;. Plut&amp;ocirc;t que d&amp;#39;imiter et r&amp;eacute;inventer la roue, regardons son code : 
&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Serialize&amp;lt;T&amp;gt;(T data)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (var memoryStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream())
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                var serializer = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataContractSerializer(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T));
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                serializer.WriteObject(memoryStream, data);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                memoryStream.Seek(0, SeekOrigin.Begin);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                var reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamReader(memoryStream);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                &lt;span class="kwrd"&gt;string&lt;/span&gt; content = reader.ReadToEnd();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; content;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; T Deserialize&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt; xml)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (var stream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(Encoding.Unicode.GetBytes(xml)))
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                var serializer = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataContractSerializer(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T));
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                T theObject = (T)serializer.ReadObject(stream);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; theObject;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
C&amp;#39;est simple et efficace. Attention, pour utiliser ce code il faudra ajouter une r&amp;eacute;f&amp;eacute;rence &amp;agrave; &lt;font face="courier new,courier"&gt;System.Runtime.Serialization.dll&lt;/font&gt;, puis un using &lt;font face="courier new,courier"&gt;System.Runtime.Serialization&lt;/font&gt;. 
&lt;/p&gt;
&lt;p&gt;
L&amp;#39;utilisation de ces m&amp;eacute;thodes tombe d&amp;egrave;s lors sous le sens, mais un petit exemple est toujours plus parlant : 
&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;{ ....
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="rem"&gt;// nouvelle instance &lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;var t = &lt;span class="kwrd"&gt;new&lt;/span&gt; Test { Field1 = &lt;span class="str"&gt;&amp;quot;test de serialisation&amp;quot;&lt;/span&gt;, Field2 = 7 };
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;t.List.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; test2 { Field1 = &lt;span class="str"&gt;&amp;quot;item 1&amp;quot;&lt;/span&gt; });
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;t.List.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; test2 { Field1 = &lt;span class="str"&gt;&amp;quot;item 2&amp;quot;&lt;/span&gt; });
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;t.List.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; test2 { Field1 = &lt;span class="str"&gt;&amp;quot;item 3&amp;quot;&lt;/span&gt; });
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="rem"&gt;// s&amp;eacute;rialisation et affichage&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;var s = Serialize&amp;lt;Test&amp;gt;(t);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;var sp = &lt;span class="kwrd"&gt;new&lt;/span&gt; StackPanel { Orientation = Orientation.Vertical };
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;LayoutRoot.Children.Add(sp);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;sp.Children.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; TextBlock { Text = s });
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&lt;span class="rem"&gt;// d&amp;eacute;s&amp;eacute;rialisation et affichage&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;Var t2 = Deserialize&amp;lt;Test&amp;gt;(s);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  16:  &lt;/span&gt;var result = t2 == &lt;span class="kwrd"&gt;null&lt;/span&gt; ? &lt;span class="str"&gt;&amp;quot;null&amp;quot;&lt;/span&gt; : &lt;span class="str"&gt;&amp;quot;instantiated&amp;quot;&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  17:  &lt;/span&gt;sp.Children.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; TextBlock { Text = result });
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  18:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  19:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&lt;span class="rem"&gt;// la classe de test&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  21:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Test
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  22:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  23:  &lt;/span&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Field1 { get; set; }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  24:  &lt;/span&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Field2 { get; set; }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  25:  &lt;/span&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; ObservableCollection&amp;lt;test2&amp;gt; list = 
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; ObservableCollection&amp;lt;test2&amp;gt;();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  27:  &lt;/span&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; ObservableCollection&amp;lt;test2&amp;gt; List { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; list; } }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  28:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  30:  &lt;/span&gt;&lt;span class="rem"&gt;// la classe des &amp;eacute;l&amp;eacute;ments de la liste de la classe Test&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  31:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; test2
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  32:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  33:  &lt;/span&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Field1 { get; set; }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  34:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;
Une fois que l&amp;#39;on a compris pourquoi la s&amp;eacute;rialisation binaire est absente de Silverlight, et une fois qu&amp;#39;on a trouv&amp;eacute; une solution de rechange, on se sent beaucoup mieux :-) 
&lt;/p&gt;
&lt;p&gt;
Il reste maintenant tout &amp;agrave; fait possible de stocker en local le r&amp;eacute;sultat de la s&amp;eacute;rialisation dans un fichier texte (en utilisant l&amp;#39;IsolatedStorage sur lequel je reviendrai) ou bien de le transmettre &amp;agrave; service Web ou autre... 
&lt;/p&gt;
&lt;p&gt;
Stay Tuned ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/tAeZhvil3sE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/tAeZhvil3sE/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/25/Silverlight-et-la-serialisation.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=64e8a5bc-6b3d-428c-95d0-25b4c5a16b05</guid>
      <pubDate>Tue, 25 Aug 2009 16:29:00 +0200</pubDate>
      <category>Articles</category>
      <category>Astuce</category>
      <category>C#</category>
      <category>Données</category>
      <category>Framework .NET</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=64e8a5bc-6b3d-428c-95d0-25b4c5a16b05</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=64e8a5bc-6b3d-428c-95d0-25b4c5a16b05</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/25/Silverlight-et-la-serialisation.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=64e8a5bc-6b3d-428c-95d0-25b4c5a16b05</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=64e8a5bc-6b3d-428c-95d0-25b4c5a16b05</feedburner:origLink></item>
    <item>
      <title>Bien commencer avec Silverlight 3 (les setup indispensables)</title>
      <description>&lt;p&gt;
Silverlight 3 est disponible depuis juillet dernier mais il n&amp;#39;est pas toujours &amp;eacute;vident de savoir exactement ce qu&amp;#39;il est n&amp;eacute;cessaire de t&amp;eacute;l&amp;eacute;charger et o&amp;ugrave; pour bien commencer. 
&lt;/p&gt;
&lt;p&gt;
Les vacances sont pass&amp;eacute;es par dessus tout &amp;ccedil;a, du coup vous n&amp;#39;avez pas forc&amp;eacute;ment bien suivi l&amp;#39;action, alors pour vous voici en mode slow motion, le replay des indispensables &amp;agrave; installer pour s&amp;#39;amuser comme un fou avec Silverlight 3 et surtout &amp;ecirc;tre au point pour concevoir des applications RIA ! 
&lt;/p&gt;
&lt;h3&gt;Silverlight 3&lt;/h3&gt;
&lt;p&gt;
Le runtime est indispensable pour, au minimum, pouvoir ex&amp;eacute;cuter les applications :&amp;nbsp;Le &lt;a href="http://www.microsoft.com/silverlight/get-started/install/default.aspx" target="_blank"&gt;runtime Silverlight 3&lt;br /&gt;
&lt;/a&gt;Le SDK est en revanche le minimum syndical pour concevoir des applications Silverlight 3 : Le &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=2050e580-f1d5-4040-bb09-e6185591b6b5&amp;amp;displaylang=fr" target="_blank"&gt;SDK Silverlight 3&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;Expression Blend 3 avec Sketchflow&lt;/h3&gt;
&lt;p&gt;
Blend est un l&amp;#39;outil indispensable pour cr&amp;eacute;er des applications WPF et Silverlight. D&amp;#39;autant plus que depuis la version 3 de Silverlight il n&amp;#39;y a plus d&amp;#39;affichage du visuel sous VS 2008. Il reste la possibilit&amp;eacute; de tout faire &amp;agrave; la main en mode &amp;eacute;diteur de XAML mais franchement ce n&amp;#39;est pas comme &amp;ccedil;a qu&amp;#39;on peut cr&amp;eacute;er s&amp;eacute;rieusement un visuel alors&amp;nbsp;: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e82db5e2-7106-419e-80b0-65cce89f06bb&amp;amp;displaylang=en" target="_blank"&gt;Blend 3 et Sketchflow&lt;/a&gt;&lt;br /&gt;
Vous noterez qu&amp;#39;il s&amp;#39;agit d&amp;#39;une version d&amp;#39;essai, Blend 3 n&amp;#39;a pas de version gratuite. 
&lt;/p&gt;
&lt;h3&gt;Visual Studio 2008&lt;/h3&gt;
&lt;p&gt;
En attendant la version 2010 qui int&amp;egrave;grera le designer visuel de Silverlight, il est toujours n&amp;eacute;cessaire de poss&amp;eacute;der VS 2008. En effet, Blend ne g&amp;egrave;re pas le debug qui ne peut s&amp;#39;effectuer que par VS. Bien qu&amp;#39;un &amp;eacute;diteur de code a &amp;eacute;t&amp;eacute; ajout&amp;eacute; &amp;agrave; Blend 3 il est aussi plus confortable d&amp;#39;utiliser Visual Studio pour toute la partie code. Si vous ne poss&amp;eacute;dez pas VS 2008 : &lt;a href="http://www.microsoft.com/visualstudio/en-us/default.mspx" target="_blank"&gt;Version d&amp;#39;essai de VS 2008&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;Visual Web Developer Express&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;
Si vous pr&amp;eacute;f&amp;eacute;rez un outil gratuit, n&amp;#39;oubliez pas que &lt;a href="http://www.microsoft.com/express/vwd/" target="_blank"&gt;Visual Web Express &lt;/a&gt;est une bonne alternative &amp;agrave; Visual Studio. 
&lt;/p&gt;
&lt;h3&gt;Outils Silverlight &lt;/h3&gt;
&lt;p&gt;
Tout un tas de choses indispensables notamment pour permettre de travailler sous Visual Studio ou Visual Web Express. A noter que VS doit &amp;ecirc;tre absolument patch&amp;eacute; avec le SP1 avant d&amp;#39;installer tout &amp;ccedil;a : &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=9442b0f2-7465-417a-88f3-5e7b5409e9dd&amp;amp;displaylang=en" target="_blank"&gt;Les Silverlight Tools&lt;/a&gt;. 
&lt;/p&gt;
&lt;h3&gt;Le Toolkit&lt;/h3&gt;
&lt;p&gt;
Silverlight 3 est un produit riche, mais il l&amp;#39;est encore plus lorsque le toolkit est install&amp;eacute;. De tr&amp;egrave;s nombreux contr&amp;ocirc;les indispensables sont ajout&amp;eacute;s : le &lt;a href="http://www.codeplex.com/Silverlight" target="_blank"&gt;Silverlight Toolkit&lt;/a&gt;. 
&lt;/p&gt;
&lt;h3&gt;Les RIA Services&lt;/h3&gt;
&lt;p&gt;
Gr&amp;acirc;ces aux Services RIA, la gestion de donn&amp;eacute;es distantes (n-tiers) devient un jeu d&amp;#39;enfant. C&amp;#39;est un must pour tous ceux qui souhaitent d&amp;eacute;velopper des applications orient&amp;eacute;es donn&amp;eacute;es avec Silverlight : &lt;a href="http://go.microsoft.com/fwlink/?LinkId=144609" target="_blank"&gt;.NET RIA Services&lt;/a&gt;. 
&lt;/p&gt;
&lt;h3&gt;Deep Zoom Composer&lt;/h3&gt;
&lt;p&gt;
Si vous souhaitez cr&amp;eacute;er des images Deep Zoom, il est n&amp;eacute;cessaire de poss&amp;eacute;der le Composer : &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=457b17b7-52bf-4bda-87a3-fa8a4673f8bf" target="_blank"&gt;Deep Zoom Composer&lt;/a&gt;. 
&lt;/p&gt;
&lt;h3&gt;Le site officiel&lt;/h3&gt;
&lt;p&gt;
Encore un lien indispensable ! La partie &amp;quot;getting started&amp;quot; vous renseigne sur les t&amp;eacute;l&amp;eacute;chargement de base et propose m&amp;ecirc;me un installeur global &amp;quot;Microsoft Web Platform&amp;quot;. Vous trouverez aussi sur ce site de nombreuses vid&amp;eacute;os de pr&amp;eacute;sentation et de formation (en anglais) : Le &lt;a href="http://silverlight.net/GetStarted/" target="_blank"&gt;Site officiel Silverlight.&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;Dot.Blog&lt;/h3&gt;
&lt;p&gt;
Et oui ! Si vous souhaitez rester &amp;agrave; jour et &amp;ecirc;tre au courant, le mieux c&amp;#39;est encore de venir sur &lt;a href="http://www.e-naxos.com/Blog" target="_blank"&gt;Dot.Blog&lt;/a&gt; le plus souvent possible ou mieux, de s&amp;#39;abonner au flux RSS et surtout : Stay Tuned ! 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/tPy9hnpevoU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/tPy9hnpevoU/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/25/Bien-commencer-avec-Silverlight-3-(les-setup-indispensables).aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=1bccd2e9-c417-4a64-b71a-b7da2821c72e</guid>
      <pubDate>Tue, 25 Aug 2009 01:24:00 +0200</pubDate>
      <category>Design</category>
      <category>Données</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=1bccd2e9-c417-4a64-b71a-b7da2821c72e</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=1bccd2e9-c417-4a64-b71a-b7da2821c72e</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/25/Bien-commencer-avec-Silverlight-3-(les-setup-indispensables).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=1bccd2e9-c417-4a64-b71a-b7da2821c72e</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=1bccd2e9-c417-4a64-b71a-b7da2821c72e</feedburner:origLink></item>
    <item>
      <title>Code source Silverlight 'les codes postaux'</title>
      <description>&lt;p&gt;
Il y a quelques temps j&amp;#39;avais mis en ligne l&amp;#39;application exemple &lt;a href="http://www.e-naxos.com/svcp/SVCPTestPage.html" target="_blank"&gt;&lt;strong&gt;&lt;font size="2" color="#cccccc"&gt;Codes Postaux Fran&amp;ccedil;ais sous Silverlight&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;.&amp;nbsp;Application Silverlight 2.0 montrant l&amp;#39;utilisation d&amp;#39;un service Web avec base de donn&amp;eacute;es.
&lt;/p&gt;
&lt;p&gt;
Beaucoup de lecteurs m&amp;#39;ont demand&amp;eacute; si le code source &amp;eacute;tait disponible, ce qui n&amp;#39;&amp;eacute;tait pas le cas. J&amp;#39;avais pr&amp;eacute;vu d&amp;#39;&amp;eacute;crire un article se basant sur ce code mais le temps passant vite sans&amp;nbsp;pouvoir mener &amp;agrave; bien cette &amp;eacute;criture j&amp;#39;ai opt&amp;eacute; pour une publication du code source complet, brut de fonderie.
&lt;/p&gt;
&lt;p&gt;
Vous trouverez le lien de t&amp;eacute;l&amp;eacute;chargement sur la page suivante : &lt;a href="http://www.e-naxos.com/Blog/page/Exemples-Silverlight.aspx"&gt;http://www.e-naxos.com/Blog/page/Exemples-Silverlight.aspx&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/lP-K_n07nqs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/lP-K_n07nqs/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/22/Code-source-Silverlight-les-codes-postaux.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=9efa6a10-4ea4-4bc2-9e97-898e6d11e1c6</guid>
      <pubDate>Sat, 22 Aug 2009 01:23:00 +0200</pubDate>
      <category>Annonce</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=9efa6a10-4ea4-4bc2-9e97-898e6d11e1c6</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=9efa6a10-4ea4-4bc2-9e97-898e6d11e1c6</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/22/Code-source-Silverlight-les-codes-postaux.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=9efa6a10-4ea4-4bc2-9e97-898e6d11e1c6</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=9efa6a10-4ea4-4bc2-9e97-898e6d11e1c6</feedburner:origLink></item>
    <item>
      <title>Silverlight 3 : Un média player complet bien caché !</title>
      <description>&lt;p align="left"&gt;
Silverlight 3 est livr&amp;eacute; de base avec un contr&amp;ocirc;le tr&amp;egrave;s versatile, &lt;font face="courier new,courier"&gt;MediaElement&lt;/font&gt;,&amp;nbsp;capable de jouer de nombreux formats comme les mp3 ou les vid&amp;eacute;os. 
&lt;/p&gt;
&lt;p&gt;
Si ce contr&amp;ocirc;le est tr&amp;egrave;s puissant il est un peu &amp;quot;nu&amp;quot; de base et il faut soi-m&amp;ecirc;me ajouter les boutons de commande comme &amp;quot;play&amp;quot; et looker l&amp;#39;ensemble. Avec &lt;strong&gt;Expression Blend 3&lt;/strong&gt; c&amp;#39;est un jeu d&amp;#39;enfant. Enfin, de grand enfant qui a un peu de temps devant lui tout de m&amp;ecirc;me. D&amp;#39;o&amp;ugrave; la question : n&amp;#39;existerait-il pas un &lt;font face="courier new,courier"&gt;MediaElement &lt;/font&gt;d&amp;eacute;j&amp;agrave; tout habill&amp;eacute; ? 
&lt;/p&gt;
&lt;p&gt;
Si vous poss&amp;eacute;dez &lt;strong&gt;Expression Media Encoder 3&lt;/strong&gt; vous savez que cet extraordinaire outil (servant principalement &amp;agrave; encoder des m&amp;eacute;dias) donne le choix entre plusieurs formats de sortie dont des projets HTML tout fait int&amp;eacute;grant un m&amp;eacute;dia player tout look&amp;eacute;, et mieux encore, avec le choix parmi de nombreux mod&amp;egrave;les. 
&lt;/p&gt;
&lt;p&gt;
Quel rapport entre Media Encoder et un projet Blend/VS ? C&amp;#39;est tout simple : lorsque vous installez Media Encoder, sous Blend 3 dans l&amp;#39;onglet &lt;em&gt;Assets&lt;/em&gt; vous disposez, en plus de MediaElement d&amp;#39;un nouveau contr&amp;ocirc;le &amp;quot;&lt;font face="courier new,courier"&gt;MediaPlayer&lt;/font&gt;&amp;quot; ! 
&lt;/p&gt;
&lt;p&gt;
Par d&amp;eacute;faut ce composant ressemble &amp;agrave; l&amp;#39;image ci-dessous. Pour le relooker, il suffit de faire un clic droit et d&amp;#39;&amp;eacute;diter un copie du template ! 
&lt;/p&gt;
&lt;div style="text-align: center"&gt;
&lt;img src="http://www.e-naxos.com/Blog/image.axd?picture=2009%2f8%2f3837855372_ef9e26dbd7_o%5b1%5d.jpg" alt="" width="500" height="359" /&gt; 
&lt;/div&gt;
&lt;p&gt;
Reste la question &amp;agrave; 10 centimes d&amp;#39;euro : oui mais Media Encoder est livr&amp;eacute; avec de nombreux mod&amp;egrave;les dont certains ont d&amp;eacute;j&amp;agrave; un look sympa, ne pourrait-on pas r&amp;eacute;cup&amp;eacute;rer ces mod&amp;egrave;les au lieu de templater &amp;agrave; la main le MediaPlayer ? 
&lt;/p&gt;
&lt;p&gt;
Si, c&amp;#39;est possible (&amp;copy; Les Nuls, &amp;quot;Hassan Cehef&amp;quot;). 
&lt;/p&gt;
&lt;p&gt;
Comment ? L&amp;agrave; c&amp;#39;est plus cher... Non, comme je suis un chic type, voici la solution gratuite : 
&lt;/p&gt;
&lt;p&gt;
Encoder 3 s&amp;#39;installe avec le code source des mod&amp;egrave;les qui se trouvent dans le r&amp;eacute;pertoire &amp;quot;&lt;font face="courier new,courier"&gt;C:\Program Files\Microsoft Expression\Encoder 3\Templates\en&lt;/font&gt;&amp;quot;, il suffit donc de piocher le mod&amp;egrave;le qu&amp;#39;on d&amp;eacute;sire utiliser, et gr&amp;acirc;ce aux sources d&amp;#39;extraire le contr&amp;ocirc;le avec son template et de l&amp;#39;int&amp;eacute;grer &amp;agrave; son propre projet ! 
&lt;/p&gt;
&lt;p&gt;
Le c&amp;eacute;l&amp;egrave;bre Tim Heuer d&amp;eacute;crit (en englais) la m&amp;eacute;thode &amp;agrave; suivre, je vous renvoie ainsi &amp;agrave; son billet&amp;nbsp;&lt;a id="viewpost_ascx_TitleUrl" href="http://timheuer.com/blog/archive/2008/11/03/use-expression-encoder-templates-in-silverlight-application.aspx" target="_blank" title="Title of this entry."&gt;Using Encoder Templates in your Silverlight Application&lt;/a&gt; si jamais vous n&amp;#39;arrivez pas &amp;agrave; vous d&amp;eacute;patouiller seul avec le code source des projets Encoder 3. 
&lt;/p&gt;
&lt;p&gt;
Int&amp;eacute;grer de la vid&amp;eacute;o, m&amp;ecirc;me HD, dans une application Silverlight n&amp;#39;a jamais &amp;eacute;t&amp;eacute; aussi simple... et beau. 
&lt;/p&gt;
&lt;p&gt;
Amusez-vous bien, et .. Stay Tuned ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/4JfdePnU7sk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/4JfdePnU7sk/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/21/Silverlight-3-Un-media-player-complet-bien-cache-!.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=267eb3f5-93e4-4b77-9b89-21cb4e8c0a57</guid>
      <pubDate>Fri, 21 Aug 2009 00:08:00 +0200</pubDate>
      <category>Astuce</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=267eb3f5-93e4-4b77-9b89-21cb4e8c0a57</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=267eb3f5-93e4-4b77-9b89-21cb4e8c0a57</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/21/Silverlight-3-Un-media-player-complet-bien-cache-!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=267eb3f5-93e4-4b77-9b89-21cb4e8c0a57</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=267eb3f5-93e4-4b77-9b89-21cb4e8c0a57</feedburner:origLink></item>
    <item>
      <title>Silverlight 3 : un Behavior ajoutant un effet de reflexion (avec les nouvelles WriteableBitmap)</title>
      <description>&lt;p&gt;
Dans le &lt;a href="http://www.e-naxos.com/Blog/post.aspx?id=65b05e29-af4d-45ca-bd1d-1ca4c8e070e7" target="_blank"&gt;pr&amp;eacute;c&amp;eacute;dent billet je vous proposais d&amp;#39;&amp;eacute;crire un Behavior &lt;/a&gt;effectuant une rotation anim&amp;eacute;e d&amp;#39;un &amp;eacute;l&amp;eacute;ment visuel, aujourd&amp;#39;hui je vous invite &amp;agrave; la r&amp;eacute;flexion... 
&lt;/p&gt;
&lt;p&gt;
Je veux parler de l&amp;#39;effet de r&amp;eacute;flexion tant &amp;agrave; la mode. WPF sait parfaitement le faire gr&amp;acirc;ce notamment au brosses visuelles qui permettent facilement de &amp;quot;peindre&amp;quot; un contr&amp;ocirc;le avec la copie visuelle d&amp;#39;un autre objet (ou arbre d&amp;#39;objets). H&amp;eacute;las, Silverlight 3 ne poss&amp;egrave;de pas encore de brosse de ce type et pour obtenir l&amp;#39;effet d&amp;eacute;sir&amp;eacute; il faut dupliquer le ou les objets sources et leur faire subir une rotation, un flip, et l&amp;#39;ajout d&amp;#39;un masque d&amp;#39;opacit&amp;eacute;. Tout cela est assez fastidieux il faut bien l&amp;#39;avouer. 
&lt;/p&gt;
&lt;p&gt;
Mais gr&amp;acirc;ce aux Behaviors il est possible de rendre tout cela automatique et avec l&amp;#39;aide des &lt;font face="courier new,courier"&gt;&lt;strong&gt;WritableBitmap&lt;/strong&gt;&lt;/font&gt; il n&amp;#39;est m&amp;ecirc;me pas n&amp;eacute;cessaire de dupliquer tous les objets ! 
&lt;/p&gt;
&lt;p&gt;
J&amp;#39;ai d&amp;eacute;j&amp;agrave; d&amp;eacute;taill&amp;eacute; dans le billet pr&amp;eacute;c&amp;eacute;dent la technique de cr&amp;eacute;ation d&amp;#39;un Behavior, je vous renvoie ainsi &amp;agrave; cet exemple pour la base. Pour l&amp;#39;effet de r&amp;eacute;flexion, le mieux est de regarder ci-dessous l&amp;#39;exemple live :
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/Reflection/ReflectionBehavior.xap;width=424;height=294] 
&lt;/p&gt;
&lt;p&gt;
Pour cr&amp;eacute;er cet effet nous allons utiliser une nouvelle classe de Silverlight 3 : les &lt;font face="courier new,courier"&gt;&lt;strong&gt;WritableBitmap&lt;/strong&gt;&lt;/font&gt;. Cette classe permet de cr&amp;eacute;er des images de toute pi&amp;egrave;ce ce qui n&amp;#39;&amp;eacute;tait pas possible jusqu&amp;#39;&amp;agrave; lors. 
&lt;/p&gt;
&lt;p&gt;
Non seulement les WritableBitmap permettent de cr&amp;eacute;er une bitmap par code, mais en plus elle poss&amp;egrave;de une m&amp;eacute;thode de Render qui est capable de faire le rendu de tout objet ou arbre visuel et de le placer dans la bitmap. Nous allons utiliser cette possibilit&amp;eacute; pour remplir une bitmap &amp;agrave; laquelle nous appliquons ensuite quelques transformations (renversement, &amp;eacute;change gauche/droite, translation). Un masque d&amp;#39;opacit&amp;eacute; est ajout&amp;eacute; pour l&amp;#39;impression de d&amp;eacute;grad&amp;eacute; d&amp;#39;opacit&amp;eacute;.
&lt;/p&gt;
&lt;p&gt;
Le Behavior fonctionne sur des sources de type Canvas uniquement, cela permet d&amp;#39;illustrer comment limiter un Behavior &amp;agrave; une classe ou une branche de classes donn&amp;eacute;e. Une fois l&amp;#39;image du reflet cr&amp;eacute;&amp;eacute; elle est ajout&amp;eacute;e en tant qu&amp;#39;&amp;eacute;l&amp;eacute;ment au canvas (apr&amp;egrave;s avoir pris soin de supprimer la pr&amp;eacute;c&amp;eacute;dente image s&amp;#39;il y en a d&amp;eacute;j&amp;agrave; une). 
&lt;/p&gt;
&lt;p&gt;
Le Behavior n&amp;#39;a pas de rendu en mode design sous Blend 3, c&amp;#39;est un petit d&amp;eacute;faut. De m&amp;ecirc;me l&amp;#39;effet de r&amp;eacute;flexion est cr&amp;eacute;&amp;eacute; une fois pour toute et n&amp;#39;est modifi&amp;eacute; que si le canvas source voit sa taille chang&amp;eacute;e. Si vous cr&amp;eacute;ez dynamiquement des objets sur celui-ci, le reflet ne changera pas. Bien entendu on pourrait penser connecter le Behavior &amp;agrave; l&amp;#39;&amp;eacute;v&amp;eacute;nement de rendu du canvas LayoutUpdated. Cela eut &amp;eacute;t&amp;eacute; une solution &amp;eacute;l&amp;eacute;gante. H&amp;eacute;las on cr&amp;eacute;erait une boucle infinie puisque notre Behavior ajoute un objet au canvas ce qui d&amp;eacute;clenche le renouvellement de son rendu. On pourrait am&amp;eacute;liorer les choses en ne faisant pas le rendu dans le canvas source et en ajoutant une propri&amp;eacute;t&amp;eacute; au Behavior qui serait un objet de type Image (non enfant de la source) qu&amp;#39;on utiliserait comme sortie de rendu de l&amp;#39;effet de reflet. Mais&amp;nbsp;cela poserait d&amp;#39;autres probl&amp;egrave;mes.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Toutes les id&amp;eacute;es sont envisageables et le code propos&amp;eacute; n&amp;#39;est qu&amp;#39;un exemple. A vous de l&amp;#39;am&amp;eacute;liorer sans oublier de venir ici nous dire ce que vous avez fait ! 
&lt;/p&gt;
&lt;p&gt;
C&amp;ocirc;t&amp;eacute; param&amp;eacute;trage le Behavior permet de modifier les points de d&amp;eacute;part et d&amp;#39;arriv&amp;eacute;e du d&amp;eacute;grad&amp;eacute; du masque d&amp;#39;opacit&amp;eacute; ainsi que l&amp;#39;offset sur l&amp;#39;axe Y. Sans ce dernier le reflet serait coll&amp;eacute; au canvas source ce qui n&amp;#39;est pas forc&amp;eacute;ment tr&amp;egrave;s beau. Par d&amp;eacute;faut un d&amp;eacute;calage de 3 pixels vers le bas d&amp;eacute;colle l&amp;eacute;g&amp;egrave;rement le reflet de l&amp;#39;original. 
&lt;/p&gt;
&lt;p&gt;
Code la publication d&amp;#39;un code un peu long n&amp;#39;est pas forc&amp;eacute;ment tr&amp;egrave;s lisible sur le blog, je vous renvoie au code source du projet complet que vous n&amp;#39;avez plus qu&amp;#39;&amp;agrave; t&amp;eacute;l&amp;eacute;charger ici : &lt;a href="http://www.e-naxos.com/Blog/file.axd?file=2009%2f8%2fReflectionBehavior.zip"&gt;ReflectionBehavior.zip (62,91 kb)&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Et Stay Tuned ! 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/6n9zzabgzuM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/6n9zzabgzuM/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/08/Silverlight-3-un-Behavior-ajoutant-un-effet-de-reflexion-(avec-les-nouvelles-WriteableBitmap).aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=02c90180-39fc-48ca-b7b5-ae1c12c736b2</guid>
      <pubDate>Sat, 08 Aug 2009 03:21:00 +0200</pubDate>
      <category>Articles</category>
      <category>Design</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=02c90180-39fc-48ca-b7b5-ae1c12c736b2</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=02c90180-39fc-48ca-b7b5-ae1c12c736b2</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/08/Silverlight-3-un-Behavior-ajoutant-un-effet-de-reflexion-(avec-les-nouvelles-WriteableBitmap).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=02c90180-39fc-48ca-b7b5-ae1c12c736b2</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=02c90180-39fc-48ca-b7b5-ae1c12c736b2</feedburner:origLink></item>
    <item>
      <title>Silverlight 3 : Ecrire des Behaviors (composants comportementaux)</title>
      <description>&lt;p&gt;
Blend 3 est une version majeure de ce puissant outil qui permet de travailler le visuel d&amp;#39;une application WPF ou Silverlight. Blend 3 tend vers une plus grande simplicit&amp;eacute; de manipulation notamment pour les infographistes qui ne veulent / peuvent s&amp;#39;investir dans du code trop complexe. 
&lt;/p&gt;
&lt;p&gt;
Les notions de Behaviors (comportements), Actions et Triggers (d&amp;eacute;clencheurs) sont soient nouvelles pour ce qui est de la premi&amp;egrave;re, soit sont renforc&amp;eacute;es pour les secondes. Le but &amp;eacute;tant bien de pouvoir ajouter du comportement visuellement sans programmation. Avec les outils d&amp;#39;il y a 15 ans comme VB&amp;nbsp;Microsoft inventait la notion de composant visuel qui se place sur une fiche par Drag Drop. Un bon en avant&amp;nbsp; quand on conna&amp;icirc;t les m&amp;eacute;thodes qui ont pr&amp;eacute;c&amp;eacute;d&amp;eacute; et quand on sait avec le recul quel succ&amp;egrave;s a eu cette technologie et ses clones (EDI Delphi ou Java...) ! Avec Blend 3 Microsoft innove encore dans une voie qui trace forc&amp;eacute;ment ce que sera l&amp;#39;avenir : le &amp;quot;composant comportemental&amp;quot;. On applique le &amp;quot;RAD&amp;quot; (mot plus tr&amp;egrave;s en vogue mais qui garde tout son sens) non plus seulement au visuel mais aussi au code. 
&lt;/p&gt;
&lt;p&gt;
Aujourd&amp;#39;hui je vais vous parler des Behaviors (comportement). 
&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est qu&amp;#39;un Behavior ? &lt;/h2&gt;
&lt;p&gt;
Un Behavior est un &lt;strong&gt;comportement&lt;/strong&gt;, c&amp;#39;est &amp;agrave; dire un bout de code qui peut faire &amp;agrave; peu pr&amp;egrave;s n&amp;#39;importe quoi. Avec &amp;ccedil;a, vous &amp;ecirc;tes bien avanc&amp;eacute; allez-vous dire ! Mais imaginez tout ce que peut faire un bout de code autonome (ne d&amp;eacute;pendant pas d&amp;#39;&amp;eacute;tats externes) et faites un joli paquet cadeau autour afin qu&amp;#39;il apparaisse dans une palette, comme un composant visuel et vous obtenez un Behavior. Un Behavior est donc avant tout une sorte de &lt;em&gt;code snippet&lt;/em&gt; qui porte un nom et qui est list&amp;eacute; dans Blend comme le sont les composants. Un Behavior n&amp;#39;existe en renvanche pas par lui-m&amp;ecirc;me, comme un composant Rectangle ou Button par exemple. Un Behavior s&amp;#39;accroche &amp;agrave; un composant existant et c&amp;#39;est en jouant le poisson pilote vis &amp;agrave; vis de ce composant qu&amp;#39;il lui am&amp;egrave;ne le fameux comportement. 
&lt;/p&gt;
&lt;p&gt;
Un petit exemple pour clarifier : Imaginons qu&amp;#39;on souhaite pouvoir d&amp;eacute;placer un objet par Drag Drop, il faudra g&amp;eacute;rer le mouse Down, le mouse Up et le mouse Move selon un sc&amp;eacute;nario classique que je ne d&amp;eacute;velopperai pas. Imaginons maintenant que nous souhaitions apporter le m&amp;ecirc;me comportement&amp;nbsp;&amp;agrave; un autre objet. Il faudra programmer aussi tous ces &amp;eacute;v&amp;eacute;nements. Si maintenant nous encapsulons tout cela dans un Behavior, il suffira de d&amp;eacute;poser le dit Behavior sur tous les composants qui, &lt;em&gt;ipso facto&lt;/em&gt;, disposeront du comportement. La r&amp;eacute;utilisation du code est totale. C&amp;ocirc;t&amp;eacute; utilisation de Blend cela permet m&amp;ecirc;me de d&amp;eacute;velopper une application sans &amp;ecirc;tre d&amp;eacute;veloppeur pour peu qu&amp;#39;on dispose d&amp;#39;une bonne biblioth&amp;egrave;que de Behaviors, d&amp;#39;Actions et de Triggers (je reparlerai des deux derniers dans de prochains billets). 
&lt;/p&gt;
&lt;h2&gt;Cr&amp;eacute;er un Behavior &lt;/h2&gt;
&lt;p&gt;
Cr&amp;eacute;er un nouveau Behavior est aussi simple que de cr&amp;eacute;er une nouvelle classe d&amp;eacute;rivant de &lt;font face="courier new,courier"&gt;Behavior&amp;lt;T&amp;gt;&lt;/font&gt;. Il faut n&amp;eacute;anmoins &amp;agrave; trouver la classe m&amp;egrave;re... Elle se cache dans un assembly qui n&amp;#39;est pas r&amp;eacute;f&amp;eacute;renc&amp;eacute; de base et qui joue un peu &amp;agrave; cache-cache... Avec la finale de Blend 3 il s&amp;#39;agit de : 
&lt;/p&gt;
&lt;font face="Consolas" size="2" color="#008000"&gt;&lt;font face="Consolas" size="2" color="#008000"&gt;&lt;font face="Consolas" size="2" color="#008000"&gt;
&lt;p&gt;
C:\Program Files\Microsoft SDKs\Expression\Blend 3\Interactivity\Libraries\Silverlight\System.Windows.Interactivity.dll 
&lt;/p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p&gt;
Une fois la classe cr&amp;eacute;&amp;eacute;e, il ne reste plus qu&amp;#39;&amp;agrave; surcharger deux m&amp;eacute;thodes : &lt;font face="courier new,courier"&gt;OnAttached()&lt;/font&gt; et &lt;font face="courier new,courier"&gt;OnDetaching()&lt;/font&gt;. C&amp;#39;est &amp;agrave; partir de l&amp;agrave; qu&amp;#39;on peut programmer le comportement. Le Behavior peut conna&amp;icirc;tre l&amp;#39;objet auquel il est attach&amp;eacute; : &lt;font face="courier new,courier"&gt;AssociatedObject&lt;/font&gt;. 
&lt;/p&gt;
&lt;h2&gt;Un Behavior Exemple : RotateBehavior&lt;/h2&gt;
&lt;p&gt;
Pour illustrer le propos j&amp;#39;ai cherch&amp;eacute; quel genre de petit Behavior je pourrais bien d&amp;eacute;velopper. Les classiques du genre ne me disait rien (faire en flou quand la souris entre sur l&amp;#39;objet, ou bien changer sa transparence, etc). Mais, restons r&amp;eacute;alistes, pour un petit exemple on ne pouvait faire beaucoup plus compliqu&amp;eacute;. Je me suis donc dit, tiens, une transformation du type rotation, je n&amp;#39;ai pas encore vu, et mieux, avec une animation pour tout de m&amp;ecirc;me pimenter la chose... 
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/Behavior/Behavior_base.xap;width=460;height=210] 
&lt;/p&gt;
&lt;p&gt;
Dans l&amp;#39;arbre des objets on peut voir le RotateBehavior accroch&amp;eacute; aux rectangles et &amp;agrave; l&amp;#39;objet texte : 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div style="text-align: center"&gt;
&lt;img src="http://www.e-naxos.com/Blog/image.axd?picture=2009%2f8%2fbehavior1.PNG" alt="" width="285" height="317" /&gt; 
&lt;/div&gt;
&lt;p&gt;
De m&amp;ecirc;me, pour le behavior s&amp;eacute;lectionn&amp;eacute; on peut voir les propri&amp;eacute;t&amp;eacute;s suivantes : 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div style="text-align: center"&gt;
&lt;img src="http://www.e-naxos.com/Blog/image.axd?picture=2009%2f8%2fbehavior2.PNG" alt="" width="282" height="172" /&gt; 
&lt;/div&gt;
&lt;p&gt;
On note la propri&amp;eacute;t&amp;eacute; Angle, en degr&amp;eacute;s, et la propri&amp;eacute;t&amp;eacute; Duration qui d&amp;eacute;finit la longueur de l&amp;#39;animation. Bien entendu, chaque RotateBehavior plac&amp;eacute; sur chacun des objets est param&amp;eacute;trable de fa&amp;ccedil;on s&amp;eacute;par&amp;eacute;e. 
&lt;/p&gt;
&lt;h2&gt;Le code exemple&lt;/h2&gt;
&lt;p&gt;
Le blog est parfait pour publier des extraits de code mais pas des listing entiers. Du coup, plut&amp;ocirc;t que de vous imposer une lecture difficile, je vous propose de t&amp;eacute;l&amp;eacute;charger le projet exemple &amp;agrave; ouvrir sous Blend 3 ou Visual Studio 2008 + SL3 SDK: &lt;a href="http://www.e-naxos.com/Blog/file.axd?file=2009%2f8%2fBehavior_base.zip"&gt;Behavior_base.zip (61,84 kb)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Amusez-vous bien avec les comportements, et Stay Tuned !
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/hT6Ybm9kObs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/hT6Ybm9kObs/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/07/Silverlight-3-Ecrire-des-Behaviors-(composants-comportementaux).aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=65b05e29-af4d-45ca-bd1d-1ca4c8e070e7</guid>
      <pubDate>Fri, 07 Aug 2009 20:44:00 +0200</pubDate>
      <category>Articles</category>
      <category>Design</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=65b05e29-af4d-45ca-bd1d-1ca4c8e070e7</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=65b05e29-af4d-45ca-bd1d-1ca4c8e070e7</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/07/Silverlight-3-Ecrire-des-Behaviors-(composants-comportementaux).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=65b05e29-af4d-45ca-bd1d-1ca4c8e070e7</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=65b05e29-af4d-45ca-bd1d-1ca4c8e070e7</feedburner:origLink></item>
    <item>
      <title>De la 3D Gratuite ! ... Mais limitée dans le temps...</title>
      <description>&lt;p&gt;
Dans mon dernier billet je vous parlais de &lt;a href="http://www.e-naxos.com/Blog/post.aspx?id=b7d4dc1b-acdc-498c-a365-4a9813373158" target="_blank"&gt;TrueSpace de Caligary &lt;/a&gt;qui suite au rachat par Microsoft avait rendu le t&amp;eacute;l&amp;eacute;chargement gratuit du logiciel et des vid&amp;eacute;os de formation.
&lt;/p&gt;
&lt;p&gt;
H&amp;eacute;las, durant l&amp;#39;ann&amp;eacute;e &amp;eacute;coul&amp;eacute;e Microsoft a aussi &amp;eacute;t&amp;eacute; affect&amp;eacute; par la crise am&amp;eacute;ricaine puis mondiale et il a fallu faire des coupes sombres... TrueSpace, en tout cas la soci&amp;eacute;t&amp;eacute; Caligary fraichement acquise, font partie de la charette... 
&lt;/p&gt;
&lt;p&gt;
Du coup le logiciel et les vid&amp;eacute;os sont toujours t&amp;eacute;l&amp;eacute;chargeables mais on ne sait pas pour combien de temps. Le fondateur de Caligary explique dans une lettre qu&amp;#39;il est pr&amp;eacute;f&amp;eacute;rable de tout t&amp;eacute;l&amp;eacute;charger et de garder &amp;ccedil;a sur un disque dur car le site Web pourrait ne plus &amp;ecirc;tre dispo dans un d&amp;eacute;lai non pr&amp;eacute;cis&amp;eacute;.
&lt;/p&gt;
&lt;p&gt;
Cela n&amp;#39;enl&amp;egrave;ve rien &amp;agrave; la qualit&amp;eacute; et &amp;agrave; l&amp;#39;aubaine que repr&amp;eacute;sente TrueSpace gratuit, un soft &amp;agrave; 600 dollars plut&amp;ocirc;t bien fait. Mais en revanche, d&amp;eacute;p&amp;eacute;chez vous de t&amp;eacute;l&amp;eacute;charger !
&lt;/p&gt;
&lt;p&gt;
Pour info, TrueSpace sait importer depuis de nombreux formats dont 3DS et sait exporter aussi vers 3DS (et d&amp;#39;autres). Ses possibilit&amp;eacute;s graphiques et d&amp;#39;animation sont vraiment tr&amp;egrave;s bonnes et si vous prenez en compte que ZAM3D et Swift3D &lt;a href="http://www.erain.com/" target="_blank"&gt;d&amp;#39;Electric Rain &lt;/a&gt;(dont j&amp;#39;ai d&amp;eacute;j&amp;agrave; parl&amp;eacute; ici) acc&amp;egrave;ptent en importation le format 3DS vous comprendrez l&amp;#39;int&amp;eacute;r&amp;ecirc;t qu&amp;#39;il peut y avoir &amp;agrave; poss&amp;eacute;der un soft de 3D gratuit pour concevoir des objets ou des sc&amp;egrave;nes compl&amp;egrave;tes qui peuvent ainsi &amp;ecirc;tre migr&amp;eacute;es vers WPF ... La cha&amp;icirc;ne graphique devenant : TrueSpace -&amp;gt; Swift3D / Zam3D -&amp;gt; WPF.
&lt;/p&gt;
&lt;p&gt;
Faites vite, c&amp;#39;est une superbe affaire...
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/onbrWVSgkiA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/onbrWVSgkiA/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/05/De-la-3D-Gratuite-!-Mais-limitee-dans-le-temps.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=d37f75e3-37e1-45a6-a2a8-c446176c3bfc</guid>
      <pubDate>Wed, 05 Aug 2009 23:51:00 +0200</pubDate>
      <category>Annonce</category>
      <category>Design</category>
      <category>Logiciel</category>
      <category>WPF</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=d37f75e3-37e1-45a6-a2a8-c446176c3bfc</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=d37f75e3-37e1-45a6-a2a8-c446176c3bfc</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/05/De-la-3D-Gratuite-!-Mais-limitee-dans-le-temps.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=d37f75e3-37e1-45a6-a2a8-c446176c3bfc</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=d37f75e3-37e1-45a6-a2a8-c446176c3bfc</feedburner:origLink></item>
    <item>
      <title>De la 3D Gratuite !</title>
      <description>&lt;p&gt;
En 2008&amp;nbsp;Microsoft a rachet&amp;eacute; la soci&amp;eacute;t&amp;eacute; &lt;strong&gt;Caligary&lt;/strong&gt;, principalement parce que cet &amp;eacute;diteur dispose d&amp;#39;outils 3D qui, on peut se douter,&amp;nbsp;pourraient s&amp;#39;av&amp;eacute;rer utile pour le d&amp;eacute;veloppement de jeux XBox ou d&amp;#39;objets 3D pour XAML. Cette annonce est pass&amp;eacute;e un peu sous silence, et pourtant... D&amp;eacute;sormais les produits de Caligary sont &lt;strong&gt;disponibles gratuitement&lt;/strong&gt; ! Notamment &lt;strong&gt;TrueSpace&lt;/strong&gt;, un outil de mod&amp;eacute;lisation et d&amp;#39;animation 3D proche d&amp;#39;un LiteWave ou d&amp;#39;un Maya (proche, pas forc&amp;eacute;ment &amp;eacute;quivalent, juste pour vous faire une id&amp;eacute;e du type d&amp;#39;outil). 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.caligari.com/" target="_blank"&gt;T&amp;eacute;l&amp;eacute;chargez d&amp;egrave;s maintenant TrueSpace &lt;/a&gt;et &amp;eacute;clatez-vous en 3D, surtout que le site de Caligary fournit des videos de formation pour se mettre le pied &amp;agrave; l&amp;#39;&amp;eacute;trier. 
&lt;/p&gt;
&lt;p&gt;
Bonne 3D ! 
&lt;/p&gt;
&lt;p&gt;
(et dois je rajouter : Stay Tuned !) 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/tIusE2gfkfI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/tIusE2gfkfI/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/05/De-la-3D-Gratuite-!.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=b7d4dc1b-acdc-498c-a365-4a9813373158</guid>
      <pubDate>Wed, 05 Aug 2009 20:08:00 +0200</pubDate>
      <category>Design</category>
      <category>Logiciel</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=b7d4dc1b-acdc-498c-a365-4a9813373158</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=b7d4dc1b-acdc-498c-a365-4a9813373158</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/05/De-la-3D-Gratuite-!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=b7d4dc1b-acdc-498c-a365-4a9813373158</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=b7d4dc1b-acdc-498c-a365-4a9813373158</feedburner:origLink></item>
    <item>
      <title>Prendre les bonnes mesures (à l'écran) ! [Rooler un utilitaire sympa]</title>
      <description>&lt;p&gt;
Je sais, la rentr&amp;eacute;e approche et c&amp;#39;est le moment de prendre de bonnes r&amp;eacute;solutions, mais je ne vais pas jouer les p&amp;egrave;re-la-morale, je vais vous parler de r&amp;eacute;solution d&amp;#39;&amp;eacute;cran et de bonnes mesures dont l&amp;#39;unit&amp;eacute; s&amp;#39;exprime&amp;nbsp;en pixels et non en distance vous s&amp;eacute;parant du salut de votre &amp;acirc;me.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Rooler&lt;/strong&gt; est un petit utilitaire tr&amp;egrave;s sympathique qui offre une barre d&amp;#39;outils permettant de mesurer les objets &amp;agrave; l&amp;#39;&amp;eacute;cran : zones rectangulaires, espace horizontal et vertical entre deux objets visuels.
&lt;/p&gt;
&lt;p&gt;
Simple, efficace et surtout malin car l&amp;#39;outil interpr&amp;egrave;te l&amp;#39;&amp;eacute;cran comme une image et les distances mesur&amp;eacute;es le sont entre des pixels et non des objets Windows. Il y a d&amp;#39;ailleurs un r&amp;eacute;glage de tol&amp;eacute;rance (un peu comme sous PaintShop ou PhotoShop dans certaines commandes) qui permet d&amp;#39;ajuster le niveau de d&amp;eacute;tection.
&lt;/p&gt;
&lt;p&gt;
Bien pratique et tout petit, &amp;agrave; poss&amp;eacute;der dans sa bo&amp;icirc;te &amp;agrave; outils donc !
&lt;/p&gt;
&lt;p&gt;
Le site avec toutes les explications et le t&amp;eacute;l&amp;eacute;chargement du setup : &lt;a href="http://blois.us/Rooler/" target="_blank"&gt;Rooler&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;Roulez petits bolides, mais Stay Tuned !
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/iJBoR3AMMcc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/iJBoR3AMMcc/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/05/Prendre-les-bonnes-mesures-(a-lecran)-!-Rooler-un-utilitaire-sympa.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=ba1c3027-7316-452e-a8c0-5b1aeb6479d7</guid>
      <pubDate>Wed, 05 Aug 2009 19:24:00 +0200</pubDate>
      <category>Design</category>
      <category>Logiciel</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=ba1c3027-7316-452e-a8c0-5b1aeb6479d7</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=ba1c3027-7316-452e-a8c0-5b1aeb6479d7</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/05/Prendre-les-bonnes-mesures-(a-lecran)-!-Rooler-un-utilitaire-sympa.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=ba1c3027-7316-452e-a8c0-5b1aeb6479d7</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=ba1c3027-7316-452e-a8c0-5b1aeb6479d7</feedburner:origLink></item>
    <item>
      <title>WPF : Qui l'utilise ?</title>
      <description>&lt;p&gt;
Apr&amp;egrave;s plusieurs ann&amp;eacute;es de pr&amp;eacute;sence et de maturation, WPF a plus que largement prouv&amp;eacute; sa capacit&amp;eacute; &amp;agrave; produire des applications riches et esth&amp;eacute;tiques. Et si la sup&amp;eacute;riorit&amp;eacute; technique de WPF sur les Windows Forms ou apparent&amp;eacute;s est une &amp;eacute;vidence,&amp;nbsp;une question revient tr&amp;egrave;s souvent : Mais qui utilise WPF ?
&lt;/p&gt;
&lt;p&gt;
En effet, les applications d&amp;eacute;velopp&amp;eacute;es en WPF sont, il faut l&amp;#39;avouer, plus rares que celles en Windows Forms. J&amp;#39;ai de longue date milit&amp;eacute; pour que cet &amp;eacute;tat de fait change, et je continuerai &amp;agrave; la faire (voir par exemple mon article sur les &lt;a href="http://www.e-naxos.com/Blog/post.aspx?id=97856858-ecbd-4fbb-ac0a-e50c507e7849" target="_blank"&gt;10 bonnes raisons de pr&amp;eacute;f&amp;eacute;rer WPF&lt;/a&gt; et &lt;a href="http://www.e-naxos.com/Blog/post.aspx?id=8b61f2f6-e9ad-49cc-8186-d6082a9b1255" target="_blank"&gt;9 raisons de plus d&amp;#39;utiliser WPF!&lt;/a&gt;). Mais ne s&amp;#39;est il vraiment rien pass&amp;eacute; ? Heureusement non !
&lt;/p&gt;
&lt;p&gt;
Il est vrai que les interfaces s&amp;eacute;duisantes de WPF vont un peu de pair avec le nouveau look de Windows Vista. H&amp;eacute;las cette mouture de l&amp;#39;OS n&amp;#39;a pas rencontr&amp;eacute; le succ&amp;egrave;s et la partie a &amp;eacute;t&amp;eacute; remise. En fin d&amp;#39;ann&amp;eacute;e Windows 7 viendra malgr&amp;eacute; tout enfoncer le clou. Et l&amp;agrave;, comme je vous le clame depuis longtemps, il sera juste un peu tard pour vous y mettre, &lt;strong&gt;WPF c&amp;#39;est beau, c&amp;#39;est puissant, mais on ne l&amp;#39;apprend pas un matin pour commencer un nouveau projet l&amp;#39;apr&amp;egrave;s midi&lt;/strong&gt;... Ce n&amp;#39;est pas juste une nouvelle librairie d&amp;#39;affichage. Les principes de fonctionnement, les outils (comme Blend), tout est radicalement diff&amp;eacute;rent et demande une phase d&amp;#39;apprentissage qui ne peut &amp;ecirc;tre ni&amp;eacute;e ni balay&amp;eacute;e d&amp;#39;un haussement d&amp;#39;&amp;eacute;paule. Et je peux vous assurer que les projets que vous commencez aujourd&amp;#39;hui en Windows Forms et que vous testez joyeusement sur votre Windows XP, lorsqu&amp;#39;ils arriveront entre les mains de vos utilisateurs sous Windows 7 l&amp;#39;ann&amp;eacute;e prochaine (ou dans 2 ans, vous ne d&amp;eacute;veloppez pas des softs-kleenex non ?) tous vos softs Winfows Forms auront le m&amp;ecirc;me air dinosauresque et d&amp;eacute;suet qu&amp;#39;une application console...
&lt;/p&gt;
&lt;p&gt;
Bref mettez vous &amp;agrave; WPF. Si vous pr&amp;eacute;f&amp;eacute;rez, formez vous en partant de Silverlight. Les bases sont les m&amp;ecirc;mes et il est vrai que Silverlight a un c&amp;ocirc;t&amp;eacute; plus &amp;quot;exitant&amp;quot; pour certaines personnes (moi par exemple!). Mais l&amp;#39;un ou l&amp;#39;autre, il est temps de mettre les bouch&amp;eacute;es doubles !
&lt;/p&gt;
&lt;p&gt;
Microsoft a sorti une petite &lt;a href="http://www.mtaulty.com/downloads/WpfShowcase/test.html" target="_blank"&gt;&lt;strong&gt;brochure qui montre les principales applications WPF&lt;/strong&gt;&lt;/a&gt; qui sont ou qui font sortir. De Intel &amp;agrave; AMD, de BMW &amp;agrave; AutoCad, regardez le look des applis que vos utilisateurs auront sur leur bureau juste &amp;agrave; c&amp;ocirc;t&amp;eacute; des v&amp;ocirc;tres en Windows Forms... Prenez du recul et, sinc&amp;egrave;rement, tiendrez-vous la comparaison ? ... Je ne le crois pas.
&lt;/p&gt;
&lt;p&gt;
Voici quelques liens pour bien commencer :
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a href="http://www.codeplex.com/wpf" target="_blank"&gt;WPF Home sur CodePlex&lt;/a&gt;
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a href="http://windowsclient.net/" target="_blank"&gt;Microsoft Windows.NET Client&lt;/a&gt;
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a href="http://www.microsoft.com/france/expression/" target="_blank"&gt;Microsoft Expression&lt;/a&gt;
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	&lt;a href="http://silverlight.net/" target="_blank"&gt;Silverlight Home&lt;/a&gt;
	&lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Ce ne sont que quelques points de d&amp;eacute;part, il y en a bien d&amp;#39;autres dans mes billets mais vous les avez d&amp;eacute;j&amp;agrave; trouv&amp;eacute;s si vous &amp;ecirc;tes un lecteur fid&amp;egrave;le...
&lt;/p&gt;
&lt;p&gt;
Bonne lecture, et Stay Tuned !
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/BMr_Fg2toVE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/BMr_Fg2toVE/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/05/WPF-Qui-lutilise-.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=af1469ef-0499-439c-af03-0bbc7eb2e852</guid>
      <pubDate>Wed, 05 Aug 2009 18:30:00 +0200</pubDate>
      <category>Silverlight</category>
      <category>WPF</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=af1469ef-0499-439c-af03-0bbc7eb2e852</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=af1469ef-0499-439c-af03-0bbc7eb2e852</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/05/WPF-Qui-lutilise-.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=af1469ef-0499-439c-af03-0bbc7eb2e852</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=af1469ef-0499-439c-af03-0bbc7eb2e852</feedburner:origLink></item>
    <item>
      <title>Silverlight 3 et DeepZoom</title>
      <description>&lt;p&gt;
Deep Zoom, vous connaissez ? Probablement, c&amp;#39;est tellement sympa ! Si vous ne savez pas ce que c&amp;#39;est, voici en deux mots quelques explications : Deep Zoom est une technologie permettant d&amp;#39;afficher des images &amp;eacute;normes sans avoir besoin d&amp;#39;attendre que tout soit t&amp;eacute;l&amp;eacute;charg&amp;eacute;. On peut ainsi faire un &amp;quot;zoom profond&amp;quot; (deep zoom) sur une image, ou plus amusant, sur une composition d&amp;#39;images. Si vous connaissez Binq Maps, cela vous donne une bonne id&amp;eacute;e (partir d&amp;#39;une vision de la france depuis le ciel et zoomer jusqu&amp;#39;&amp;agrave; voir le nombre de voitures gar&amp;eacute;es devant chez vous). 
&lt;/p&gt;
&lt;p&gt;
Des tas de possibilit&amp;eacute;s s&amp;#39;ouvrent si je vous dis que le logiciel &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=457B17B7-52BF-4BDA-87A3-FA8A4673F8BF&amp;amp;displaylang=en" target="_blank"&gt;Deep Zoom Composer &lt;/a&gt;est gratuit et qu&amp;#39;il permet de cr&amp;eacute;er toute sorte de compositions et qu&amp;#39;il est m&amp;ecirc;me capable de cr&amp;eacute;er des ex&amp;eacute;cutables directement utilisables, voire m&amp;ecirc;me les sources compl&amp;egrave;tes d&amp;#39;un projet Blend 3 ! 
&lt;/p&gt;
&lt;p&gt;
C&amp;#39;est &amp;agrave; partir de cette derni&amp;egrave;re option que j&amp;#39;ai cr&amp;eacute;&amp;eacute; la d&amp;eacute;mo ci-dessous. Sur la base du projet cr&amp;eacute;&amp;eacute; par Deep Zoom Composer j&amp;#39;ai pu modifier certains comportements, am&amp;eacute;liorer certaines petites choses (notamment &amp;agrave; l&amp;#39;aide de Behaviors dont certains sont d&amp;eacute;j&amp;agrave; dans le projet). Vraiment incroyable et d&amp;#39;une rapidit&amp;eacute; fulgurante, si on fait abstraction du processus de cr&amp;eacute;ation des milliers de fichiers n&amp;eacute;cessaires rien que pour la pr&amp;eacute;sente d&amp;eacute;mo. En tout 4593 fichiers, 303 sous r&amp;eacute;pertoires pour un poids total de 52,2 Mo. Du lourd donc. Surtout compar&amp;eacute; au fichier ex&amp;eacute;cutable Silverlight produit (le .xap) qui ne fait que 79 Ko. 
&lt;/p&gt;
&lt;p&gt;
Alors attention aux compositions g&amp;eacute;antes qu&amp;#39;on est tent&amp;eacute; de concevoir, apr&amp;egrave;s il faut assumer niveau h&amp;eacute;bergement ! 
&lt;/p&gt;
&lt;p&gt;
En revanche les possibilit&amp;eacute;s d&amp;#39;interactions et de personnalisations&amp;nbsp;au travers de Blend 3 sous Silverlight 3 sont innombrables. On sent un potentiel &amp;eacute;norme, les id&amp;eacute;es d&amp;#39;utilisation un peu originales viendront certainement avec le temps une fois familiaris&amp;eacute; avec la techno. 
&lt;/p&gt;
&lt;p&gt;
Ce billet ne pr&amp;eacute;sente pas de code, il suffit de disposer de Deep Zoom Composer, de quelques photos, de suivre la proc&amp;eacute;dure et de bricoler un peu le C# du projet pour obtenir le m&amp;ecirc;me r&amp;eacute;sultat. Le but est avant tout de vous parler de Deep Zoom, de vous dire que c&amp;#39;est vraiment fun, et qu&amp;#39;il ne vous reste plus qu&amp;#39;&amp;agrave; l&amp;#39;essayer pour l&amp;#39;adopter ! 
&lt;/p&gt;
&lt;p&gt;
nota: les photos font partie de celles que j&amp;#39;ai prise &amp;agrave; Barcelone lors des TechDays 2008. Vous pourrez d&amp;eacute;couvrir une photo d&amp;#39;une fi&amp;egrave;re assembl&amp;eacute;e, en train de festoyer, et y reconna&amp;icirc;tre, parmi les autres participants de marque, notre Mitsu national, grand ma&amp;icirc;tre de ce genre de r&amp;eacute;unions gourmandes :-) Ne me cherchez pas sur la photo, il fallait bien quelqu&amp;#39;un pour immortaliser l&amp;#39;instant et tenir l&amp;#39;appareil photo... 
&lt;/p&gt;
&lt;p&gt;
Pour jouer avec l&amp;#39;exemple ci-dessus, faites du drag&amp;#39;drop pour d&amp;eacute;placer le bloc de photos, cliquez pour zoomer ou utilisez les boutons en bas &amp;agrave; droite (visibles quand la souris entre dans l&amp;#39;espace Deep Zoom), notamment le dernier &amp;agrave; droite pour passer en full screen.
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/DeepZoom/DeepZoomProject.xap;width=579;height=292] 
&lt;/p&gt;
&lt;p&gt;
Pour d&amp;#39;autres news vous connaissez le refrain : Stay Tuned ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/fJHp2JjDDoc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/fJHp2JjDDoc/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/05/Silverlight-3-et-DeepZoom.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=6eec6a83-66ba-48ac-af61-7eccc3dff4e5</guid>
      <pubDate>Wed, 05 Aug 2009 06:56:00 +0200</pubDate>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=6eec6a83-66ba-48ac-af61-7eccc3dff4e5</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=6eec6a83-66ba-48ac-af61-7eccc3dff4e5</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/05/Silverlight-3-et-DeepZoom.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=6eec6a83-66ba-48ac-af61-7eccc3dff4e5</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=6eec6a83-66ba-48ac-af61-7eccc3dff4e5</feedburner:origLink></item>
    <item>
      <title>WPF et Silverlight : composants orientés données dans les Toolkits</title>
      <description>&lt;p&gt;
Trouver des ressources sur les technologies ou outils r&amp;eacute;cents est toujours difficile. Par force, et c&amp;#39;est une Lapalissade, ce qui est plus connu est plus facile &amp;agrave; conna&amp;icirc;tre, et vice versa...
&lt;/p&gt;
&lt;p&gt;
Le &lt;a href="http://www.codeplex.com/wpf" target="_blank"&gt;WPF Toolkit &lt;/a&gt;ainsi que &lt;a href="http://www.codeplex.com/Silverlight" target="_blank"&gt;Silverlight Toolkit &lt;/a&gt;sont des mines de composants ayant beaucoup de choses en commun : m&amp;ecirc;me base de code, &amp;eacute;volutions rapides et donc releases fr&amp;eacute;quentes avec &amp;agrave; chaque fois des ajouts d&amp;#39;importance. Suivre le ryhtme pourrait r&amp;eacute;clamer un job fulltime...
&lt;/p&gt;
&lt;p&gt;
Voici un post de Delay&amp;#39;s Blog qui r&amp;eacute;sume les derni&amp;egrave;res ressources autour de la visualisation des donn&amp;eacute;es dans ces deux Toolkit : &lt;a href="http://blogs.msdn.com/delay/archive/2009/07/19/my-new-home-page-enhanced-updated-collection-of-great-silverlight-wpf-data-visualization-resources.aspx"&gt;http://blogs.msdn.com/delay/archive/2009/07/19/my-new-home-page-enhanced-updated-collection-of-great-silverlight-wpf-data-visualization-resources.aspx&lt;/a&gt;&amp;nbsp;. 
&lt;/p&gt;
&lt;p&gt;
Visualiser les donn&amp;eacute;es est essentiel &amp;agrave; toute application de type gestion, et l&amp;#39;avalanche de nouveaut&amp;eacute;s dans les Toolkits ciblant ce besoin permet d&amp;eacute;sormais d&amp;#39;envisager s&amp;eacute;rieusement de cr&amp;eacute;er de &amp;quot;vraies&amp;quot; application avec WPF et Silverlight. Par &amp;quot;vraies&amp;quot; j&amp;#39;entends des applications telles que nous en concevons tous r&amp;eacute;guli&amp;egrave;rement, et non des petits jeux ou des caroussels tournoyants qui font de magnifiques d&amp;eacute;mos ou des sites Web publicitaires mais qui ne sont pas forc&amp;eacute;ment des applications repr&amp;eacute;sentatives du travail habituel d&amp;#39;un d&amp;eacute;veloppeur. Il est donc d&amp;#39;autant plus important de conna&amp;icirc;tre ces extensions de WPF et de Silverlight et pour ce faire il faut trouver les bonnes explications...
&lt;/p&gt;
&lt;p&gt;
A lire absolument donc, pour y piocher des articles, des astuces, ou de simples explications sur toute la partie affichage des donn&amp;eacute;es sous Silverlight ou WPF.
&lt;/p&gt;
&lt;p&gt;
Avec &amp;ccedil;a, vous pouvez vous occuper jusqu&amp;#39;&amp;agrave; la rentr&amp;eacute;e de septembre !
&lt;/p&gt;
&lt;p&gt;
Mais Stay Tuned, car j&amp;#39;ai plein d&amp;#39;autres choses &amp;agrave; vous dire d&amp;#39;ici l&amp;agrave; !
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/DndTHXS0iyk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/DndTHXS0iyk/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/05/WPF-et-Silverlight-composants-orientes-donnees-dans-les-Toolkits.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=bf551d88-b5ba-4a6e-ae48-5df632cd7dce</guid>
      <pubDate>Wed, 05 Aug 2009 04:33:00 +0200</pubDate>
      <category>Annonce</category>
      <category>Silverlight</category>
      <category>WPF</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=bf551d88-b5ba-4a6e-ae48-5df632cd7dce</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=bf551d88-b5ba-4a6e-ae48-5df632cd7dce</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/05/WPF-et-Silverlight-composants-orientes-donnees-dans-les-Toolkits.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=bf551d88-b5ba-4a6e-ae48-5df632cd7dce</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=bf551d88-b5ba-4a6e-ae48-5df632cd7dce</feedburner:origLink></item>
    <item>
      <title>Créer un arbre des répertoires avec XML (et l'interroger avec LINQ to XML)</title>
      <description>&lt;p&gt;
Pour les besoins d&amp;#39;un prochain billet je voulais obtenir une structure arborescente de test sous la forme d&amp;#39;un fichier XML. Une telle chose peut se faire &amp;agrave; la main mais cela est fastidieux et &amp;agrave; force de copier/coller les donn&amp;eacute;es seront trop semblables et donc peu utilisables pour des tests et du debug, ce qui est dommage puisque tel &amp;eacute;tait le but recherch&amp;eacute;... 
&lt;/p&gt;
&lt;p&gt;
Pour g&amp;eacute;n&amp;eacute;rer des donn&amp;eacute;es al&amp;eacute;atoires mais r&amp;eacute;alistes je poss&amp;egrave;de d&amp;eacute;j&amp;agrave; un outil fantastique (puisque c&amp;#39;est moi qui l&amp;#39;est fait :-) ), DataGen, un logiciel puissant mais qui n&amp;#39;est pas &amp;eacute;tudi&amp;eacute; pour g&amp;eacute;n&amp;eacute;rer des donn&amp;eacute;es dont la strucuture est r&amp;eacute;cursive. Restait donc &amp;agrave; concevoir un utilitaire pour satisfaire mon besoin de l&amp;#39;instant. 
&lt;/p&gt;
&lt;p&gt;
Je n&amp;#39;aime pas d&amp;eacute;velopper &amp;quot;pour rien&amp;quot; donc il fallait que cet utilitaire en soit bien un. Tout disque dur de d&amp;eacute;veloppeur contient une telle quantit&amp;eacute; de donn&amp;eacute;es que l&amp;#39;ensemble des r&amp;eacute;pertoires forment une superbe structure arborescente ni trop petite ni trop gigantesque. Exactement ce qu&amp;#39;il faut pour des tests ! Ainsi, l&amp;#39;outil devra fabriquer un fichier XML &amp;agrave; partir de n&amp;#39;importe quel niveau de r&amp;eacute;pertoire, la structure &amp;eacute;tant hi&amp;eacute;rarchique. 
&lt;/p&gt;
&lt;p&gt;
Je m&amp;#39;empresse donc de vous faire partager ce petit bout de code qui vous sera utile un jour ou l&amp;#39;autre je pense. 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.Linq;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Enaxos.Tools.Xml
&lt;/pre&gt;
&lt;pre class="alt"&gt;
{
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="rem"&gt;/// This class can generate an XML file from a folder hierarchy.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DirToXml
&lt;/pre&gt;
&lt;pre&gt;
    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
        &lt;span class="rem"&gt;/// Builds the tree document.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;dirname&amp;quot;&amp;gt;The name of the starting folder.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;a LINQ to XML &amp;lt;c&amp;gt;XDocument&amp;lt;/c&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; XDocument BuildTreeDocument(&lt;span class="kwrd"&gt;string&lt;/span&gt; dirname)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
        {
&lt;/pre&gt;
&lt;pre&gt;
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; XDocument(&lt;span class="kwrd"&gt;new&lt;/span&gt; XDeclaration(&lt;span class="str"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;yes&amp;quot;&lt;/span&gt;), 
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                &lt;span class="kwrd"&gt;new&lt;/span&gt; XComment(&lt;span class="str"&gt;&amp;quot;Structure au &amp;quot;&lt;/span&gt;+DateTime.Now),&lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;&amp;quot;directories&amp;quot;&lt;/span&gt;, BuildTree(dirname)));
&lt;/pre&gt;
&lt;pre&gt;
        }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
        &lt;span class="rem"&gt;/// Builds the tree (recursive method).&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;dirName&amp;quot;&amp;gt;Name of the starting folder.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;a LINQ to XML &amp;lt;c&amp;gt;XElement&amp;lt;/c&amp;gt; being the root (or 1st item) of the tree.&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; XElement BuildTree(&lt;span class="kwrd"&gt;string&lt;/span&gt; dirName)
&lt;/pre&gt;
&lt;pre&gt;
        {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            var di = &lt;span class="kwrd"&gt;new&lt;/span&gt; DirectoryInfo(dirName);
&lt;/pre&gt;
&lt;pre&gt;
            var files = di.GetFiles();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            var dirsize = 0l;
&lt;/pre&gt;
&lt;pre&gt;
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var file &lt;span class="kwrd"&gt;in&lt;/span&gt; files)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            {
&lt;/pre&gt;
&lt;pre&gt;
                dirsize += file.Length;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            }
&lt;/pre&gt;
&lt;pre&gt;
            var subdirs = di.GetDirectories();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            &lt;span class="rem"&gt;// each item is a &amp;quot;directory&amp;quot; having 5 attributes&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
            &lt;span class="rem"&gt;// name is the name of the folder&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            &lt;span class="rem"&gt;// fullpath is the full path including the name of the folder&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
            &lt;span class="rem"&gt;// size is the size of all files in the folder (in bytes)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            &lt;span class="rem"&gt;// files is the number of files in the folder&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
            &lt;span class="rem"&gt;// subdirs is the count of possible sub directories in the folder&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            var elem = &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;&amp;quot;directory&amp;quot;&lt;/span&gt;, 
&lt;/pre&gt;
&lt;pre&gt;
                &lt;span class="kwrd"&gt;new&lt;/span&gt; XAttribute(&lt;span class="str"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;, di.Name), 
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                &lt;span class="kwrd"&gt;new&lt;/span&gt; XAttribute(&lt;span class="str"&gt;&amp;quot;fullpath&amp;quot;&lt;/span&gt;,dirName),
&lt;/pre&gt;
&lt;pre&gt;
                &lt;span class="kwrd"&gt;new&lt;/span&gt; XAttribute(&lt;span class="str"&gt;&amp;quot;size&amp;quot;&lt;/span&gt;, dirsize),
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                &lt;span class="kwrd"&gt;new&lt;/span&gt; XAttribute(&lt;span class="str"&gt;&amp;quot;files&amp;quot;&lt;/span&gt;,files.Count()),
&lt;/pre&gt;
&lt;pre&gt;
                &lt;span class="kwrd"&gt;new&lt;/span&gt; XAttribute(&lt;span class="str"&gt;&amp;quot;subdirs&amp;quot;&lt;/span&gt;,subdirs.Count()));
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var dinf &lt;span class="kwrd"&gt;in&lt;/span&gt; subdirs)
&lt;/pre&gt;
&lt;pre&gt;
            {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                var elemDir = BuildTree(dirName + &amp;quot;\\&amp;quot; + dinf.Name);
&lt;/pre&gt;
&lt;pre&gt;
                elem.Add(elemDir);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            }
&lt;/pre&gt;
&lt;pre&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            &lt;span class="kwrd"&gt;return&lt;/span&gt; elem;
&lt;/pre&gt;
&lt;pre&gt;
        }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    }
&lt;/pre&gt;
&lt;pre&gt;
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Ce code peut &amp;ecirc;tre utilis&amp;eacute; sans passer par un fichier disque puisqu&amp;#39;on r&amp;eacute;cup&amp;egrave;re le document en m&amp;eacute;moire. L&amp;#39;exemple ci-dessous montre comment appeler le code et comment interroger la structure via Linq To Xml pour conna&amp;icirc;tre les r&amp;eacute;pertoires vides (n&amp;#39;ayant ni fichier ni sous r&amp;eacute;pertoire) : 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;var d = DirToXml.BuildTreeDocument(&lt;span class="str"&gt;@&amp;quot;D:\WpfToolkit&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;d.Save(&lt;span class="str"&gt;@&amp;quot;d:\test.xml&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;Console.WriteLine(d.ToString());
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;Console.WriteLine(&lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;(&lt;span class="str"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;,60));
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;var q = from e &lt;span class="kwrd"&gt;in&lt;/span&gt; d.Descendants(&lt;span class="str"&gt;&amp;quot;directory&amp;quot;&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="kwrd"&gt;where&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt;) e.Attribute(&lt;span class="str"&gt;&amp;quot;files&amp;quot;&lt;/span&gt;) == 0
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;             &amp;amp;&amp;amp; (&lt;span class="kwrd"&gt;int&lt;/span&gt;)e.Attribute(&lt;span class="str"&gt;&amp;quot;subdirs&amp;quot;&lt;/span&gt;) == 0
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;             orderby (&lt;span class="kwrd"&gt;string&lt;/span&gt;) e.Attribute(&lt;span class="str"&gt;&amp;quot;fullpath&amp;quot;&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;             select e.Attribute(&lt;span class="str"&gt;&amp;quot;fullpath&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;Console.WriteLine(&lt;span class="str"&gt;&amp;quot;R&amp;eacute;pertoires vides&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var element &lt;span class="kwrd"&gt;in&lt;/span&gt; q)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;  { Console.WriteLine(element); }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;Console.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0} r&amp;eacute;pertoires vides&amp;quot;&lt;/span&gt;,q.Count()));
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
A bient&amp;ocirc;t pour un prochain billet, so.. Stay Tuned ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/ntUbccEINKM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/ntUbccEINKM/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/04/Creer-un-arbre-des-repertoires-avec-XML-(et-linterroger-avec-LINQ-to-XML).aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=ed9a2681-10b1-4890-80b7-b707f2514a95</guid>
      <pubDate>Tue, 04 Aug 2009 23:21:00 +0200</pubDate>
      <category>Articles</category>
      <category>LINQ</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=ed9a2681-10b1-4890-80b7-b707f2514a95</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=ed9a2681-10b1-4890-80b7-b707f2514a95</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/04/Creer-un-arbre-des-repertoires-avec-XML-(et-linterroger-avec-LINQ-to-XML).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=ed9a2681-10b1-4890-80b7-b707f2514a95</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=ed9a2681-10b1-4890-80b7-b707f2514a95</feedburner:origLink></item>
    <item>
      <title>Silverlight 3: Accélération GPU et cache image</title>
      <description>&lt;p&gt;
Dans un &lt;a href="http://www.e-naxos.com/Blog/post.aspx?id=4f654a40-78b6-4811-90ff-a203f42c91b8" target="_blank"&gt;r&amp;eacute;cent billet sur les Pixel Shaders (effets bitmap)&lt;/a&gt; j&amp;#39;avais, par un raccourci de pens&amp;eacute;e un peu rapide, associ&amp;eacute; trop facilement les capacit&amp;eacute;s d&amp;#39;acc&amp;eacute;l&amp;eacute;ration graphique GPU de Silverlight 3 avec celles de WPF. Or il existe des nuances tr&amp;egrave;s sensibles entre les deux impl&amp;eacute;mentations. 
&lt;/p&gt;
&lt;p&gt;
Par souci de rigueur j&amp;#39;ai modifi&amp;eacute; le billet original en lui ajoutant les pr&amp;eacute;cisions n&amp;eacute;cessaires mais les corrections de billets ne sont pas propag&amp;eacute;es par feedburner qui g&amp;egrave;re une parite des flux RSS des abonn&amp;eacute;s &amp;agrave; mon blog. Et pire, ceux qui ont d&amp;eacute;j&amp;agrave; t&amp;eacute;l&amp;eacute;charg&amp;eacute; le billet sous Outlook ou un autre news reader n&amp;#39;ont aucune chance de voir la correction. Ne reste plus qu&amp;#39;&amp;agrave; cr&amp;eacute;er un nouveau billet pour m&amp;#39;assurer que l&amp;#39;info est pass&amp;eacute;e.. Voici la notice ajout&amp;eacute;e au billet cit&amp;eacute; plus haut : 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;--extrait--&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Quelques mots sur l&amp;#39;acc&amp;eacute;l&amp;eacute;ration GPU&lt;/strong&gt; : M&amp;ecirc;me si ce n&amp;#39;est pas le sujet du pr&amp;eacute;sent billet, il s&amp;#39;agit d&amp;#39;une nouvelle feature tr&amp;egrave;s int&amp;eacute;ressante de SL3. On a tendance h&amp;eacute;las (et j&amp;#39;ai &amp;eacute;t&amp;eacute; le premier &amp;agrave; me faire &amp;quot;avoir&amp;quot;) &amp;agrave; trop vite faire le parall&amp;egrave;le avec WPF et &amp;agrave; transposer ce que fait l&amp;#39;acc&amp;eacute;l&amp;eacute;ration sous ce dernier. En fait, le support de l&amp;#39;acc&amp;eacute;l&amp;eacute;ration GPU de SL3 est pour l&amp;#39;instant assez limit&amp;eacute; et ne se met en route que de fa&amp;ccedil;on volontaire. Elle ne s&amp;#39;applique pas aux effets bitmaps ni aux nouveaux&amp;nbsp;flux vid&amp;eacute;os qui restent trait&amp;eacute;s par le CPU. 
&lt;/p&gt;
&lt;p&gt;
Malgr&amp;eacute; tout le syst&amp;egrave;me d&amp;#39;acc&amp;eacute;l&amp;eacute;ration graphique peut rendre d&amp;#39;immense service, dans certains de mes tests sur l&amp;#39;animation d&amp;#39;images assez grandes j&amp;#39;ai pu voir mon PC passer de 88% d&amp;#39;utilisation CPU (double coeur Asus plut&amp;ocirc;t rapide) &amp;agrave; moins de 4% ! Ce qui est &amp;eacute;norme. Mais pour profiter de l&amp;#39;acc&amp;eacute;l&amp;eacute;ration il faut aboslument en conna&amp;icirc;tre le fonctionnement et les limitations. 
&lt;/p&gt;
&lt;p&gt;
Je vous invite ainsi &amp;agrave; lire &lt;a href="http://dotnetslackers.com/articles/silverlight/Discovering-Silverlight3-Deep-Dive-into-GPU-Acceleration.aspx" target="_blank"&gt;&lt;font color="#cccccc"&gt;l&amp;#39;excellent billet de Andras Verlvart &lt;/font&gt;&lt;/a&gt;sur la question. Il est assorti d&amp;#39;une application exemple en live qui permet de bien voir l&amp;#39;effet des diff&amp;eacute;rentes possibilit&amp;eacute;s d&amp;#39;acc&amp;eacute;l&amp;eacute;ration et leur impact sur le CPU et le GPU. Cet article est en anglais, pour ceux qui pr&amp;eacute;f&amp;egrave;re la lecture en fran&amp;ccedil;ais, &lt;a href="http://blogs.msdn.com/davrous/archive/2009/04/23/silverlight-3-pr-cisions-sur-l-acc-l-ration-mat-rielle-gpu.aspx" target="_blank"&gt;&lt;font color="#cccccc"&gt;David Rousset &lt;/font&gt;&lt;/a&gt;a &amp;eacute;crit un billet qui fait le point&amp;nbsp;sur cette m&amp;ecirc;me&amp;nbsp;question. 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;--fin d&amp;#39;extrait--&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
Esp&amp;eacute;rant ainsi avoir r&amp;eacute;tabli la&amp;nbsp;pr&amp;eacute;cision technique n&amp;eacute;cessaire&amp;nbsp;&amp;agrave; propos de&amp;nbsp;cette nouvelle possibilit&amp;eacute; de Silverlight 3, et incidemment, vous avoir donn&amp;eacute; envie de vous familiariser avec et de l&amp;#39;adopter dans vos d&amp;eacute;veloppements, 
&lt;/p&gt;
&lt;p&gt;
Stay Tuned pour d&amp;#39;autres nouvelles ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/YBdeAWwKLNM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/YBdeAWwKLNM/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/04/Silverlight-3-Accelaration-GPU-et-cache-image.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=7e85eec8-71d2-4f95-a3cc-28eb8686142f</guid>
      <pubDate>Tue, 04 Aug 2009 18:39:00 +0200</pubDate>
      <category>Articles</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=7e85eec8-71d2-4f95-a3cc-28eb8686142f</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=7e85eec8-71d2-4f95-a3cc-28eb8686142f</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/04/Silverlight-3-Accelaration-GPU-et-cache-image.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=7e85eec8-71d2-4f95-a3cc-28eb8686142f</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=7e85eec8-71d2-4f95-a3cc-28eb8686142f</feedburner:origLink></item>
    <item>
      <title>« Il neige » ou les boucles d’animation, les fps et les sprites sous Silverlight</title>
      <description>&lt;p&gt;
Il n&amp;rsquo;est jamais trop tard pour pr&amp;eacute;parer No&amp;euml;l et la p&amp;eacute;riode estivale est le meilleur moment pour parler de neige, vision rafra&amp;icirc;chissante s&amp;rsquo;il en est. Mais tel n&amp;rsquo;est pas r&amp;eacute;ellement mon propos. Sous ce pr&amp;eacute;texte glac&amp;eacute; (mais pas gla&amp;ccedil;ant) se cache des notions techniques tr&amp;egrave;s utiles sous Silverlight (ou WPF). 
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
Les boucles d&amp;rsquo;animation, le contr&amp;ocirc;le des fps (frame per second, images par seconde) et les sprites (petits objets autonomes anim&amp;eacute;s) sont certes autant d&amp;rsquo;incursions dans le monde du jeu mais la cr&amp;eacute;ativit&amp;eacute; permet d&amp;rsquo;envisager mille utilisations de ces techniques dans d&amp;rsquo;autres contextes.&lt;br /&gt;
Je me suis librement inspir&amp;eacute; d&amp;rsquo;un billet s&amp;rsquo;intitulant &amp;laquo; &lt;a href="http://silverlight.net/blogs/msnow/archive/2008/09/22/silverlight-tip-of-the-day-44-making-it-snow-in-silverlight.aspx" target="_blank"&gt;Making it snow in Silverlight &lt;/a&gt;&amp;raquo; &amp;eacute;crit par Mike &amp;hellip; Snow (facile &amp;agrave; se souvenir !). J&amp;rsquo;utilise un code diff&amp;eacute;rent et (&amp;agrave; mon sens) am&amp;eacute;lior&amp;eacute;, mais il &amp;eacute;tait important de rendre &amp;agrave; Snow la neige qui lui appartient (et de faire un peu d&amp;rsquo;humour bas de gamme au passage). 
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
Avant d&amp;rsquo;expliquer certains aspects, voici une d&amp;eacute;monstration live que vous pouvez passer en mode plein &amp;eacute;cran : 
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/IlNeige/IlNeige.xap;width=500;height=350] 
&lt;/p&gt;
&lt;h2&gt;Le but&lt;/h2&gt;
&lt;p&gt;
Le but du jeu est donc de faire tomber de la neige sur un fond, c&amp;#39;est-&amp;agrave;-dire de faire se mouvoir des centaines d&amp;rsquo;objets autonomes ayant chacun un aspect l&amp;eacute;g&amp;egrave;rement diff&amp;eacute;rent et une trajectoire un peu al&amp;eacute;atoire. Le tout assez vite pour que cela paraisse naturel. 
&lt;/p&gt;
&lt;h2&gt;Le principe&lt;/h2&gt;
&lt;p&gt;
Chaque flocon de neige est en r&amp;eacute;alit&amp;eacute; une instance d&amp;rsquo;un &lt;strong&gt;UserControl&lt;/strong&gt;, il y a ainsi des centaines d&amp;rsquo;instances au m&amp;ecirc;me instant. Chaque flocon est responsable de son affichage et de la fa&amp;ccedil;on dont il avance &amp;agrave; chaque &amp;laquo; pas &amp;raquo;. La coordination g&amp;eacute;n&amp;eacute;rale &amp;eacute;tant r&amp;eacute;alis&amp;eacute;e par une boucle d&amp;rsquo;animation principale, c&amp;rsquo;est elle qui scande le rythme et demande &amp;agrave; chaque flocon d&amp;rsquo;avancer d&amp;rsquo;un &amp;laquo; pas &amp;raquo;.&lt;br /&gt;
Tout se trouve donc dans deux endroits strat&amp;eacute;giques : la boucle principale et le UserControl &amp;laquo; Flocon &amp;raquo;. 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;em&gt;&lt;strong&gt;Suivre l&amp;#39;article : le code n&amp;#39;&amp;eacute;tant pas tr&amp;egrave;s lisible dans le blog, sauf extraits tr&amp;egrave;s courts, je n&amp;#39;ai volontairement pas plac&amp;eacute; ce dernier dans le corps du billet. Je vous conseille ainsi de t&amp;eacute;l&amp;eacute;charger le projet (en fin de billet) et de suivre les explications en ayant le code charg&amp;eacute; sous Blend 3 ou Visual Studio (2008 + SL3 minimum).&lt;/strong&gt;&lt;/em&gt; 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Le sprite Flocon&lt;/h2&gt;
&lt;p&gt;
Il s&amp;rsquo;agit d&amp;rsquo;un UserControl poss&amp;eacute;dant une interface tr&amp;egrave;s simple puisqu&amp;rsquo;il s&amp;rsquo;agit d&amp;rsquo;un bitmap en forme d&amp;rsquo;&amp;eacute;toile (ou pourrait utiliser n&amp;rsquo;importe quelle forme vectorielle cr&amp;eacute;&amp;eacute;e sous Design ou Illustrator). C&amp;ocirc;t&amp;eacute; XAML on retrouve ainsi une grille avec un PNG &amp;agrave; l&amp;rsquo;int&amp;eacute;rieur, rien de palpitant. A noter qu&amp;rsquo;au niveau du UserControl lui-m&amp;ecirc;me on d&amp;eacute;finit deux transformations : une d&amp;rsquo;&amp;eacute;chelle (&lt;em&gt;FlakeScale&lt;/em&gt;) et une de rotation (&lt;em&gt;FlakeRotation&lt;/em&gt;). Dans l&amp;rsquo;exemple de la neige cette derni&amp;egrave;re n&amp;rsquo;a que peu d&amp;rsquo;effet visuel sauf lorsqu&amp;rsquo;on choisit une taille assez grosse pour les flocons. L&amp;rsquo;&amp;oelig;il ne discerne pas forc&amp;eacute;ment la rotation de fa&amp;ccedil;on consciente mais comme elle est choisit al&amp;eacute;atoirement pour chaque flocon cela renforce l&amp;rsquo;aspect global plus &amp;laquo; organique &amp;raquo;. De plus il s&amp;rsquo;agit d&amp;rsquo;illustrer des techniques utilisables dans d&amp;rsquo;autres contextes ou avec d&amp;rsquo;autres sprites pour lesquels l&amp;rsquo;effet serait plus &amp;eacute;vident. La technique est extrapolable &amp;agrave; toutes les transformations support&amp;eacute;es, m&amp;ecirc;me les nouvelles transformations 2,5D de Silverlight 3.&lt;br /&gt;
Le code de la classe Flocon se divise en deux points : le constructeur et la m&amp;eacute;thode &amp;laquo; Tombe &amp;raquo;. 
&lt;/p&gt;
&lt;h3&gt;Le constructeur&lt;/h3&gt;
&lt;p&gt;
Il est responsable de la cr&amp;eacute;ation de chaque instance. C&amp;rsquo;est &amp;agrave; ce niveau qu&amp;rsquo;on introduit un peu d&amp;rsquo;al&amp;eacute;atoire dans la rotation du flocon. On choisit aussi &amp;agrave; ce moment la position de d&amp;eacute;part en X (la position en Y &amp;eacute;tant toujours &amp;agrave; z&amp;eacute;ro au d&amp;eacute;part).&lt;br /&gt;
La gestion des flocons est s&amp;eacute;quentielle (par la boucle d&amp;rsquo;animation que nous verrons plus loin). De fait il n&amp;rsquo;y a pas de multithreading et on peut se permettre un d&amp;eacute;veloppement tr&amp;egrave;s simple de la classe. Par exemple les limites du tableau de jeu sont stock&amp;eacute;es dans des propri&amp;eacute;t&amp;eacute;s statiques de la classe. Le programme initialise ces valeurs au lancement et les modifie &amp;agrave; chaque fois que la taille du tableau est chang&amp;eacute;e (redimensionnement du browser).&amp;nbsp; &lt;br /&gt;
Le constructeur fixe aussi de fa&amp;ccedil;on al&amp;eacute;atoire l&amp;rsquo;&amp;eacute;chelle de l&amp;rsquo;instance afin que chaque flocon soit de taille l&amp;eacute;g&amp;egrave;rement diff&amp;eacute;rente par rapport &amp;agrave; une &amp;eacute;chelle de base. Cela permet d&amp;rsquo;obtenir un effet de profondeur de champ. 
&lt;/p&gt;
&lt;h3&gt;La m&amp;eacute;thode &amp;laquo; Tombe &amp;raquo;&lt;/h3&gt;
&lt;p&gt;
Il s&amp;rsquo;agit bien de tomber et non d&amp;rsquo;outre-tombe et de zombies fa&amp;ccedil;on Thriller du tr&amp;egrave;s m&amp;eacute;diatis&amp;eacute; Jackson. Pour chaque flocon il s&amp;rsquo;agit donc ici de savoir choir, avec si possible le sens du rythme et du mouvement du sus-cit&amp;eacute; Michael.&lt;br /&gt;
Pour ce faire la m&amp;eacute;thode &amp;laquo; Tombe &amp;raquo; doit calculer la nouvelle position X,Y du flocon. Les flocons &amp;eacute;voluent dans un espace de type Canvas particuli&amp;egrave;rement indiqu&amp;eacute; pour tout ce qui doit &amp;ecirc;tre positionn&amp;eacute; de cette fa&amp;ccedil;on &amp;agrave; l&amp;rsquo;&amp;eacute;cran.&lt;br /&gt;
Sur l&amp;rsquo;axe des Y le d&amp;eacute;placement s&amp;rsquo;effectue d&amp;rsquo;un pixel &amp;agrave; la fois. Une incr&amp;eacute;mentation simple est utilis&amp;eacute;e. Sur l&amp;rsquo;axe horizontale le flocon change r&amp;eacute;guli&amp;egrave;rement de direction pour rendre l&amp;rsquo;ensemble visuel plus r&amp;eacute;aliste. On utilise ici un tirage al&amp;eacute;atoire pour savoir s&amp;rsquo;il faut ou non changer de direction. Dans l&amp;rsquo;affirmative on modifie la valeur du pas de d&amp;eacute;placement (&lt;em&gt;hzDeplacement&lt;/em&gt;). La position sur X est alors calcul&amp;eacute;e en ajoutant cette valeur &amp;agrave; la position courante.&lt;br /&gt;
Reste &amp;agrave; savoir quand un flocon n&amp;rsquo;a plus d&amp;rsquo;int&amp;eacute;r&amp;ecirc;t, c&amp;#39;est-&amp;agrave;-dire lorsqu&amp;rsquo;il &amp;eacute;chappe au champ de vision et qu&amp;rsquo;il peut &amp;ecirc;tre d&amp;eacute;truit (n&amp;rsquo;oublions pas que des centaines d&amp;rsquo;instances sont g&amp;eacute;r&amp;eacute;es &amp;agrave; la fois et que tout flocon inutile doit &amp;ecirc;tre d&amp;eacute;truit le plus vite possible pour d&amp;rsquo;&amp;eacute;videntes raison d&amp;rsquo;efficacit&amp;eacute;). C&amp;rsquo;est le r&amp;ocirc;le du test en fin de m&amp;eacute;thode qui initialise la valeur &amp;laquo; HorsZone &amp;raquo;. Lorsqu&amp;rsquo;elle passe &amp;agrave; true, le flocon peut &amp;ecirc;tre d&amp;eacute;truit. Cette information est utilis&amp;eacute;e par la boucle principale. 
&lt;/p&gt;
&lt;h2&gt;&lt;br /&gt;
La boucle d&amp;rsquo;animation&lt;/h2&gt;
&lt;p&gt;
Maintenant que nous disposons d&amp;rsquo;un mod&amp;egrave;le de flocon (la classe Flocon) reste &amp;agrave; animer de nombreuses instances pour donner l&amp;rsquo;illusion de la neige qui tombe.&lt;br /&gt;
La technique pourrait utiliser un Timer ou bien une StoryBoard vide dont le d&amp;eacute;clenchement est r&amp;eacute;alis&amp;eacute; &amp;agrave; chaque pas (et comme elle s&amp;rsquo;arr&amp;ecirc;te imm&amp;eacute;diatement on obtient une sorte de Timer rythmant la boucle principale). Cette derni&amp;egrave;re fa&amp;ccedil;on de faire &amp;eacute;tait tr&amp;egrave;s utilis&amp;eacute;e sous Silverlight 1.x.&amp;nbsp; Selon la vitesse de la machine cliente la boucle est ainsi d&amp;eacute;clench&amp;eacute;e plus ou moins vite ce qui &amp;eacute;vite le probl&amp;egrave;me de fixer un pas d&amp;eacute;termin&amp;eacute; comme avec un Timer. Toutefois il est en r&amp;eacute;alit&amp;eacute; inutile de calculer la position des flocons plus rapidement que les FPS, pure perte d&amp;rsquo;&amp;eacute;nergie, ni de calculer moins souvent (autant abaisser les FPS). 
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
Sous Silverlight 2 un &amp;eacute;v&amp;eacute;nement a &amp;eacute;t&amp;eacute; ajout&amp;eacute; donnant acc&amp;egrave;s au rythme du moteur de rendu : &lt;font face="courier new,courier"&gt;CompositionTarget.Rendering&lt;/font&gt;. En g&amp;eacute;rant la boucle principale dans ce dernier on s&amp;rsquo;assure d&amp;rsquo;&amp;ecirc;tre parfaitement dans le tempo du moteur de rendu, ni plus rapide, ni plus lent. 
&lt;/p&gt;
&lt;p&gt;
Cette technique a toutefois dans le principe un d&amp;eacute;faut connu dans tous les jeux programm&amp;eacute;s de la sorte : la c&amp;eacute;l&amp;eacute;rit&amp;eacute; de l&amp;rsquo;ensemble d&amp;eacute;pend de la vitesse de la machine h&amp;ocirc;te. Un PC tr&amp;egrave;s lent fera donc tomber la neige trop lentement, alors qu&amp;rsquo;un PC fulgurant des ann&amp;eacute;es 2020 ne permettra m&amp;ecirc;me plus de distinguer le d&amp;eacute;placement des flocons tellement cela sera rapide, rendant le jeu &amp;laquo; injouable &amp;raquo;. Pour le premier probl&amp;egrave;me il n&amp;rsquo;y a pas vraiment de solution, on ne peut donner plus puissance &amp;agrave; la machine h&amp;ocirc;te (sauf &amp;agrave; permettre &amp;agrave; l&amp;rsquo;utilisateur de diminuer la charge du jeu lui-m&amp;ecirc;me en limitant par exemple le nombre maximum de flocons, le param&amp;egrave;tre de densit&amp;eacute; peut jouer ce r&amp;ocirc;le dans notre exemple). Quant au second probl&amp;egrave;me il trouve sa r&amp;eacute;ponde dans la limite &amp;agrave; 60 FPS par d&amp;eacute;faut de Silverlight, limite modifiable via les param&amp;egrave;tres du plugin (&lt;a href="http://blogs.microsoft.co.il/blogs/alex_golesh/archive/2008/07/17/silverlight-application-performance-refresh-rate-amp-cpu-usage.aspx" target="_blank"&gt;voir ce billet&lt;/a&gt;). 
&lt;/p&gt;
&lt;p&gt;
D&amp;eacute;barrass&amp;eacute;s des &amp;eacute;cueils propres &amp;agrave; cette technique, l&amp;rsquo;&amp;eacute;v&amp;eacute;nement de rendering devient l&amp;rsquo;endroit privil&amp;eacute;gi&amp;eacute; pour placer le code d&amp;rsquo;une boucle principale d&amp;rsquo;animation. 
&lt;/p&gt;
&lt;h2&gt;Le contr&amp;ocirc;le des FPS&lt;/h2&gt;
&lt;p&gt;
Lorsque vous ex&amp;eacute;cutez une application de ce type il est important de contr&amp;ocirc;ler les FPS pour voir comment certaines am&amp;eacute;liorations du code peuvent acc&amp;eacute;l&amp;eacute;rer ou non le rendu. Pour ce faire Silverlight permet d&amp;rsquo;activer l&amp;rsquo;affichage de deux informations essentielles dans la barre d&amp;rsquo;&amp;eacute;tat du browser : les FPS actuels et la limite fix&amp;eacute;e dans le plugin. L&amp;rsquo;activation se fait via &lt;font face="courier new,courier"&gt;Application.Current.Host.Settings&lt;/font&gt; en pla&amp;ccedil;ant &lt;font face="courier new,courier"&gt;EnableFrameRateCounter&lt;/font&gt; &amp;agrave; true. Il est bien entendu vivement conseill&amp;eacute; de d&amp;eacute;connecter la fonction en mode Release. Si votre navigateur et ses r&amp;eacute;glages le supporte vous devez en ce moment pouvoir lire ces informations en bas &amp;agrave; gauche de la barre d&amp;#39;&amp;eacute;tat (et si l&amp;#39;exemple live de l&amp;#39;application en d&amp;eacute;but de billet s&amp;#39;est charg&amp;eacute; correctement). 
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	Attention : Selon les r&amp;eacute;glages de s&amp;eacute;curit&amp;eacute; Internet Explorer autant que FirexFox peuvent ne pas autoriser la modification de la barre d&amp;rsquo;&amp;eacute;tat. Sous IE (sous FF cela est quasi identique) il faut v&amp;eacute;rifier le param&amp;egrave;tre Outils / Options Internet / S&amp;eacute;curit&amp;eacute; / Zone Internet / Personnaliser le niveau / Autoriser les mises &amp;agrave; jour &amp;agrave; la barre d&amp;rsquo;&amp;eacute;tat via le script. Ce param&amp;egrave;tre doit &amp;ecirc;tre activ&amp;eacute; pour voir les FPS. 
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Le Rendering&lt;/h2&gt;
&lt;p&gt;
A chaque pas du rendering nous allons r&amp;eacute;aliser deux t&amp;acirc;ches essentielles : d&amp;eacute;placer les flocons d&amp;eacute;j&amp;agrave; pr&amp;eacute;sents et supprimer ceux devenus inutiles et cr&amp;eacute;er de nouveaux flocons.&lt;br /&gt;
Pour d&amp;eacute;placer les flocons nous ne faisons que balayer la liste de tous les flocons et appeler la m&amp;eacute;thode &amp;laquo; Tombe() &amp;raquo; de chacun. Au passage nous archivons dans une liste temporaire tous les flocons dont l&amp;rsquo;&amp;eacute;tat &lt;font face="courier new,courier"&gt;HorsZone&lt;/font&gt; est pass&amp;eacute; &amp;agrave; true. En fin d&amp;rsquo;animation les flocons inutiles sont supprim&amp;eacute;s de la liste principale les laissant ainsi disponible au Garbage Collector. 
&lt;/p&gt;
&lt;p&gt;
Pour cr&amp;eacute;er de nouveaux flocons nous d&amp;eacute;terminons si la densit&amp;eacute; d&amp;eacute;sir&amp;eacute;e est atteinte ou non. Le processus est randomis&amp;eacute; pour plus de r&amp;eacute;alisme bien que le seuil de densit&amp;eacute; soit lui fix&amp;eacute; par le programme (et modifiable dans notre exemple). Comme le placement de chaque flocon est r&amp;eacute;alis&amp;eacute; dans le constructeur de la classe Flocon il n&amp;rsquo;y a rien d&amp;rsquo;autre &amp;agrave; faire que de cr&amp;eacute;er les flocons et de les ajouter &amp;agrave; la collection &lt;font face="courier new,courier"&gt;Children&lt;/font&gt; du &lt;font face="courier new,courier"&gt;Canvas&lt;/font&gt; parent. 
&lt;/p&gt;
&lt;h2&gt;Le plein &amp;eacute;cran&lt;/h2&gt;
&lt;p&gt;
Silverlight permet de passer une application en mode plein &amp;eacute;cran. Sachez toutefois que ce mode pose de s&amp;eacute;rieuses conditions &amp;agrave; son utilisation. Notamment il ne peut &amp;ecirc;tre activ&amp;eacute; qu&amp;rsquo;en r&amp;eacute;ponse directe &amp;agrave; un clic de l&amp;rsquo;utilisateur. Cela permet d&amp;rsquo;&amp;eacute;viter (en partie) qu&amp;rsquo;une application Silverlight soit utilis&amp;eacute;e de fa&amp;ccedil;on &amp;agrave; tromper l&amp;rsquo;utilisateur final en prenant le contr&amp;ocirc;le de tout l&amp;rsquo;&amp;eacute;cran sans son autorisation (on pourrait penser &amp;agrave; un fake du bureau Windows permettant par exemple d&amp;rsquo;extorquer un login). De m&amp;ecirc;me, lorsque l&amp;rsquo;application bascule en mode plein &amp;eacute;cran un message impossible &amp;agrave; supprimer est affich&amp;eacute; pour avertir l&amp;rsquo;utilisateur et lui indiquer que l&amp;rsquo;appui sur Escape permet de sortir de ce mode sp&amp;eacute;cial. 
&lt;/p&gt;
&lt;p&gt;
Si cela n&amp;rsquo;&amp;eacute;tait pas suffisant, les saisies clavier sont impossibles en plein &amp;eacute;cran. Seules certaines touches ont un effet (&lt;a href="http://msdn.microsoft.com/fr-fr/library/cc189023(VS.95).aspx" target="_blank"&gt;voir la documentation sur MSDN&lt;/a&gt;). Ne pensez pas utiliser le plein &amp;eacute;cran pour une application de saisie par exemple. En revanche pour visionner des vid&amp;eacute;os ou pour cr&amp;eacute;er un jeu les touches disponibles et la gestion de la souris sont suffisants. C&amp;#39;est le cas de notre d&amp;eacute;mo. 
&lt;/p&gt;
&lt;p&gt;
Une fois connues ces limites raisonnables (Microsoft ne veut pas, &amp;agrave; juste titre, que Silverlight soit utilis&amp;eacute; par des fraudeurs et autres adaptes du phishing) le passage en plein &amp;eacute;cran s&amp;rsquo;effectue par &lt;font face="courier new,courier"&gt;Application.Current.Host.Content.IsFullScreen&lt;/font&gt; en mettant cette propri&amp;eacute;t&amp;eacute; &amp;agrave; true, et ce en r&amp;eacute;ponse au clic sur un bouton en g&amp;eacute;n&amp;eacute;ral. 
&lt;/p&gt;
&lt;h2&gt;Le code&lt;/h2&gt;
&lt;p&gt;
T&amp;eacute;l&amp;eacute;charger le projet complet de l&amp;#39;exemple &amp;quot;IlNeige&amp;quot; : &lt;a href="http://www.e-naxos.com/Blog/file.axd?file=2009%2f8%2fIlNeige.zip"&gt;IlNeige.zip (229,54 kb)&lt;/a&gt; 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/-xlqRKRDKJs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/-xlqRKRDKJs/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/03/c2ab-Il-neige-c2bb-ou-les-boucles-de28099animation-les-fps-et-les-sprites-sous-Silverlight.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=d1487c6e-e42d-4b34-9438-e7c870eeafd4</guid>
      <pubDate>Mon, 03 Aug 2009 01:58:00 +0200</pubDate>
      <category>Articles</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=d1487c6e-e42d-4b34-9438-e7c870eeafd4</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=d1487c6e-e42d-4b34-9438-e7c870eeafd4</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/03/c2ab-Il-neige-c2bb-ou-les-boucles-de28099animation-les-fps-et-les-sprites-sous-Silverlight.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=d1487c6e-e42d-4b34-9438-e7c870eeafd4</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=d1487c6e-e42d-4b34-9438-e7c870eeafd4</feedburner:origLink></item>
    <item>
      <title>Silverlight : Dessiner des horloges, un peu de trigonométrie !</title>
      <description>&lt;p align="left"&gt;
Tout le monde sait faire un cercle, enfin une Ellipse particuli&amp;egrave;re sous Silverlight ayant une hauteur et une largeur identiques. En revanche placer les marques des minutes ou placer correctement le texte des heures dans le cadran n&amp;#39;est pas toujours &amp;eacute;vident. 
&lt;/p&gt;
&lt;p&gt;
Si on tente de le faire &amp;quot;&amp;agrave; la main&amp;quot;, et m&amp;ecirc;me sous Blend, c&amp;#39;est une v&amp;eacute;ritable gal&amp;egrave;re (imaginez 60 petites ellipses pour les secondes &amp;agrave; r&amp;eacute;partir soigneusement, sans parler d&amp;#39;un &amp;eacute;ventuel changement de dimension qui mettrait tout par terre !). 
&lt;/p&gt;
&lt;p&gt;
La seule solution raisonnable passe ici forc&amp;eacute;ment par code. Mais malgr&amp;eacute; la croyance populaire tous les&amp;nbsp;informaticiens ne sont&amp;nbsp;pas forc&amp;eacute;ment&amp;nbsp;des &amp;quot;b&amp;ecirc;tes&amp;quot; en math ! On peut &amp;ecirc;tre un expert en SQL sans se rappeler ses cours de trigonom&amp;eacute;trie et on peut d&amp;eacute;velopper toute une architecture multithread&amp;eacute;e sans m&amp;ecirc;me savoir ce qu&amp;#39;est un Groupe de Lie. Mais parfois ce genre de connaissance peut manquer notamment d&amp;egrave;s qu&amp;#39;on aborde le traitement d&amp;#39;image ou de dessin. 
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/ClockHours/ClockHours.xap;width=360;height=222] 
&lt;/p&gt;
&lt;p&gt;
Le but du jeu est donc ici de r&amp;eacute;partir harmonieusement des objets sur un cercle. Dans un cas il s&amp;#39;agit de texte (les heures) dans l&amp;#39;autre des cercles (les dots). Mais avant de regarder le code, rappelons quelques points math&amp;eacute;matiques : 
&lt;/p&gt;
&lt;p&gt;
L&amp;#39;unit&amp;eacute; Math fonctionne en radians c&amp;#39;est &amp;agrave; dire qu&amp;#39;un cercle vaut 2 Pi (donc deux fois 3.1415926...). C&amp;#39;est b&amp;ecirc;te parce qu&amp;#39;en g&amp;eacute;n&amp;eacute;ral un humain normalement consitut&amp;eacute; raisonne plut&amp;ocirc;t en degr&amp;eacute;s, ce qui est plus facile &amp;agrave; se repr&amp;eacute;senter mentalement. 
&lt;/p&gt;
&lt;div style="text-align: center"&gt;
&lt;img id="AB-Image" style="filter: alpha(opacity=100); background-color: white; width: 596px; height: 592px" src="http://tof225391.free.fr/Realisation/accessoires/cercletrigo.png" alt="" width="596" height="592" /&gt; 
&lt;/div&gt;
&lt;p align="center"&gt;
(vous pouvez copier &lt;a href="http://eleccc.free.fr/forum/viewtopic.php?f=10&amp;amp;t=86&amp;amp;view=unread" target="_blank"&gt;l&amp;#39;original en svg ici&lt;/a&gt;) 
&lt;/p&gt;
&lt;p&gt;
Comme on peut le remarquer en radian le 0 se trouve au milieu &amp;agrave; droite du cercle et non pas en haut &amp;agrave; midi comme on pourrait s&amp;#39;y attendre. Du coup, comme les fonctions math&amp;eacute;matiques de .NET marchent en radians si on raisonne en degr&amp;eacute;s il faudra penser &amp;agrave; cette petite sp&amp;eacute;cifit&amp;eacute; lors de la conversion. Par exemple, la place de &amp;quot;1 heure&amp;quot; sur une horloge se situe &amp;agrave; 300 degr&amp;eacute;s et non pas &amp;agrave; 30&amp;deg; (1 pas de 360 divis&amp;eacute; par 12). 
&lt;/p&gt;
&lt;p&gt;
Le code ci-dessous permet d&amp;#39;&amp;eacute;crire les heures dans l&amp;#39;exemple live Silverlight plus haut dans ce billet : 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; writeHours(&lt;span class="kwrd"&gt;int&lt;/span&gt; radius, &lt;span class="kwrd"&gt;int&lt;/span&gt; offsetx, &lt;span class="kwrd"&gt;int&lt;/span&gt; offsety, Canvas parent, &lt;span class="kwrd"&gt;double&lt;/span&gt; fontsize, Color color)
&lt;/pre&gt;
&lt;pre&gt;
        {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            var h = 1;
&lt;/pre&gt;
&lt;pre&gt;
            &lt;span class="kwrd"&gt;for&lt;/span&gt; (var angle=300;angle&amp;lt;=630;angle+=30)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            {
&lt;/pre&gt;
&lt;pre&gt;
                var t = &lt;span class="kwrd"&gt;new&lt;/span&gt; TextBlock {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                        Foreground=&lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(color), 
&lt;/pre&gt;
&lt;pre&gt;
                        Text=h.ToString(),
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                        FontSize = fontsize};
&lt;/pre&gt;
&lt;pre&gt;
                h++;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                t.SetValue(Canvas.LeftProperty,(radius * Math.Cos(DegreetoRadian(angle))) + offsetx);
&lt;/pre&gt;
&lt;pre&gt;
                t.SetValue(Canvas.TopProperty,(radius * Math.Sin(DegreetoRadian(angle))) + offsety);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                parent.Children.Add(t);
&lt;/pre&gt;
&lt;pre&gt;
            }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
        }
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Les param&amp;egrave;tres sont les suivants : 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
	&lt;div&gt;
	radius : rayon du cercle virtuel sur lequel les heures sont pos&amp;eacute;es 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	offsetx et offsety : positionnement du centre du cercle dans le canvas parent, sachant que le 0,0 se trouve en haut &amp;agrave; gauche. 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	parent :&amp;nbsp;le Canvas parent 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	fontSize : taille de la fonte 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	color : la couleur de la fonte 
	&lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Pour dessiner les dots on utilise le m&amp;ecirc;me principe (sans s&amp;#39;encombrer des d&amp;eacute;tails du point de d&amp;eacute;part d&amp;eacute;cal&amp;eacute; puisque toutes les dots sont identiques). 
&lt;/p&gt;
&lt;p&gt;
Le code n&amp;#39;est pas optimal et on peut certainement faire mieux, mais cela vous donne un point de d&amp;eacute;part ... Pour compl&amp;eacute;ter le tout, vous pouvez t&amp;eacute;l&amp;eacute;charger le projet : &lt;a href="http://www.e-naxos.com/Blog/file.axd?file=2009%2f8%2fClockHours.zip"&gt;ClockHours.zip (61,42 kb)&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Stay Tuned ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/POr-HA3Eyh0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/POr-HA3Eyh0/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/08/01/Silverlight-Dessiner-des-horloges-un-peu-de-trigonometrie-!.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=cc969156-01b7-4e73-978c-6b462ef58bee</guid>
      <pubDate>Sat, 01 Aug 2009 20:17:00 +0200</pubDate>
      <category>Articles</category>
      <category>Design</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=cc969156-01b7-4e73-978c-6b462ef58bee</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=cc969156-01b7-4e73-978c-6b462ef58bee</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/08/01/Silverlight-Dessiner-des-horloges-un-peu-de-trigonometrie-!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=cc969156-01b7-4e73-978c-6b462ef58bee</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=cc969156-01b7-4e73-978c-6b462ef58bee</feedburner:origLink></item>
    <item>
      <title>Silverlight 3 : Gestion des cookies</title>
      <description>&lt;p&gt;
Silverlight propose un espace de stockage priv&amp;eacute; pour chaque application sur la machine cliente. Cet espace s&amp;#39;appelle &lt;strong&gt;l&amp;#39;Isolated Storage&lt;/strong&gt; (&lt;em&gt;stockage isol&amp;eacute;&lt;/em&gt;, car prot&amp;eacute;g&amp;eacute; et isol&amp;eacute; du reste de la machine cliente). C&amp;#39;est&amp;nbsp;dans cet espace qu&amp;#39;il est conseill&amp;eacute; de sauvegarder les donn&amp;eacute;es propres &amp;agrave; l&amp;#39;application (j&amp;#39;y reviendrai dans un prochain billet). Toutefois on peut amen&amp;eacute; pour certaines informations &amp;agrave; pr&amp;eacute;f&amp;eacute;rer le stockage sous la forme de &lt;strong&gt;Cookies&lt;/strong&gt; traditionnels. On peut aussi avoir besoin de lire certains cookies pos&amp;eacute;s par l&amp;#39;&amp;eacute;ventuelle application h&amp;ocirc;te en ASP.NET par exemple. 
&lt;/p&gt;
&lt;p&gt;
Quelles que soient les raisons, il peut donc s&amp;#39;av&amp;eacute;rer utile de manipuler les cookies depuis une application Silverlight. 
&lt;/p&gt;
&lt;p&gt;
L&amp;#39;application exemple ci-dessous vous permet de tester en live cette fonctionnalit&amp;eacute; : 
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/Cookies/Cookies.xap;width=380;height=322] 
&lt;/p&gt;
&lt;p&gt;
Techniquement, et apr&amp;egrave;s avoir ajout&amp;eacute; &amp;agrave; votre code le using du namespace &amp;quot;&lt;font face="courier new,courier"&gt;System.Windows.Browser&lt;/font&gt;&amp;quot;, il suffit pour cr&amp;eacute;er (ou modifier) un cookie d&amp;#39;appeler la m&amp;eacute;thode &lt;font face="courier new,courier"&gt;SetProperty&lt;/font&gt; de &lt;font face="courier new,courier"&gt;HtmlPage.Document&lt;/font&gt; : 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; setCookie(&lt;span class="kwrd"&gt;string&lt;/span&gt; key, &lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(key) || &lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span class="kwrd"&gt;value&lt;/span&gt;))
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;; }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            DateTime dt = calExpiry.SelectedDate ?? DateTime.Now 
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                + &lt;span class="kwrd"&gt;new&lt;/span&gt; TimeSpan(1, 0, 0);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; s = key.Trim() + &lt;span class="str"&gt;&amp;quot;=&amp;quot;&lt;/span&gt; + &lt;span class="kwrd"&gt;value&lt;/span&gt;.Trim() 
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                + &lt;span class="str"&gt;&amp;quot;;expires=&amp;quot;&lt;/span&gt; + dt.ToString(&lt;span class="str"&gt;&amp;quot;R&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            HtmlPage.Document.SetProperty(&lt;span class="str"&gt;&amp;quot;cookie&amp;quot;&lt;/span&gt;, s);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Pour la lecture on acc&amp;egrave;de &amp;agrave; la cha&amp;icirc;ne &amp;quot;&lt;font face="comic sans ms,sand"&gt;Cookies&lt;/font&gt;&amp;quot; de &lt;font face="courier new,courier"&gt;HtmlPage.Document&lt;/font&gt; qu&amp;#39;on peut ensuite traiter pour s&amp;eacute;parer chaque cookie : 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; getCookie(&lt;span class="kwrd"&gt;string&lt;/span&gt; key)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt;[] cookies = HtmlPage.Document.Cookies.Split(&lt;span class="str"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; cookie &lt;span class="kwrd"&gt;in&lt;/span&gt; cookies)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                &lt;span class="kwrd"&gt;string&lt;/span&gt;[] pair = cookie.Split(&lt;span class="str"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (pair.Length == 2)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (pair[0].ToString() == key)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;return&lt;/span&gt; pair[1];
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        }
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Bref, rien de bien compliqu&amp;eacute; mais qui pourra vous servir dans certains cas. 
&lt;/p&gt;
&lt;p&gt;
Le code source du projet (Blend 3 de pr&amp;eacute;f&amp;eacute;rence, sinon VS 2008 + SL3) : &lt;a href="http://www.e-naxos.com/Blog/file.axd?file=2009%2f7%2fCookies.zip"&gt;Cookies.zip (62,65 kb)&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Stay Tuned ! 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/8Qsv9UMxagU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/8Qsv9UMxagU/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/07/31/Silverlight-3-Gestion-des-cookies.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=dc14c326-ecc2-44cd-845b-83567827d666</guid>
      <pubDate>Fri, 31 Jul 2009 22:26:00 +0200</pubDate>
      <category>Astuce</category>
      <category>Données</category>
      <category>Internet</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=dc14c326-ecc2-44cd-845b-83567827d666</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=dc14c326-ecc2-44cd-845b-83567827d666</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/07/31/Silverlight-3-Gestion-des-cookies.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=dc14c326-ecc2-44cd-845b-83567827d666</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=dc14c326-ecc2-44cd-845b-83567827d666</feedburner:origLink></item>
    <item>
      <title>Silverlight 3 (+WPF) : Hatching Effect gratuit + Sources</title>
      <description>&lt;p&gt;
Les pixel shaders de Silverlight 3 fournis &amp;quot;out of the box&amp;quot; ne sont que deux : le drop shadow et le blur. Mais comme cela &amp;eacute;tait pr&amp;eacute;visible de nombreux programmeurs exercent leur talent en cr&amp;eacute;ant de nouveaux effets...
&lt;/p&gt;
&lt;p&gt;
Forc&amp;eacute;ment l&amp;#39;&amp;eacute;quipe Microsoft de la suite Expression est tr&amp;egrave;s bien plac&amp;eacute;e pour ce genre d&amp;#39;exercice et elle nous propose via son blog un effet de crayonnage assez bien fait. Le tout avec install pour automatiquement voir l&amp;#39;effet dans les palettes de Blend 3 mais aussi avec le code source pour l&amp;#39;&amp;eacute;tudier et faire ses propres effets.
&lt;/p&gt;
&lt;p&gt;
Le mieux est de vous rendre directement sur le blog de l&amp;#39;&amp;eacute;quipe Expression, et plus particuli&amp;egrave;rement sur le &lt;a href="http://blogs.msdn.com/expression/archive/2009/07/06/hatching-effect-shader-for-both-siverlight-and-wpf.aspx" target="_blank"&gt;billet pr&amp;eacute;sentant le Hatching effect&lt;/a&gt;. Source et install sont t&amp;eacute;l&amp;eacute;chargeables depuis le billet.
&lt;/p&gt;
&lt;p&gt;
A noter, l&amp;#39;effet fonctionne aussi avec WPF selon ce qui est dit mais&amp;nbsp;je n&amp;#39;ai test&amp;eacute; que sous Silverlight.
&lt;/p&gt;
&lt;p&gt;
Stay Tuned !
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/ikyThMAlJm4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/ikyThMAlJm4/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/07/29/Silverlight-3-(2bWPF)-Hatching-Effect-gratuit-2b-Sources.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=3754ce9b-fbf3-4d68-be88-9bdb78c36550</guid>
      <pubDate>Wed, 29 Jul 2009 22:08:00 +0200</pubDate>
      <category>Annonce</category>
      <category>Design</category>
      <category>Silverlight</category>
      <category>WPF</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=3754ce9b-fbf3-4d68-be88-9bdb78c36550</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=3754ce9b-fbf3-4d68-be88-9bdb78c36550</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/07/29/Silverlight-3-(2bWPF)-Hatching-Effect-gratuit-2b-Sources.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=3754ce9b-fbf3-4d68-be88-9bdb78c36550</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=3754ce9b-fbf3-4d68-be88-9bdb78c36550</feedburner:origLink></item>
    <item>
      <title>Suite Expression 3 finale disponible !</title>
      <description>&lt;p&gt;
La suite Expression 3 contenant notamment l&amp;#39;extraordinaire Blend 3 est disponible en t&amp;eacute;l&amp;eacute;chargement ... pour les chanceux abonn&amp;eacute;s &amp;agrave; MSDN.
&lt;/p&gt;
&lt;p&gt;
Pour les autres je suppose que le produit peut d&amp;eacute;sormais &amp;ecirc;tre achet&amp;eacute; chez Microsoft, au pire il s&amp;#39;agit d&amp;#39;une question de jours seulement.
&lt;/p&gt;
&lt;p&gt;
Bon, je vous laisse, je viens de finir le download et je d&amp;eacute;sinstalle Blend 3 beta le temps d&amp;#39;&amp;eacute;crire&amp;nbsp;ce billet et je vais maintenant installer tout &amp;ccedil;a !
&lt;/p&gt;
&lt;p&gt;
Miam ! ... euhh Stay Tuned je voulais dire !
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/WtieUj0RYIE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/WtieUj0RYIE/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/07/28/Suite-Expression-3-finale-disponible-!.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=43c19ef3-eb16-416a-b833-5fea610718e0</guid>
      <pubDate>Tue, 28 Jul 2009 03:43:00 +0200</pubDate>
      <category>Annonce</category>
      <category>Design</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=43c19ef3-eb16-416a-b833-5fea610718e0</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=43c19ef3-eb16-416a-b833-5fea610718e0</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/07/28/Suite-Expression-3-finale-disponible-!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=43c19ef3-eb16-416a-b833-5fea610718e0</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=43c19ef3-eb16-416a-b833-5fea610718e0</feedburner:origLink></item>
    <item>
      <title>Silverlight 3 : Les Pixel shaders (effets bitmap) et l'accélération GPU</title>
      <description>&lt;p&gt;
L&amp;#39;une des grandes nouveaut&amp;eacute;s de Silverlight 3 c&amp;#39;est le support de l&amp;#39;acc&amp;eacute;l&amp;eacute;ration graphique. L&amp;#39;application principale se trouve d&amp;eacute;charg&amp;eacute;e de certaines t&amp;acirc;ches qui sont rout&amp;eacute;es vers le GPU de la carte graphique. Mais attention, l&amp;#39;acc&amp;eacute;l&amp;eacute;ration GPU de Silverlight 3 ne fait pas tout comme sa grande soeur sous WPF (qui utilise DirectX et toutes ses ficelles pour acc&amp;eacute;l&amp;eacute;rer le traitement vid&amp;eacute;o). On aurait pu croire que les effets bitmaps (pixel shaders) de WPF qui viennent d&amp;#39;&amp;ecirc;tre port&amp;eacute;s sous Silverlight 3 utilisent l&amp;#39;acc&amp;eacute;l&amp;eacute;ration GPU, en r&amp;eacute;alit&amp;eacute; il n&amp;#39;en est rien. Mais cela n&amp;#39;enl&amp;egrave;ve rien &amp;agrave; ces nouveaux effets parfaitement utilisables pour enrichir le visuel d&amp;#39;une application et dont je vais vous parler maintenant...
&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
	&lt;strong&gt;Quelques mots sur l&amp;#39;acc&amp;eacute;l&amp;eacute;ration GPU&lt;/strong&gt; : M&amp;ecirc;me si ce n&amp;#39;est pas le sujet du pr&amp;eacute;sent billet, il s&amp;#39;agit d&amp;#39;une nouvelle feature tr&amp;egrave;s int&amp;eacute;ressante de SL3. On a tendance h&amp;eacute;las (et j&amp;#39;ai &amp;eacute;t&amp;eacute; le premier &amp;agrave; me faire &amp;quot;avoir&amp;quot;) &amp;agrave; trop vite faire le parall&amp;egrave;le avec WPF et &amp;agrave; transposer ce que fait l&amp;#39;acc&amp;eacute;l&amp;eacute;ration sous ce dernier. En fait, le support de l&amp;#39;acc&amp;eacute;l&amp;eacute;ration GPU de SL3 est pour l&amp;#39;instant assez limit&amp;eacute; et ne se met en route que de fa&amp;ccedil;on volontaire. Elle ne s&amp;#39;applique pas aux effets bitmaps ni aux nouveaux Codecs vid&amp;eacute;os qui restent trait&amp;eacute;s par le CPU. Malgr&amp;eacute; tout le syst&amp;egrave;me d&amp;#39;acc&amp;eacute;l&amp;eacute;ration graphique peut rendre d&amp;#39;immense service, dans certains de mes tests sur l&amp;#39;animation d&amp;#39;images assez grandes j&amp;#39;ai pu voir mon PC de test passer de 88% d&amp;#39;utilisation CPU (double coeur Asus plut&amp;ocirc;t rapide) &amp;agrave; moins de 4% ! Ce qui est &amp;eacute;norme. Mais pour profiter de l&amp;#39;acc&amp;eacute;l&amp;eacute;ration il faut aboslument en conna&amp;icirc;tre le fonctionnement et les limitations. Je vous invite ainsi &amp;agrave; lire &lt;a href="http://dotnetslackers.com/articles/silverlight/Discovering-Silverlight3-Deep-Dive-into-GPU-Acceleration.aspx" target="_blank"&gt;l&amp;#39;excellent billet de Andras Verlvart &lt;/a&gt;sur la question. Il est assorti d&amp;#39;une application exemple qui permet de bien voir l&amp;#39;effet des diff&amp;eacute;rentes possibilit&amp;eacute;s d&amp;#39;acc&amp;eacute;l&amp;eacute;ration et leur impact sur le CPU et le GPU. Cet article est en anglais, pour ceux qui pr&amp;eacute;f&amp;egrave;re la lecture en fran&amp;ccedil;ais, &lt;a href="http://blogs.msdn.com/davrous/archive/2009/04/23/silverlight-3-pr-cisions-sur-l-acc-l-ration-mat-rielle-gpu.aspx" target="_blank"&gt;David Rousset &lt;/a&gt;a &amp;eacute;crit un billet qui fait le point&amp;nbsp;sur cette m&amp;ecirc;me&amp;nbsp;question.
	&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Les Pixel Shaders&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;
Par d&amp;eacute;faut Silverlight 3 est fourni avec deux effets : le blur (flou) et le drop shadow (ombre port&amp;eacute;e). Mais on trouve sur CodePlex un tr&amp;egrave;s beau projet offrant toute une s&amp;eacute;rie de nouveaux effets comme le swirl ou l&amp;#39;emboss (&lt;a href="http://www.codeplex.com/wpffx" target="_blank"&gt;WPF Effects Library &lt;/a&gt;pour WPF et Silverlight). Gr&amp;acirc;ce au SDK Directx et au langage HSL il possible de d&amp;eacute;velopper ses propres effets. 
&lt;/p&gt;
&lt;p&gt;
L&amp;#39;exemple ci-dessous illustre mon propos : la fen&amp;ecirc;tre principale est d&amp;eacute;cor&amp;eacute;e d&amp;#39;une magnifique photo d&amp;#39;&amp;eacute;clair (copyrigth&amp;eacute;e par moi-m&amp;ecirc;me) sur laquelle un flou peut &amp;ecirc;tre appliqu&amp;eacute; gr&amp;acirc;ce &amp;agrave; un slider se trouvant dans une petite fen&amp;ecirc;tre semi transparente sur laquelle est appliqu&amp;eacute; un drop-shadow. 
&lt;/p&gt;
&lt;p&gt;
Vous remarquerez que la petite fen&amp;ecirc;tre en question peut &amp;ecirc;tre d&amp;eacute;plac&amp;eacute;e par drag-drop gr&amp;acirc;ce &amp;agrave; une autre nouveaut&amp;eacute; de Silverlight 3 : les behaviors (comportements), sorte de petits bouts de code compil&amp;eacute;s qu&amp;#39;on peut &amp;quot;jeter&amp;quot; sur n&amp;#39;importe quel contr&amp;ocirc;le pour lui offrir le dit comportement, ici un d&amp;eacute;placement par drag-drop. Le tout sans une ligne de C#. Le slider a &amp;eacute;t&amp;eacute; templat&amp;eacute; &amp;quot;&amp;agrave; l&amp;#39;arrache&amp;quot; mais il a &amp;eacute;t&amp;eacute; templat&amp;eacute; tout de m&amp;ecirc;me :-). Autre nouveaut&amp;eacute; de Silverlight 3 qui est ici d&amp;eacute;montr&amp;eacute;e : le databinding entre &amp;eacute;l&amp;eacute;ments d&amp;#39;interface, ainsi le texte indiquant la quantit&amp;eacute; de flou appliqu&amp;eacute;e est directement li&amp;eacute; &amp;agrave; la propri&amp;eacute;t&amp;eacute; Value du Slider. Pour formater cette valeur un convertisseur a &amp;eacute;t&amp;eacute; ajout&amp;eacute;. 
&lt;/p&gt;
&lt;p&gt;
Bref, une petite application vite fait pour montrer les Pixel Shaders, mais pas seulement... 
&lt;/p&gt;
&lt;p&gt;
Le mieux &amp;eacute;tant maintenant de jouer avec et de t&amp;eacute;l&amp;eacute;charger le projet (VS2008 + SL3 toolkit ou Blend 3 de pr&amp;eacute;f&amp;eacute;rence) : &lt;a href="http://www.e-naxos.com/Blog/file.axd?file=2009%2f7%2fPixelShader.zip"&gt;PixelShader.zip (168,29 kb)&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/PixelShader/PixelShader.xap;width=550;height=480] 
&lt;/p&gt;
&lt;p&gt;
Et Stay Tuned ! 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;nota: cet article du 28 juillet 2009 a &amp;eacute;t&amp;eacute; mis &amp;agrave; jour le&amp;nbsp; 3 ao&amp;ucirc;t &amp;agrave; propos de l&amp;#39;acc&amp;eacute;l&amp;eacute;ration GPU.&lt;/em&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/oSFjnYP6qRM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/oSFjnYP6qRM/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/07/28/Silverlight-3-Les-Pixel-shaders-(effets-bitmap)-et-lacceleration-GPU.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=4f654a40-78b6-4811-90ff-a203f42c91b8</guid>
      <pubDate>Tue, 28 Jul 2009 00:59:00 +0200</pubDate>
      <category>Astuce</category>
      <category>Design</category>
      <category>Silverlight</category>
      <category>WPF</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=4f654a40-78b6-4811-90ff-a203f42c91b8</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=4f654a40-78b6-4811-90ff-a203f42c91b8</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/07/28/Silverlight-3-Les-Pixel-shaders-(effets-bitmap)-et-lacceleration-GPU.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=4f654a40-78b6-4811-90ff-a203f42c91b8</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=4f654a40-78b6-4811-90ff-a203f42c91b8</feedburner:origLink></item>
    <item>
      <title>Silverlight : Application transparente</title>
      <description>&lt;p&gt;
Il est tout &amp;agrave; fait possible de rendre une application (ou une fen&amp;ecirc;tre) Silverlight transparente, c&amp;#39;est &amp;agrave; dire que son contenu appara&amp;icirc;tra sur la couleur de fond du site h&amp;ocirc;te. Cela peut s&amp;#39;av&amp;eacute;rer tr&amp;egrave;s utile pour des petits morceaux de Silverlight plac&amp;eacute;s sur un site Html ou Asp.net, pour cr&amp;eacute;er une barre de menu par exemple. Si la charte couleur du site est modifi&amp;eacute;e il ne sera pas n&amp;eacute;cessaire de modifier et recompiler la ou les applications Silverlight. 
&lt;/p&gt;
&lt;p&gt;
Pour arriver &amp;agrave; ce r&amp;eacute;sultat il faut faire deux choses simples dont la syntaxe d&amp;eacute;pend de la nature de la page o&amp;ugrave; s&amp;#39;ins&amp;egrave;re le plugin (ASP.NET ou HTML) 
&lt;/p&gt;
&lt;p&gt;
exemple ASP.NET : 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Silverlight&lt;/span&gt; &lt;span class="attr"&gt;PluginBackground&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Transparent&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Windowless&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Menu&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; 
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="attr"&gt;Source&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;~/ClientBin/Menuxap&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;MinimumVersion&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;xxxxx&amp;quot;&lt;/span&gt;  &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;  
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
exemple HTML : 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;object&lt;/span&gt; &lt;span class="attr"&gt;data&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;data:application/x-silverlight,&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;application/x-silverlight-2-b2&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; 
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;source&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ClientBin/Menu.xap&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; 
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;onerror&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;onSilverlightError&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; 
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;pluginbackground&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Transparent&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; 
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;windowless&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;  
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;object&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;   
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Les deux param&amp;egrave;tres importants &amp;eacute;tant : &lt;strong&gt;PluginBackgrounf&lt;/strong&gt; et &lt;strong&gt;Windoless&lt;/strong&gt;&amp;nbsp;.
&lt;/p&gt;
&lt;p&gt;
Par d&amp;eacute;faut une application Silverlight occupe 100% de la fen&amp;ecirc;tre h&amp;ocirc;te, dans le cas d&amp;#39;une barre de menu ou d&amp;#39;un autre type de fen&amp;ecirc;tre int&amp;eacute;gr&amp;eacute; &amp;agrave; une page ASP.NET/HTML on ajoutera donc dans les balises la d&amp;eacute;claration de la hauteur et de la largeur exacte qu&amp;#39;on souhaite r&amp;eacute;server pour le plugin. Bien entendu le contenu de l&amp;#39;application Silverlight doit &amp;ecirc;tre d&amp;eacute;pourvu d&amp;#39;arri&amp;egrave;re plan, cela va sans dire, sinon, transparence ou non, c&amp;#39;est lui qui sera affich&amp;eacute; et non le background de la page h&amp;ocirc;te... 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/WWMQnhEI0HI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/WWMQnhEI0HI/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/07/27/Silverlight-Application-transparente.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=813e2ca7-89e5-4847-a468-d6e8036d05d7</guid>
      <pubDate>Mon, 27 Jul 2009 06:23:00 +0200</pubDate>
      <category>Astuce</category>
      <category>Design</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=813e2ca7-89e5-4847-a468-d6e8036d05d7</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=813e2ca7-89e5-4847-a468-d6e8036d05d7</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/07/27/Silverlight-Application-transparente.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=813e2ca7-89e5-4847-a468-d6e8036d05d7</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=813e2ca7-89e5-4847-a468-d6e8036d05d7</feedburner:origLink></item>
    <item>
      <title>Silverlight 3 : La multi-sélection</title>
      <description>&lt;p&gt;
Parmi les petites &amp;eacute;volutions de&amp;nbsp;Silverlight 3 qui ne m&amp;eacute;ritent pas un article de fond mais qu&amp;#39;il faut noter tellement elles simplifient les choses, j&amp;#39;appr&amp;eacute;cie le support de la multi s&amp;eacute;lection dans les ListBox.
&lt;/p&gt;
&lt;p&gt;
La nouvelle propri&amp;eacute;t&amp;eacute; s&amp;#39;appelle sans malice : &lt;strong&gt;SelectionMode&lt;/strong&gt; et elle peut prendre les valeurs suivantes : &lt;em&gt;Single&lt;/em&gt;, &lt;em&gt;Multiple&lt;/em&gt;, &lt;em&gt;Extended&lt;/em&gt;. En mode Single on retrouve le comportement par d&amp;eacute;faut mono s&amp;eacute;lection. Les deux autres modes permettent d&amp;#39;acc&amp;eacute;der au comportement multi s&amp;eacute;lection. En mode &lt;em&gt;Multiple&lt;/em&gt; la s&amp;eacute;lection s&amp;#39;op&amp;egrave;re par le clic sur un item, en enfon&amp;ccedil;ant Ctrl ou Shift. Le mode &lt;em&gt;Extended&lt;/em&gt; fait que le Shift permet de s&amp;eacute;lectionner des &amp;eacute;tendues.
&lt;/p&gt;
&lt;p&gt;
Jouez avec notre ami &lt;a href="http://www.casimirland.com/casimirland/gloubi-boulga/index.php" target="_blank"&gt;Casimir &lt;/a&gt;dans l&amp;#39;exemple ci-dessous, et gr&amp;acirc;ce &amp;agrave; la nouvelle ListBox Silverlight 3 confectionnez votre propre Gloubiboulga en partant de la recette originale et de ses options (pour les plus gourmands !) :
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/MultiSelect/MultiSelect.xap;width=411;height=203] 
&lt;/p&gt;
&lt;p&gt;
Bon app&amp;eacute;tit, et... Stay Tuned !
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/8-LWMYZURkE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/8-LWMYZURkE/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/07/23/Silverlight-3-La-multi-selection.aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=51d90886-f5a4-45e7-9f14-6eb6d3b7dc3c</guid>
      <pubDate>Thu, 23 Jul 2009 23:25:00 +0200</pubDate>
      <category>Astuce</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=51d90886-f5a4-45e7-9f14-6eb6d3b7dc3c</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=51d90886-f5a4-45e7-9f14-6eb6d3b7dc3c</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/07/23/Silverlight-3-La-multi-selection.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=51d90886-f5a4-45e7-9f14-6eb6d3b7dc3c</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=51d90886-f5a4-45e7-9f14-6eb6d3b7dc3c</feedburner:origLink></item>
    <item>
      <title>Silverlight 3 : Styles Cascadés (BasedOn Styles)</title>
      <description>&lt;p&gt;
Toujours dans ma petite s&amp;eacute;rie sur les nouveaut&amp;eacute;s de Silverlight 3 je vais vous pr&amp;eacute;senter aujourd&amp;#39;hui une feature plaisante : les styles cascad&amp;eacute;s. 
&lt;/p&gt;
&lt;p&gt;
En soi rien de nouveau &amp;agrave; l&amp;#39;ouest puisque c&amp;#39;est le principe m&amp;ecirc;me des feuilles de styles CSS (qui y puisent d&amp;#39;ailleurs leur nom). Mais le CSS s&amp;#39;applique&amp;nbsp;&amp;agrave; quelques &amp;eacute;l&amp;eacute;ments simples HTML alors que l&amp;agrave; nous parlons de styles Silverlight, c&amp;#39;est &amp;agrave; dire d&amp;#39;objet complexes pouvant d&amp;eacute;finir tout un visuel, animations comprises. 
&lt;/p&gt;
&lt;p&gt;
[silverlight:source=/SLSamples/BasedOnStyle/BasedOnStyle.xap;width=405;height=150] 
&lt;/p&gt;
&lt;p&gt;
Dans l&amp;#39;application Sivlerlight 3 ci-dessus (fonctionnelle, ce n&amp;#39;est pas une capture &amp;eacute;cran), vous voyez 4 boutons. Tous sont des boutons standard du framework. 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
	&lt;div&gt;
	Le premier, intitul&amp;eacute; &amp;quot;Base SL&amp;quot; poss&amp;egrave;de le style Silverlight par d&amp;eacute;faut 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	Le second, &amp;quot;Normal&amp;quot; est d&amp;eacute;cor&amp;eacute; par le style &amp;quot;BoutonNormal&amp;quot; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	Le troisi&amp;egrave;me &amp;quot;Gros&amp;quot; est d&amp;eacute;cor&amp;eacute; par le style &amp;quot;BoutonGros&amp;quot; 
	&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;div&gt;
	Et le quatri&amp;egrave;me &amp;quot;Alarme&amp;quot; est d&amp;eacute;cor&amp;eacute; par le style &amp;quot;BoutonGrosAlarme&amp;quot; 
	&lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Visuellement c&amp;#39;est plut&amp;ocirc;t moche, je vous l&amp;#39;accorde, mais le but du jeu est de voir l&amp;#39;effet du cascading styling... 
&lt;/p&gt;
&lt;p&gt;
Le style &amp;quot;&lt;strong&gt;BoutonNormal&lt;/strong&gt;&amp;quot; est d&amp;eacute;fini comme suit : 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt; &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BoutonNormal&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;TargetType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Button&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Width&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;90&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Height&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;30&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;HorizontalAlignment&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Left&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;VerticalAlignment&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Bottom&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BorderThickness&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
L&amp;agrave; o&amp;ugrave; les choses deviennent plus int&amp;eacute;ressantes, c&amp;#39;est dans le style &amp;quot;&lt;strong&gt;BoutonGros&lt;/strong&gt;&amp;quot; ci-dessous o&amp;ugrave; l&amp;#39;on voit appara&amp;icirc;tre l&amp;#39;attribut &lt;strong&gt;BasedOn&lt;/strong&gt; qui permet de fonder le style courant sur celui qu&amp;#39;on indique : 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt; &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BoutonGros&amp;quot;&lt;/span&gt; 
&lt;/pre&gt;
&lt;pre&gt;
         &lt;strong&gt;&lt;span class="attr"&gt;BasedOn&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource BoutonNormal}&amp;quot;&lt;/span&gt;&lt;/strong&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
         &lt;span class="attr"&gt;TargetType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Button&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Width&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;180&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Height&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;60&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FontFamily&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Comic Sans MS&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Enfin, le dernier style se fonde lui-m&amp;ecirc;me sur le pr&amp;eacute;c&amp;eacute;dent par le m&amp;ecirc;me m&amp;eacute;canisme, le niveau de cascading n&amp;#39;&amp;eacute;tant pas limit&amp;eacute;. On&amp;nbsp;peut voir notamment que le changement de famille de fonte introduit dans le style &amp;quot;&lt;strong&gt;BoutonGros&lt;/strong&gt;&amp;quot; s&amp;#39;est propag&amp;eacute; au style &amp;quot;&lt;strong&gt;BoutonGrosAlarme&lt;/strong&gt;&amp;quot; (fonte Comic). 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt; &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BoutonGrosAlarme&amp;quot;&lt;/span&gt; 
&lt;/pre&gt;
&lt;pre&gt;
         &lt;strong&gt;&lt;span class="attr"&gt;BasedOn&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource BoutonGros}&amp;quot;&lt;/span&gt;&lt;/strong&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
         &lt;span class="attr"&gt;TargetType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Button&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Width&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;160&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Height&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;40&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FontSize&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;18&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FontWeight&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Bold&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Foreground&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Red&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BorderThickness&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;4&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BorderBrush&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;#FFFF0202&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Voil&amp;agrave;, c&amp;#39;est tout simple, mais cela peut radicalement simplifier la cr&amp;eacute;ation de gros templates pour des applications. Tous les avantages du Cascading Style Sheet de HTML dont l&amp;#39;int&amp;eacute;r&amp;ecirc;t ne se d&amp;eacute;montre plus, mais appliqu&amp;eacute; &amp;agrave; des objets et &amp;agrave; la sophistication de Silverlight. Que du bonheur... 
&lt;/p&gt;
&lt;p&gt;
Bon Styling, 
&lt;/p&gt;
&lt;p&gt;
...Et Stay Tuned ! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OD/dotblog/~4/z50ZW0p_93s" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OD/dotblog/~3/z50ZW0p_93s/post.aspx</link>
      <author>odahan.nospam@nospam.e-naxos.com (Olivier)</author>
      <comments>http://www.e-naxos.com/Blog/post/2009/07/23/Silverlight-3-Styles-Cascades-(BasedOn-Styles).aspx#comment</comments>
      <guid isPermaLink="false">http://www.e-naxos.com/Blog/post.aspx?id=1c5a12bf-2349-455d-9710-1cb1dba26c76</guid>
      <pubDate>Thu, 23 Jul 2009 20:08:00 +0200</pubDate>
      <category>Articles</category>
      <category>Astuce</category>
      <category>Design</category>
      <category>Internet</category>
      <category>Silverlight</category>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=1c5a12bf-2349-455d-9710-1cb1dba26c76</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=1c5a12bf-2349-455d-9710-1cb1dba26c76</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/2009/07/23/Silverlight-3-Styles-Cascades-(BasedOn-Styles).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=1c5a12bf-2349-455d-9710-1cb1dba26c76</wfw:commentRss>
    <feedburner:origLink>http://www.e-naxos.com/Blog/post.aspx?id=1c5a12bf-2349-455d-9710-1cb1dba26c76</feedburner:origLink></item>
  </channel>
</rss>
