Easy Shopping disponible !

by Nicolas Calvi 27. juin 2012 10:25

Je viens de publier sur le Marketplace Windows Phone 7, une application de liste de course nommé Easy Shopping. J'ai réalisé cette application avec une autre MVP Surface et Designer Industriel à savoir Johanna Rowe. Nous avons créé cette application tout d'abord pour répondre à un besoin personnel, en effet nous n'avions pas trouvé d'application de liste de course qui nous satisfasse. Du coup, autant développer la nôtre !

Nous l'avons réalisée avec la même rigueur et le même processus de développement que nous utilisons en entreprise pour développer des applications NUI. Le focus a été mis sur la simplicité et l'expérience utilisateur. Nous n'avons par exemple pas mis de lecteur de code barre, car nous pensons qu'une liste de course se fait avant les courses et pas pendant, nous n'avons donc pas les codes barre sous la main.

Nous avons aussi ajouté une fonctionnalité qui nous parait intéressante, à savoir le fait de créer des recettes (avec une liste d'ingrédient) et de pouvoir d'un touch l'importer dans sa liste courante. On peut aussi sauvegarder une liste de course pour la réimporter par la suite, très utiles si on a des récurrences dans la saisie. 

Je vous invite donc à la télécharger, elle est gratuite et n'hésitez pas à me faire des retours !

MIX11 : Quelques retours

by Nicolas Calvi 21. avril 2011 18:22

Je reviens du MIX 2011 ou j'ai pu y voir de nombreuse choses très intéressantes, je vous propose des petits résumés des sessions que j'ai appréciés avec le lien vers la webcast.

A Whole NUI World : Microsoft Surface 2 and Windows Touch (Par Johanna Rowe) - DVC07

Une Interface Utilisateur Naturelle n’est pas une technologie. Le touch n’est pas une NUI mais c’est le fait d’appliquer une technologie aux besoins d’un utilisateur en prenant en compte cet utilisateur dans la globalité (âge, connaissance des nouvelles techno etc.) qui va rendre une interface « naturelle » ou pas. C’est ainsi que Luis Cabrera voit les NUI. Parlons maintenant de Surface V2, comme vous le savez peut-être déjà, elle peut être utilisée à l’horizontal, à la verticale, à 45° etc. A ce propos, Luis reviens sur l’importance de bien comprendre qu’une application réalisée pour une utilisation horizontale ne peut pas être transposée à la verticale sans être repensée. La raison en est que chaque différente orientation de la table implique des utilisations différentes dans des contextes bien distincts et donc, des expériences différentes. Un exemple énoncé par Luis : si on essaie de porter une application pensée à 360°, comment va réagir l’utilisateur une fois la table à la verticale ? Il devra mettre sa tête en bas pour pouvoir continuer à utiliser toutes les features de l’application… Côté technique, Luis a présente la nouvelle version du SDK. Elle apporte une boite à outils beaucoup plus complète et plus simple à utiliser que le simulateur de la V1. Elle permet, par exemple, de manipuler plusieurs contacts en même temps. Enfin, l’équipe Surface a préparé un outil de migration de la V1 à la V2. Lorsque cet outil n’est pas suffisant, il faudra se reporter aux guides de migrations Surface.

Get ready for fast application Switching in Windows Phone - DVC09

Dans cette session, on nous a présenté la nouvelle façon dont Mango va gérer le Tombstoning, à savoir le rechargement d’une application après l’avoir désactivée.
Actuellement, si on change d’application ou si on revient au menu, le Framework lance un « NavigateFrom » puis lève un événement « Desactivated » et on a quelques secondes pour persister l’état de notre application avant qu’elle ne soit tuée. Ensuite, au moment de la réactivation, l’événement « Activated » est levé, puis « NavigateTo » et c’est à nous de repositionner l’état de notre application.
Dans Mango cela va changer. En fait, Mango va faire un snapshot de tous les états de notre applications et va le restaurer ensuite en l’état. Nous n’avons donc rien à faire pour récupérer l’état de note application.
Il en va de même des connections que nous avons avec les Sensors : le Framework va automatiquement détacher le Sensor de notre application puis ensuite le ré-attacher, on conserve donc les accès à la caméra ou autres Sensors du WP7.
Par contre, de temps en temps, Mango fait du Tombstoning et là il faut faire comme avant. Pour savoir, au moment de la réactivation, si on est en Tombstone ou non, il faut tester la propriété « IsAppInstancePreserved », si elle est à TRUE :pas de Tombstone, FALSE sinon.
Pour résumer :

- Quand « Desactivated » : Sauvegarde de l’état (comme maintenant)
- Quand « Activated » : On restaure l’état si on est en Tombstone et on ré-attache les ressources si nécessaire

D’autres informations ont été données, comme le fait que, dans Mango, on pourra faire tourner du code en background même avec l’écran locké ou si le téléphone est en veille. Par contre, pas possible d’exécuter du code sur un Launcher / Chooser.

Building Browser Experiences with Silverlight 5 - MED10

Dans cette session, il a été question de lister les grandes nouveautés de Silverlight 5, voici les plus importantes :

- Implicit Data Template : Il est maintenant possible comme dans WPF, de définir un template par défaut pour un type de données particulier (un ViewModel par exemple) et de le placer en ressource statique, sans Key, ce style sera appliqué à tous les rendus du type donné qui lui seront associés. Par exemple dans une ListBox ou une ComboBox
- FindAncestror : Il est maintenant possible comme dans WPF, d’écrire une expression de binding qui va chercher sa source dans l’arbre Visuel parent
- Debugging XAML : Il est maintenant possible de placer des points d’arrêts sur des expressions de Binding dans le XAML. Une fois le point d’arrêt atteint, il est possible de voir le contexte courant, ainsi que beaucoup d’informations utiles
- Markup Extension : On peut désormais créer nos propres expressions pour XAML. Dans la session, une démo montrait comment on peut créer une extension « Method » qui permet, sur un événement, de binder une méthode du contexte. C’est très intéressant, car dans cet exemple cela permet de binder une méthode du ViewModel sur un event, et ainsi se passer d’une commande.
- DataContextChanged : Il y a maintenant un événement qui couvre le changement du DataContext en proposant au moment du callback, l’ancienne et la nouvelle valeur du DataContext, pratique s’il y a des traitements à faire avec l’ancienne source
- UpdateSourceTrigger : Un nouveau mot clé XAML qui permet sur un Binding de définir de quelle façon la source informe de son changement de valeur, cela permet de filtrer des notifications parasites
- Vector printing : Une nouvelle façon de rendre les textes et de les transmettre à l’imprimante, cela réduit de plus de 60% le volume de donnée à transférer à l’imprimante et accélère l’impression
- Trick Play : Maintenant quand un lecteur fait de l’avance ou du retour rapide sur une vidéo par exemple, c’est plus fluide et le son ne se coupe pas, ça fait comme si on accélérait une vidéo sur VHS :D
- RitchTextBoxFlow : Plusieurs contrôles en nom avec « Flow » permettent de rendre du texte qui s’adapte à une zone de rendu. On définit une zone rectangle (la taille du contrôle) et le texte grossi, réduit et se repositionne si ce rectangle change
- WCF RIA Services SP2 : Annonce de sa disponibilité avec la Beta de Silverlight 5, ils ont amélioré le passage de types complexes (enfin !) et c’est à peu près tout, ils ne se sont pas éternisés sur le sujet
- Binding in Style Setter : Tous est dans le titre on peut maintenant faire des expressions de Binding dans une Setter (Value) d’un Style

Voilà ce qui a été dit pendant cette session. Il y a d’autres éléments comme les API 3D notamment, donc je vous invite à télécharger Silverlight 5 Beta et à la tester.

Multitasking in the next version of Windows Phone - DVC18

Session très intéressante sur l’implémentation du Multitâche dans Mango. J’ai trouvé que cette implémentation était très intelligente, avec derrière tout ça, une philosophie.
On nous parle de « Windows Phone Harmony », à savoir le fait de créer des applications qui respectent à la fois l’expérience utilisateur mais aussi le téléphone à travers sa durée de vie avec la batterie.
Forcément quand on parle de multitâches on n’est pas à l’abri d’abus ou d’applications mal conçues qui vident la batterie. Avant de revenir sur ce point, voyons ce qu’apporte Mango en terme de Multitâches :

- Possibilité de switcher d’une application à l’autre (grâce entre autre au système de snapshot introduit dans Mango), à l’instar de l’iPhone on peut aller d’une application à l’autre en un clic
- Introduction du « Background Notification Service » qui permet de créer des événements de rappel dans le téléphone
- Introduction du « Backgound Transer Service » qui permet de télécharger des données en background et d’être notifié de son avancement et de sa fin
- Introduction du « Background Audio » qui permet de faire jouer du son même avec l’application fermée
- Introduction des « Background Agent », des services qui s’exécutent en tâche de fond et qui sont créés par les développeurs

En ce qui concerne les « Background Agent », quand on lance son application et que l’on active un agent, celui-ci sera vivant pendant 14 jours si l’utilisateur ne relance pas l’application. Si l’application n’est pas lancée d’ici 14 jours, WP7 désactive automatiquement l’agent. De plus, il existe une interface dans les paramètres qui liste tous les agents installés dans le téléphone et il est possible à l’utilisateur de les désactiver manuellement.
Avec cette politique, les agents sont contrôlés intelligemment, soit par WP7 qui désactive ceux qui ne servent plus, ou par l’utilisateur s’il estime que cet agent n’a pas lieu de persister. Je trouve que c’est une façon très intelligente d’intégrer le multitâche et qui responsabilise le programmeur sur ce qu’il fait.

Enhanced Push Notification and live Tiles for WP7 - DVC08

Dans cette session on est revenu sur les possibilités que Mango nous offre pour modifier les Tiles. Actuellement, on peut seulement modifier l’image, le titre et changer le compteur et ce uniquement par un message Push.
Aujourd’hui, Mango nous permet de le faire sans Push avec une nouvelle API locale, mais ajoute aussi une face verso au Tile. Si les deux faces du Tile sont définies, il va se retourner à intervalle régulier. Ça permet d’avoir plus d’informations sur un seul Tile.
Autre nouveauté, c’est le Deep Dive (ou Deep Toast) qui permet lorsque l’on clique sur un Toast Message ou un Tile, de naviguer vers une page particulière de son application. Cette fonctionnalité sera utile avec l’ajout de la possibilité de mettre plusieurs Tiles pour une même application. Par exemple, sur une application d’informations type BBC, on peut avoir le Tile pour lancer l’application et un autre pour la lancer et se positionner directement sur la page « information locale ». Ce mécanisme marche aussi pour les Toast Messages.
Le problème du Deep Dive c’est que la page de navigation devient la page d’accueil de l’application, or si cette page nécessite un Back par le bouton physique pour retourner à la vraie page d’accueil de l’application, elle la fera quitter. Cela demande donc une adaptation de notre code pour justement couvrir ce besoin.
Globalement, une plus grande liberté est donnée sur les Tiles et c’est une très bonne chose.

What's new for WP7 with XNA - DVC16

Il nous a été présenté dans cette session la nouvelle fonctionnalité de Mango qui permet de mettre du XNA dans une application Silverlight. J’avoue avoir été vraiment impressionné par cette fonctionnalité. L’intégration est extrêmement bien faite et ouvre des possibilités énormes.
Dans les faits, il suffit de créer une application Silverlight et sur une page mettre « SetSharedMode(true) » pour que la page passe en contexte XNA. A ce moment, on a bien un contexte XNA avec toutes les possibilités que ça offre.
Pour gérer les boucles « Update » et « Draw », il suffit d’instancier la classe « GameTimer » et de se brancher sur les deux événements en question. A ce moment, dans la callback on a accès au GraphicDevice du contexte XNA et on l’utilise normalement (SpriteBatch, etc.).
Ce qui est encore plus fort, c’est qu’il est possible de rendre une interface XAML dans ce contexte XNA. Pour cela, instancier la classe « UIElementRenderer » en lui passant le contrôle de l’arbre Visuel à partir duquel vous voulez rendre l’interface. A ce moment il vous donnera une « Texture2D » que l’on pourra utiliser dans notre contexte XNA.
Ce qui est encore plus énorme, c’est que les événements sont quand même récupérés pour l’interface Silverlight, à savoir que le bouton continue à lever le clic, les textbox à afficher le clavier virtuel, etc. Donc notre interface est rendue en XNA mais continue à fonctionner, on peut même utiliser des Storyboards sur des éléments XNA comme une caméra, des couleurs de texture. C’est réellement impressionnant.

Trucs et astuces Windows Phone 7

by Nicolas Calvi 9. août 2010 17:16

Voici mon premier article sur Windows Phone 7, je suis en train de décortiquer ce nouveau support et je vais donc maintenant vous exposer quelques fondamentaux biens utiles quand on développe sur cette plateforme.

Premièrement la navigation entre les pages de son projet. Il y a plusieurs façons de faire, je vais vous présenter celles qui seront les plus couramment utilisées.

Classe NavigationService

Dans les pages héritées de PhoneApplicationPage, il existe une propriété NavigationService qui permet de gérer cette transition à partir de la page courante et donc de conserver un historique de navigation. Dans le code behind de toute page, vous pouvez faire appel à la fonction Navigate(Uri) qui permet de passer à la page suivante.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
  public class MaPageWP7: PhoneApplicationPage
  {
    // Constructeur de la page
    public MaPageWP7()
    {
      // Appel a la fonction NavigationService.Navigate(Uri)
      this.NavigationService.Navigate(new Uri("/MonAutrePage.xaml"))
    }
  }
}

