InertialSlider [Custom Control]

Aucun commentaire


    Dans le cadre d'un projet Silverlight sur tablette tactile, j'ai récemment eu besoin d'un Slider sans limite de valeur. Autrement dit, la valeur Maximum est indéfinie ou alors très éloignée. L'idée est d'augmenter la vitesse d'incrémentation au fur et à mesure du drag du contrôle Thumb. Vous pouvez tester le contrôle ci dessous. Il est possible de définir le pas du changement de valeur ainsi que la finesse d'accélération.

    Install Microsoft Silverlight


    Les sources de base ainsi que le projet de test sont téléchargeables à cette adresse.

    Bookmark and Share

    Fournir ItemsSource à partir de champs/propriétés statiques

    1 commentaire

      Lorsque l'on crée un Objet valeur sans logique, il est souvent nécessaire de récupérer la liste de ses propriétés ou de ses champs statiques. De cette manière vous pouvez l'affecter à une propriété ItemsSource de ComboBox ou d'AutoCompleteBox et ainsi, filtrer une listBox de ValueObject. Sous Silverlight, rien n'est réellement prévu à cet effet. Il serait possible de créer une énumération en affectant des attributs à chacune des valeurs contenues. Toutefois cette méthode est un peu lourde, avec un peu de réflexion on arrive à un résultat efficace sans se compliquer la vie. Il faut tout d'abord créer une classe contenant les champs ou les propriétés statiques :

      public static class WindowsPhone7
      {
           public static string Undefined = " ";
           public static string Omnia7= "Samsung Omnia 7";
           public static string Focus= "Samsung Focus";
           public static string HD7= "HTC HD 7";
           public static string Optimus7= "LG Optimus 7";
           public static string VenuePro= "Dell venue Pro";
      }

      Ensuite côté VueModèle, vous pouvez exposer une liste de ces dernières grâce à un peu de réflexion et à Linq :

      public List<String> WP7Types
      {
          get
           {
               Type t = typeof(WindowsPhone7);
       
               //GetProperties en lieu et place de getFields si beseoin
               var call = (from opp in t.GetFields() select opp.GetValue(t) as string).ToList();
       
               return call;
          }
      }

      Rien d'autre à faire à part un binding sur le ItemsSource d'un ItemsControl et le tour est joué :)

      Bookmark and Share

      FrameReported & ContactButton [Custom Control]

      Aucun commentaire

        Si vous avez déjà développé pour Windows Phone 7, vous avez déjà du remarquer certaines interactions problématiques. C'est notamment le cas lorsque vous utilisez les contrôles de base. Par exemple, lorsque vous cliquez sur un bouton par inadvertance (très souvent le cas pour les enfants), cela bloque toute autre tentative d'écoute sur un autre contrôle. Pour le vérifier posez deux boutons dans une grille windows phone 7 et compilez le projet sur le device. Lorsque vous cliquez sur le premier bouton, la diffusion de tout autre événement souris ou contact (tels que MouseLeftButtonDown par exemple) est impossible. Vous vous trouvez dans un cas classique d'interaction Multi-Touch sans l'avoir prévu. Afin de réaliser des applications réellement multitouch qui prennent ce genre de problématiques en compte, il existe différentes solutions plus ou moins efficaces .

        Utiliser des événements plus adaptés : ManipulationStarted, ManipulationDelta et ManipulationCompleted. Ceux-ci sont directement implémentés dans le framework au niveau de la classe UIElement. Ces événements fournissent plus de détail concernant l'interaction utilisateur en cours. C'est cette solution qui est privilégiée dans 90% des cas. Toutefois cela ne répond pas à notre problématique principale.

        Implémenter l'API de Gesture proposée par le Toolkit Windows Phone 7. Cette API facilite la vie lorsqu'il est nécessaire de connaitre l'écartement entre deux contacts, la rotation du segment entre des contacts et tout autre type d'opérations de ce genre. Le problème est qu'encore une fois, cela n'est pas une bonne solution car les événements proposés ne concernent qu'une seule surface (contrôle) à la fois. De plus l'implémentation de cette API n'est pas très pratique à mettre en oeuvre et ajoute une surcouche à l'API native et engendre de faibles performances (voir figure ci-dessous).

        La seule bonne solution, et la plus exhaustive en matière de possibilités, consiste à Utiliser la classe static Touch. Celle-ci représente le plus bas niveau de traitement MultiTouch. Elle vous permet d'écouter un unique évènement nommé FrameReported. L'objet événementiel récupéré par l'écouteur possède plusieurs informations qui permettent de développer votre propre classe Wrapper MultiTouch ou encore des contrôles particuliers. Ces informations sont contenus dans l'objet événementiel de type TouchFrameEventArgs. L'objet événementiel permet de récupérer le premier contact, de supprimer la diffusion d'événements souris via la méthode SuspendMousePromotionUntilTouchUp. TouchFrameEventArgs donne également accès à la liste des contacts en cours sur une surface via la méthode GetTouchPoints. Cette liste est relative au contexte conteneur passé lors de l'appel de la méthode. De la même manière que GetPosition() de la classe MouseButtonEventArgs, passer null renvoie la liste relative au VisualRoot, donc à l'application elle-même. Chaque contact sur la surface est de type TouchPoint. A ce stade, l'API commence à être réellement utile puisqu'il est possible, pour chaque contact, de récupérer des informations utiles comme sa dimension , son action(relaché, déplacé, appuyé) et sa position relative au conteneur. Voici un exemple :

        public MainPage()
        {
            InitializeComponent();
         
            Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);
         
        }
         
        void Touch_FrameReported(object sender, TouchFrameEventArgs e)
        {
             var tp = e.GetPrimaryTouchPoint(null);
         
             switch(tp.Action)
             {
                   case TouchAction.Down:
                   break;
         
                   case TouchAction.Move:
                   break;
         
                   case TouchAction.Up:
                   break;
         
                   default:
                   break;
             }
        }

        Sur un projet en cours, j'ai du développé un contrôle ContactButton permettant de résoudre cette problématique. L'objectif d'un point de vue utilisateur était d'activer certains menus lorsque deux boutons à la fois étaient cliqués. Ce contrôle est basé sur l'API native multiTouch de Silverlight et sur les classes d'AutomationPeer. L'idée est de diffuser un événement lorsque plusieurs boutons d'un même groupe sont cliqués en même temps. Il est possible d'écouter un événement static de la classe ContactButton afin de récupérer le groupe de bouton cliqué. Au moins deux boutons d'un même groupe doivent être appuyés en même temps pour que la classe diffuse l'événement. Il est également possible d'écouter un groupe spécifique. Voici comme utiliser ces événements :

        public TestTwinBehavior()
        {
            InitializeComponent();
         
            tcb1.ContactSelectionChanged += new EventHandler(tcb1_ContactSelectionChanged);
         
            ContactButton.ContactGroupChanged += new EventHandler(ContactButton_ContactGroupChanged);
        }
         
        void ContactButton_ContactGroupChanged(object sender, ContactButtonGroupEventArgs e)
        {
            Debug.WriteLine(e.ContactButtonGroupName);
        }
         
        void tcb1_ContactSelectionChanged(object sender, Tweened.WP7.Controls.ContactButtonGroupEventArgs e)
        {
            foreach (ButtonBase item in e.ContactedButtons)
            {
                Debug.WriteLine(item.Name);
            }
        }

        Je mets à disposition un projet et la dll qui l'accompagne. En outre, le contrôle LayoutGridSelector est fourni avec des améliorations concernant le support des thèmes visuels Windows Phone 7.

        Bookmark and Share

        Protéger une application Windows Phone 7 sur la MarketPlace

        Aucun commentaire

        Vous l'avez sans doute remarqué si vous avez un Windows Phone 7, la Market place windows Phone c'est juste la jungle. Vous trouverez souvent ce que vous recherchez et sans doute beaucoup plus. C'est ce dernier point qui me pose le plus de problème : vous trouverez très souvent plusieurs applications avec le même nom (sans parler des musiques), des logos très légèrement modifiés et des fonctionnalités similaires. Sans même parler de piratage car cela n'est pas possible, n'importe quel développeur ou entreprise peut à loisir créer une application avec des fonctionnalités identiques lorsque celles-ci ne sont pas complexes à développer. Vous trouverez donc souvent 3 / 4 (et quelques fois plus) applications portant le même nom.

        Ce problème est, il me semble, complètement propre à Windows phone 7 car en tant qu'utilisateur, je n’ai pas remarqué ce phénomène sur l'AppStore.

        Pour résumer même si l’application est sortie un mois , deux mois ou 1 an avant et fut la première portant ce nom, rien n’empêche un développeur ou une entreprise de déposer la même application par la suite avec un logo similaire et un nom exactement identique. La réponse de Microsoft est : il est nécessaire de porter plainte en justice pour protéger le nom de l'application et l'idée de logo. Imaginez donc que vous deviez porter dix plaintes pour 10 applications différentes. Dès lors en tant que développeur Windows Phone 7 et Silverlight, je me pose les questions suivantes :

        1 - Je trouve une bonne idée avec un nom idéal et je suis une petite structure, comment faire pour protéger mon application ?

        2 - Comment faire pour que mon application soit rapidement trouvée sur la market place ?

        3 - Qu’est-ce qui différencie mon application des autres et qu'est-ce qui la protège ?

        A titre personnel, je pense qu'une petite structure a très peu de moyens pour se défendre mis à part une action légale. Sur la Market place votre application et son nom surtout pourrait être déposées avec les mêmes fonctionnalités, seul recours la loi. Mais quelle loi, il me semble que cet aspect là est très délicat car il faudra sans doute déposer un brevet internationale et/ou passer par tous les outils possibles à votre disposition.

        Pour que votre applications soit rapidement trouvée, pas de mystère, il faut quelle soit utilisée et bien notée par les WindowsPhonaute (ou Marketplacenaute), ou que vous possédiez d'autres moyens marketing comme un site, une campagne de pub, ou une application hors windows phone qui y soit reliée. Cette question renvoie à la question trois.

        Ce qui va différencier votre applications des autres ayant le même nom :

        • Les ScreenShots avec des contenus graphiques uniques. Ce contenu est beaucoup plus difficile à copier contrairement au nom. Une banque d'image unique de par son contenu par exemple.
        • Les fonctionnalités complexes, qui ne sont pas à la portée de tous.
        • Une expérience utilisateur sans aucune faille.

        Tous ces éléments seront autant de protection contre la recopie de votre application. Mais alors qu'est-ce qu'il y a de changer avec l'AppStore ? Je dirai un aspect romantique, l'aspect Christophe Colomb :) . On a tous eu l'idée de créer un jour l'application avec THE IDEE(IDEA :) . Sauf qu'aujourd'hui, le développeur qui dans son coin souhaite créer cette application même avec l'idée du siècle, ne pourra pas assurer la protection de son application faute de moyens financiers. Car le nom qu'il dépose peut, du jour au lendemain être complètement piraté. De longs mois de procédures juridique sont à la clef de tous recours. Cela peut couter très cher...

        Aucune réponse technique à ce problème n'est la bonne, aucune réponse légale n'est bonne non plus à moins que vous fassiez partie d'une moyenne / grande entreprise et que vous disposiez de beaucoup, beaucoup de temps devant vous. La bonne réponse est multiple c'est la réponse artistique, la réponse de l'unique, la réponse du contenu et d'un développement parfait, d'une ergonomie parfaite. Cela sera beaucoup plus dur à copier. Donc à ceux qui postent des applications juste pour en poster alors que d'autres du même type existent, s'il vous plait arrêtez, vous ne gagnerez pas d'argent de cette manière. Cela nuit à la MarketPlace et au fantastique outil qu'est Windows Phone 7.

        Bookmark and Share

        Dark & Light Themes avec Windows Phone 7

        Aucun commentaire

          Depuis le service pack, Blend s'est enrichi de nombreuses fonctionnalités dont l'une permet de créer des applications Windows Phone 7. L'un des grands avantages de Blend est son extensibilité, les développeurs de MS ont naturellement ajouté un onglet qui facilite la prévisualisation d'une application WP7 dans sa version finale. Vous pouvez changer l'orientation de l'application, modifier le thème de couleur, tester l'application avec l'émulateur (ou un device) ou encore choisir le thème lumineux, Dark ou Light.

          Ces options sont très utiles, elles vous permettent de tester vos styles, modèles et composants personnalisables dans diverses configurations. C'est notamment le cas avec les deux thèmes lumineux. Contrairement au changement d'orientation du téléphone, vous ne pouvez pas réellement être notifié des changements de thèmes à l'exécution. Toutefois, il suffit d'utiliser les noms des ressources existantes pour préserver cette fonctionnalité lors du développement de vos composants. C'est notamment le cas pour le LayoutGridSelector que je développe actuellement comme vous pouvez le constater ci-dessous.

          La liste des ressources graphiques utilisées par WP7 est ici. Il est intéressant de noter plusieurs petits détails. Il est possible d'écraser une partie ou la totalité du thème chargé. Il vous suffit pour cela de créer une ou plusieurs ressources de couleur ou brush possédant le même nom que celles nativement chargées. Vous pouvez faire le test en changeant la couleur de sélection, créez une ressource de couleur (vert par exemple) comme montré ci-dessous puis placez un Slider dans la grille principale pouvoir la couleur de sélection changée :)

          Il existe également quatre ressources particulières, nommées PhoneDarkThemeVisibility, PhoneLightThemeVisibility, PhoneDarkThemeOpacity, PhoneLightThemeOpacity qui peuvent s'avérer super utiles. Elles permettent aisément d'afficher ou de cacher un objet selon que l'on soit dans le mode d'affichage lumineux ou sombre.

          Bookmark and Share

          Microsoft Keynote lateshow by SteveB @ CES

          Aucun commentaire

            Steve Balmer a tenu la Keynote de Microsoft au CES de Las Vegas cette nuit à 4h30 (heure française). Cette heure fut relativement intense en informations.

            Voici une résumé succinct de la Keynote :

            Nouvelle XBox et Kinect

            • Kinect fonctionne avec zune for XBox et NetFlix, HuluPLUS, tous les jeux ESP
            • Déplacer la time line, choisir une musique un film ou n'importe quel autre média est désormais possible via Kinect
            • Gestion totale des expressions faciales
            • Avatar Kinect vous permet de participer à une conférence multi-utilisateurs, il vous faudra un compte premium à cette fin
            • 30 millions de XBox live account
            • 1ère console vendue aux états unis
            • 50 millions dans le monde sont déployés
            • 8 million Kinect vendus

            Windows Phone 7

            • le jeux Fable - Coin Golf sur WP7
            • 5500 applications actuellement proposées sur WP7
            • 20000 développeurs
            • Microsoft investira lourdement dans le projet dans les prochaines années
            • Copier-Coller supporté dans la prochaine mise à jour

            Windows 7 et Multitouch

            • supporte pleinement les périphériques multitouch comme promis
            • 10 contacts à la fois sur l'une des démos pour activer un clavier tactile

            Surface 2

            • D'une épaisseur de 4 pouces
            • Embarque une technologie complètement différente avec couche de projection d'informations additionnelles
            • Résolution améliorée
            • Consommation d'énergie moindre
            • le prix de la table devrait être en forte baisse, ce qui permettra de la démocratiser
            • API améliorée
            • A base de caméras infrarouge
            • Position verticale désormais possible
            Bookmark and Share

            TooltipHelper [Custom Control]

            Aucun commentaire

              L'une des problématiques que l'on rencontre lorsque l'on travaille avec Silverlight, c'est la difficulté de modifier le style de certains contrôles. L'un des exemples les plus flagrants est la customisation du contrôle ToolTip. De plus dans environnement Silverlight, les ToolTip possèdent moins de capacités que sous WPF. Il est par exemple impossible de définir un délai pour l'apparition et la disparition du ToolTip. Je mets donc en téléchargement un contrôle dont le but est de simplifier la mise en oeuvre d'un ToolTip simple à configurer. Ce contrôle a pour but d'accompagner des zones de saisie, de sélection ou tout autre contrôle afin de signifier à l'utilisateur leur mode de fonctionnement.

              Il est possible de :

              - Modifier le style et le template du ToolTip directement dans Blend ou d'en créer une copie.

              - d'écouter les événements Opened et Closed

              - de définir un en-tête, une corps et un pied

              - de définir un délai d'apparition / disparition

              - de définir le mode de placement

              La dll est téléchargeable Ici.

              Bookmark and Share

              Microsoft Web Camps

              Aucun commentaire

                Microsoft a le plaisir de vous inviter au WebCamp Paris, les 25 et 26 janvier prochain, au centre de Conférences Microsoft, animé par deux experts de Microsoft Corporation : Scott Hanselman, et James Senior.

                Les WebCamps sont des évènements gratuits, sur deux jours, qui permettent d’apprendre à construire et à developer des sites et des applications Web sur la plateforme Web Microsoft. Pendant le WebCamp, les experts de Microsoft vous présenteront plusieurs composants majeurs telles que ASP.NET Web Forms, ASP.NET MVC, jQuery, Entity Framework, IIS, Visual Studio 2010 et bien plus encore. Les WebCamps offrent aussi la possibilité de manipuler les outils et technologies, au travers d’ateliers pratiques et de workshops encadrés, en formant des équipes à plusieurs. Le tout avec l’aide et le soutien d’experts de Microsoft qui vous guideront d’étape en étape.

                Bookmark and Share

                Live Meeting contrôles stylisables par Access-it

                Aucun commentaire

                  Ce soir à 19h00, Simon Ferquel et Julien Corioland tous deux MVPs nommés sur l’expertise Client Application Development animeront un Live Meeting en français à 19 heures.

                  Au programme de ce Live Meeting : Développement de contrôles stylisables avec WPF, Silverlight Desktop et Silverlight pour WP7

                  Pour participer à ce Live Meeting, rien de plus simple, inscrivez-vous ici.

                  Je vous invite également à visiter les blogs de Simon et Julien aux adresses suivantes : http://www.simonferquel.net/blog/, http://blogs.dotnet-france.com/julienc

                  Bookmark and Share

                  LayoutGridSelector WP7 [Custom Control]

                  Aucun commentaire

                    Dans un projet Windows Phone 7 récent, nous avons eu besoin de simplifier l'une des interface utilisateur. Cette dernière permet à un utilisateur de déterminer le nombre de ligne et de colonnes qu'un diaporama peut afficher sur une surface de la dimension d'un Windows Phone (à savoir 800*480). Au départ deux TextBox étaient placés dans une grille et possédaient tous deux une liaison de donnée à deux voies vers des propriété d'un Vue-Modèle. Ce mécanisme n'étant pas des plus simple notamment sur téléphone mobile : click sur TextBox, effacement de l'ancienne saisie et saisie d'un nouveau chiffre et sauvegarde pour finir, j'ai simplifié au maximum cette interface graphique en créant un contrôle qui fait permet à l'utilisateur de définir directement un agencement de manière intuitive.

                    Le contrôle peut définir :

                    1. Un nombre maximum de colonnes et de lignes sélectionnables (bindable)
                    2. La cellule ou la ligne ou la colonne sélectionnée (bindable)
                    3. Diffuse un événement lors de la sélection
                    4. Utilise en interne des ToggleButton doint vous pourrez modifier le style à loisir via le menu Edit Additionnal Style / Template
                    5. De plus, celui-ci fonctionne également pour une application Silverlight classique
                    6. J'ai pris en compte toutes les interactions utilisateurs possible du point de vue tactile pour éviter les erreurs de sélection ou d'affichage

                    La dll contenant le controle est téléchargeable ici et vous pouvez voir le résultat ci-dessous :

                    Install Microsoft Silverlight

                    Bookmark and Share

                    « Previous PageNext Page »