WPF, MVVM, MediaElement et Slider

Récemment à l’ecole, on nous a demandé deveopper un Windows Media Player 2.0 qui doit gérer une bibliothèque de musique de vidéos et d’image.

Mon groupe et moi même, avons donc choisi de faire une architecture en MVVM et d’utiliser un mediaElement pour la lecture de ses différents fichiers.

Sauf que très vite, je me suis rendu compte d’un problème. La propriété Position du MediaElement n’est pas une DependencyProperty. De ce fait, impossible de faire un binding sur la position.
Apres quelques recherches sur mon moteur de recherche préféré, j’ai trouvé comment résoudre ce problème, mais seulement avec du code behind … En MVVM … Youpi …

Bref, un début de contournement aurait été :

<MediaElement Grid.Column="1" Name="MediaElem" Source="path/vers/ma/musique.mp3" />
<Slider Grid.Column="1" x:Name="SoundSlider" Minimum="0" Maximum="{Binding ElementName=MediaElem,Path=NaturalDuration.TimeSpan.TotalSeconds}"
Value="{Binding Path=Position, ElementName=MediaElem, Converter={x:Static converters:PositionToValueConverter.Instance}, Mode=TwoWay}" />

Sauf que cela pose deux problèmes. Premièrement, à la création de ma page, le média n’est pas chargé donc le maximum du Slider est égal à 0. De plus, le Slider ne se met pas à jour automatiquement.

Pas évident à traiter pour un apprenti du .NET. Donc du coup, pour vous éviter ce genre de souci, je vous propose une solution parmi tant d’autre : l’utilisation d’un behavior.

Je vois passe les formalités sur ce qu’est un behavior, son utilité et son utilisation. Mais l’idée est de faire un behavior héritant du MediaElement afin de pouvoir utiliser les contrôles associés et de pouvoir ajouter des Dependancy Property.

Ci dessous le code C# : MediaElementBehavior

    public class SliderBehavior : Behavior<MediaElement>
    {

        //une DP pour la position
        public static readonly DependencyProperty PositionProperty =
            DependencyProperty.Register("Position", typeof (TimeSpan), typeof (SliderBehavior),
                                        new PropertyMetadata((d, e) =>
                                                             ((SliderBehavior) d).PropertyChanged((TimeSpan) e.OldValue, (TimeSpan) e.NewValue)));
        // une autre pour le maximum
        public static readonly DependencyProperty MaximumProperty =
            DependencyProperty.Register("Maximum", typeof (double), typeof (SliderBehavior), new PropertyMetadata(default(double)));

        // les proprietes qui vont avec

        public double Maximum
        {
            get { return (double) GetValue(MaximumProperty); }
            set {SetValue(MaximumProperty, value);}
        }

        public TimeSpan Position
        {
            get { return (TimeSpan) GetValue(PositionProperty); }
            set
            {
                SetValue(PositionProperty, value);
            }
        }

        private readonly Timer _timer = new Timer(1000);

        public void PropertyChanged(TimeSpan oldValue, TimeSpan newValue)
        {
            AssociatedObject.Position = newValue;
        }

        //Quand le behavior est utilise, on initialise tout.

        protected override void OnAttached()
        {
            base.OnAttached();
            _timer.AutoReset = true;
            _timer.Elapsed += _timer_Elapsed;
            Position = AssociatedObject.Position;
            AssociatedObject.MediaOpened += MediaOpened;
            _timer.Start();
        }

        private void MediaOpened(object sender, RoutedEventArgs e)
        {
            Maximum = AssociatedObject.NaturalDuration.TimeSpan.TotalSeconds;
        }

        private void DispatcherTimerResync()
        {
            Position = AssociatedObject.Position;
        }

        //on utilise un timer pour changer la position toute les secondes.
        void _timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            Dispatcher.Invoke(new Action(DispatcherTimerResync));
        }

        protected override void OnDetaching()
        {
            _timer.Stop();
            _timer.Elapsed -= _timer_Elapsed;
            base.OnDetaching();
        }
    }