Il existe d'autres fonctions bien utiles, vous pouvez trouver le détail ici.

RootVisual et NavigationService

Si vous n'avez pas accès à votre page courante (notamment si vous êtes en MVVM) vous pouvez quand même accéder au NavigationService par le bié de la propriété Application.Current.RootVisual, qui vous donne la page en cours d'affichage. Un simple cast et un accès a sa propriété NavigationService vous permet de naviguer vers une autre page.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
  public class UneClasse
  {
    // Constructeur de la page
    public UneClasse()
    {
      // Navigation a partir du RootVisual
      PhoneApplicationFrame root = Application.Current.RootVisual as PhoneApplicationFrame;

      if (root != null)
        root.Navigate(new Uri("/MonAutrePage.xaml"));
    }
  }
}

Il est a noter ici que l'on utilise les services de navigation de la Frame et non de la page, mais cela revient au même.

UriMapper

Il est possible de créer une table de navigation dans notre application Windows Phone 7, ce qui permet notamment de mieux stucturer ses Uri quand on veux faire appel au NavigationService, ou écrire les Uri dans les contrôles Silverlight a partir du XAML.
Pour utiliser cette technique il y a deux choses a faire. Premièrement, dans le fichier App.xaml, i lfaut déclarer dans la partie Resources notre table de navigation.