Rien de techniquement compliqué là dedans, mis à part la declaration de la DP (sans doute ce qui m’as pris le plus de temps). On déclare un behavior qui herite de MediaElement, et deux Dependency Property qui nous interressent.

Enfin, le Code XAML :

<MediaElement Grid.Column="1" Name="MediaElem" Source="D:\Musique\Musique\Eluveitie\2012 - Helvetios\14 - Alesia.mp3">
                <i:Interaction.Behaviors>
                    <behaviors:SliderBehavior x:Name="sliderDP"/>
                </i:Interaction.Behaviors>
</MediaElement>
<Slider Grid.Row="1" x:Name="SoundSlider" Minimum="0"
                Maximum="{Binding ElementName=sliderDP, Path=Maximum}"
                VerticalAlignment="Center"
                Value="{Binding Path=Position, ElementName=sliderDP, Converter={x:Static converters:PositionToValueConverter.Instance}, Mode=TwoWay}" />

Vous remarquerez que cette fois, je n’effectue plus mon binding sur le MediaElement mais sur le Behavior.

Désormais, le MediaElement en MVVM ne devrai plus être un problème :)

La MUG Lyon dissèque Kinect

Le 26 janvier dernier, j’ai organisé une conférence sur Kinect en partenariat avec le MUG (Microsoft User Group de Lyon).
Le MUG a pour but de réunir les passionnés des technologies Microsoft tous les quatrièmes jeudi du mois autour d’un thème particulier. Chaque réunion s’articule autour d’une présentation technique par des experts. C’est l’occasion pour chacun de débattre d’échanger, et d’entretenir sa veille sur un thème passionnant et innovant.

En une demi-heure, j’ai présenté au MUG le SDK Kinect et comment il était possible de développer des applications pour Kinect.

Vous pouvez revoir la conférence avec le lien ci dessous :

On en parle :

Migrer vos applications Kinect

Je vous le disais il y a 15 jours, Kinect For Windows est sortie. Maintenant le plus difficile reste à venir puisqu’il vous faut migrer vos applications du SDK bêta 2 vers le SDK final. Pour cela il faut faire face à l’important refactoring fait par Microsoft Research.

Pour vous aider dans  travail fastidieux, Rob Releyea a écrit un article sur les différences entre les 2 SDKs. Vous pouvez voir cet article ici !

Si vous n’avez pas trouvé votre bonheur, il vous reste toujours la documentation du SDK et le README qui se trouve dans le dossier “Documentation” du dossier d’installation de Kinect.

Bon courage !

Kinect for Windows est disponible

Ça y’est, l’info est tombée il y a quelques minutes sur le blog de Kinect for Windows, la nouvelle caméra ainsi que le SDK 1.0 sont désormais disponibles.

Vous pourrez télécharger le SDK ici et acheter la nouvelle caméra ici.

Voici les grosses nouveautés du SDK final :

  • Vous pouvez faire des applications avec Kinect et les vendre.
  • Meilleure synchronisation des évènements grâce à un nouvel évènement “AllFrameReady”.
  • Le tracking du squelette a été amelioré.
  • L’integration de Microsoft Speech au SDK permet de faciliter la reconnaissance vocale
  • l’API a été revue afin de corriger des incompatibilités entre Frameworks et pour une plus grande aisance de développement.
  • Des nouvelles méthodes de mapping entre les différentes stream.
Quant à la nouvelle Kinect :
  • Détecte les objets qui se trouve ente 40 centimètres et 3 mètres de la caméra sans perte de précision.
  • Un câble moins grand
  • Une garantie d’un an.
Elle est disponible au prix de 250$ et 150$ pour une utilisation éducative.

Des achievements dans Visual Studio

Je suis un fidèle lecteur du blog Channel9, et quand j’ai vu qu’il parlait d’achievements dans Visual Studio, j’ai directement cliqué sur l’article.

Pour résumer, avec  Visual Studio Achievements Extension, vous pouvez unlock des achievements en fonction de votre activité : votre code est analysé dans un nouveau thread à chaque fois que vous compilez et en fonction des actions que vous faites dans Visual Studio.

Quand vous unlockez un achievement, une Pop-Up s’affiche :

En plus de cela, votre compte channel9 se met a jour et vous pouvez partager ce nouvel achievement sur les réseaux sociaux.

Quelques exemples :

  • Regional Manager : avoir plus de 10 regions dans une classe.
  • Close To The Metal : utiliser 5 directives preprocesseur differentes.
  • Interrupting Cow : avoir 10 breakpoints dans un seul fichier
Les 32 achievements sont tous listés ici.
Maintenant, c’est le moment de lancer un concours au boulot !

Kinect for Windows arrive le 1er Février 2012

Bon je n’avais pas prévu de faire un article aujourd’hui. Il faut dire que Free a captivé toute mon attention … Non je rigole… Je m’en fous complètement de leur nouveau forfait comme de ma première paire de chaussette… Bref, je m’égare ! Donc je vous disais, je n’avais pas prévu de faire d’article, parce que … euh … j’ai oublié pourquoi … mais là, c’est un cas de force majeur !

L’info a été postée sur le blog de KinectForWindows et sur le blog de Channel9. Les deux posts étant relativement longs, je vous propose un petit résumé de ce qu’il faut retenir.

  1. La caméra Kinect pour Windows sera disponible le 1er février prochain dans 12 pays dont la France au tarif de 249$ US.
  2. La caméra sera disponible en quantité limités dans un premier temps par le biais de vendeurs et distributeurs. Dans l’année, Microsoft fera des prix spéciaux pour les écoles et universités (il est prévu 149 $ US).
  3. Avec Kinect for Windows, Microsoft investi dans une nouvelle plateforme qui sort du salon pour s’installer sur les bureaux. Cette nouvelle version va ajouter un support des gestes et de la voix ainsi qu’une amélioration de la capture des différents points clés.
  4. Le SDK restera gratuit pour les développeurs et les utilisateurs finaux.
  5. Microsoft encourage tous les développeurs à prendre en main les nouvelles fonctionnalités disponibles avec cette nouvelle caméra et SDK. Le nouveau SDK et la Kinect pour Xbox360 seront compatibles, mais les applications utilisant cette dernière ne pourront pas faire l’objet d’une utilisation commerciale.
  6. La licence du SDK bêta a été étendue de 3 ans afin de pouvoir continuer à développer avec la caméra pour Xbox. Elle prendra fin le 16 juin 2016.

Vous pouvez dès maintenant pré-commander Kinect For Windows sur Amazon.

ReSharper 6.1 : Une mise à jour gratuite

Il y a quelques temps, je vous parlais de ReSharper. Cet outil développé par la société JetBrains est un add-on pour Visual Studio, et permet de coder plus rapidement en automatisant des tâches.

Le 27 décembre dernier, JetBrains a publié sur son site une mise à jour gratuite de ReSharper qui ajoute de nombreuses options à l’intellisense (source).

Pour les allergiques a l’anglais, voici une traduction (je traduirai pas tout hein ! :p)

ReSharper 6.1 ajoute un meilleur contrôle sur l’intellisense.

Comme le montre cette capture d’écran, en plus des deux anciennes options, il est possible de selectionner sur quelles technologies appliquer l’intellisense. Il est important de préciser qu’en désactivant l’intellisense ReSharper sur une technologie, l’intellisense de Visual Studio reste activé.

Malheureusement, je ne peux pas récupérer les vidéos qui sont sur le post, vous devrez donc aller finir de le lire en anglais (post original).

Les TechDays pour les étudiants.

Depuis vendredi, Mircrosoft recherche des projets étudiants utilisant Kinect à présenter aux Techdays 2012 qui se dérouleront en Février prochain.