<Application xmlns:nav="clr-namespace:System.Windows.Navigation;assembly=Microsoft.Phone">
  <Application.Resources>
    <nav:UriMapper x:Key="MonUriMapper">
      <nav:UriMapper.UriMappings>
        <nav:UriMapping Uri="/Root" MappedUri="/Default.xaml"/>
        <nav:UriMapping Uri="/Menu" MappedUri="/MonMenu.xaml"/>
        <nav:UriMapping Uri="/Liste/{numero}" MappedUri="/MesListes/Liste{numero}.xaml"/>
        <nav:UriMapping Uri="/Liste/{numero}/{param1}" MappedUri="/MesListes/Liste{numero}.xaml?id={param1}"/>
      </nav:UriMapper.UriMappings>
    </nav:UriMapper>
  </Application.Resources>
</Application>

 

Vous remarquez que l'on peut gérer des paramètres dans la table de navigation, cela se gère comme les tables de navigation Silverlight standard, là dessus aucune surprise, Windows Phone 7 reprend les mêmes éléments qu'une application Silverlight lambda.

Dernière étape, mettre cette table de navigation en ressource par défaut dans votre application Windows Phone 7. Pour cela, allez dans le fichier App.xaml.cs et localisez le constructeur et a la fin de celui-ci ajoutez ceci.