Vous trouverez plus d’informations sur ce post ! (ça m’évite de faire une synthèse \o/)

Bonne journée.

Bien commencer sur Windows Phone 7

Le concours App’Hero est maintenant terminé. Alors, je vous propose un petit article qui citera tout les liens que j’ai utilise pour bien démarrer …

Les liens en anglais :

Les liens en français (pour les féneants) :
Voila, ça devrai vous aider un peu plus ! Bon courage

Kinect Fusion et Lightspace

Microsoft a ouvert les portes de son laboratoire situé dans la tour 99 de son campus de Redmond à un journaliste pour montrer, entre autres, une des utilisations possibles du Kinect (voir la vidéo, avec les commentaires en anglais sur le site The Verge). Ce projet de recherche a été baptisé Kinect Fusion. Les images filmées par le boîtier sont modélisées, même si une personne est présente. Tout est ensuite affiché à l’écran. Il est alors possible pour l’utilisateur d’évoluer dans un monde virtuel et d’agir par de simples mouvements sur les objets modélisés.

Cette trouvaille est une forme de réalité augmentée, un domaine en pleine essor comme en témoigne par exemple l’imagination débridée qui s’exhibe chaque année au salon Laval Virtual. Grâce à cet énième détournement de Kinect, le corps se mêle au numérique, ouvrant une infinité d’usages et d’innovations possibles. Pour le démonstrateur, Kevin Schofield de Microsoft, le Kinect peut accomplir les mêmes tâches que les outils professionnels habituels qui coûtent aux alentours de 50.000 dollars (soit près de 40.000 euros). Il ne précise pas que, tout de même, l’essentiel du travail est réalisé par le logiciel installé sur le PC.

D’ailleurs, un logiciel permettant de s’initier gratuitement à la réalité augmentée via la webcam de l’ordinateur existe déjà depuis quelques années. Il s’appelle D’Fusion et a été créé par une société française, Total Immersion. C’est également elle qui a développé le logiciel de réalité augmentée utilisé pour l’attraction des Animaux du Futur au Futuroscope de Poitiers. Ceci dit, Microsoft pousse le concept bien plus loin, avec la modélisation combinée à la capacité de Kinect à détecter les couleurs et la profondeur de champ.

Il faut dire que le capteur de mouvements Kinect est toujours au centre des préoccupations de Microsoft. Face aux multiples détournements qui ont fleuri après la commercialisation de ce boîtier, Microsoft avait tacitement autorisé les développeurs à continuer sur leur lancée et à créer le maximum d’applications pour cet accessoire de jeu, prévu à l’origine pour la console XBox 360. Par la suite, Microsoft a même décidé d’accélérer le mouvement en créant un concours, le Kinect Accelerator.

Autre innovation : le projet Lightspace. Le dispositif, complexe et encombrant, se compose d’un ensemble de caméras et de projecteurs. Des images sont projetées sur une surface de travail quelconque. Une simple table suffit. Quand un utilisateur manipule les images, pour les repositionner ou les redimensionner, les caméras analysent les déplacements pour ensuite les restituer. Le concept, finalement, évoque Surface, du même Microsoft, cet écran tactile géant et horizontal, servant à travailler à plusieurs. L’idée du bureau dématérialisé elle-même n’est pas nouvelle. En 1991, en effet, Pierre Wellner, à l’Europarc de Cambridge, au Royaume-Uni (émanation du Parc, le Palo Alto Research Center de Xerox), la concrétisait dans un prototype baptisé Digital Desk.

L’innovation nous rapproche encore un peu plus du film de science-fictionMinority Report, qui montre Tom Cruise déplaçant des éléments à la main sur un écran holographique. Pour le moment, Lightspace, avec tous ses éléments à accrocher un peu partout dans la pièce, semble difficilement adaptable dans n’importe quel appartement… Mais c’est en cherchant que l’on finit par trouver !