// ...
public partial class App: Application
{
  //...
  
  public App()
  {
    // ...
    
    // Affectation de la table de navigation
    this.RootFrame.UriMapper = this.Resources["MonUriMapper"] as UriMapper;
  }
  
  //...
}

Par la suite vous pouvez donc accéder a votre table de navigation juste en indiquant l'alias (dans l'attribut Uri) dans le chemin de navigation.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
  public class MaPageWP7: PhoneApplicationPage
  {
    // Constructeur de la page
    public MaPageWP7()
    {
      // Appel a la fonction NavigationService.Navigate(Uri)
      
      this.NavigationService.Navigate(new Uri("/Liste/1/24"))
    }
  }
}

Tous ces concepts de navigation, si bien utilisées, permettent a votre application Windows Phone 7 de construire un historique de navigation et donc de permettre quand l'utilisateur clique sur le bouton Back de bien revenir sur la page précédente.

Bouton Back

Justement le bouton Back, comment intercepter son utilisation si l'on veut passer outre son fonctionnement standard. De ce coté rien de plus simple, il existe sur toutes les pages qui héritent de PhoneApplicationPage, un événement sur lequel vous pouvez vous abonner : BackKeyPress.

Il faut le faire sur chaque page de façon indépendant, ce qui permet d'exécuter du code juste avant le traitement de ce click. Si vous voulez annuler le click si le bouton Back, rien de plus simple. Dans la fonction de CallBack de l'événement il vous suffit de renseigner dans le paramètre d'argument System.ComponentModel.CancelEventArgs, la propriété Cancel et la mettre a True.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
  public class MaPageWP7: PhoneApplicationPage
  {
    // Constructeur de la page
    public MaPageWP7()
    {
      // On se branche sur l'événement
      this.BackKeyPress += new EventHandler<System.ComponentModel.CancelEventArgs>(MaFonctionDeCallBack);
    }
    
    // Fonction de CallBack
    private void MaFonctionDeCallBack(object sender, System.ComponentModel.CancelEventArgs e)
    {
      // J'annule le click
      e.Cancel= true;
    }
  }
}

Comme vous le voyez, il n'y a rien de plus simple, tout reste cohérent avec le Framework Silverlight classique.