TechDays 2012, Ze End !

0

Les TechDays 2012 sont terminés depuis 3 semaines, retour à la réalité. Nous sommes la veille d’une déferlante de beta sauce Microsoft (VS11, Win8, .NET 4.5 …), il est temps de faire le point.

J’ai eu le plaisir et la chance d’animer 2 sessions :

Des jeux et du fun

Jeux multi-écrans : envolez-vous avec Kinect, Silverlight et WP7

Fun et jeux au rendez-vous, So@t a animé son stand cette année avec 2 jeux collaboratifs multi-écrans : SoNuts et SoTank.

- SoNuts : envoyez un écureuil dans les airs à l’aide de votre Windows Phone, puis battez des bras devant Kinect pour le maintenir en l’air le plus longtemps possible.

- SoTanks : pilotez le tank avec l’accéléromètre du téléphone, et dirigez la tourelle avec Kinect pour détruire les cibles adverses.

Ces jeux ont été développés par l’équipe de choc des SoatExperts (dont je fais parti =)) ! Gros débutants dans le domaine des jeux vidéo, on s’est joyeusement lancé dans l’aventure pour un résultat au-delà de nos attentes. C’était vraiment une expérience enrichissante qui nous a permis de tirer parti de plusieurs frameworks. La session – co-animée avec mes chers collègues Nathanaël Marchand et Nathalie Pettier - a été l’occasion de faire un retour d’expérience et d’expliquer les mécaniques et architectures des jeux.

Le moins qu’on puisse dire, c’est qu’on s’est bien amusé ! Pour preuve, vous pouvez retrouver les photos des vaillants joueurs ayant bravé les cieux et détruit les tanks envahisseurs.

Du Windows Phone et des trucs

La dure lutte du développeur : 10 trucs pratiques pour une application mobile bien léchée

J’ai eu le plaisir d’animer cette session Microsoft avec David Poulin (So@t) et Julien Corioland (Infinite Square). Nous avons passé en revue les choses essentielles à ne pas oublier dans le développement d’une application Windows Phone. Ce qui sépare la « bonne » application de la « très bonne » tient à rien du tout. La bataille est dure, mais ce sera pour le plaisir des utilisateurs, et votre plaisir !

Je me suis amusé à développer une animation de type « continuum effect », packagé au format behavior. J’écrirai prochainement quelques articles pour détailler le processus, les astuces et autres pièges, alors stay tuned :)

Je vous conseille vivement de jeter un coup d’oeil au code source de l’application démo MyStore. Nous avons développé une application réelle et complète, regorgeant de fonctionnalités en tout genre (background agent, push, chargement de données, gestion des erreurs, gestion des états, etc.). Le tout est accompagné d’un framework regroupant quelques outils utiles et réutilisables.

 

Les webcasts des différentes sessions seront disponibles prochainement (probablement courant mars).

[WP7] Trucs & astuces : Restrictions et désactivations des Background Agents

0

Développer des Background Agents amène son lot de contraintes. Quelques limitations sont parfois méconnues ou vite oubliées, il est bon de les rappeler :)

Restrictions

De nombreuses restrictions s’appliquent aux Background Agents, en voici un résumé :

Les PeriodicTask, utilisées pour des actions périodiques à durée limitée :

  • Intervalle de 30 minutes (minimum, le lancement peut être retardé)
  • Exécution pendant 25 secondes
  • Désactivé par l’économiseur de batterie
  • Limite du nombre d’agents par téléphone (peut tomber à 6 pour certains appareils)

Les ResourceIntensiveTask, utilisées pour de lourdes tâches monopolisant plus de ressources, comme du téléchargement :

  • Durée de 10 minutes maximum
  • Alimentation externe requise
  • Connexion via WiFi ou PC
  • Batterie 90% ou plus
  • Ecran verrouillé
  • Aucun appel téléphonique en cours
Le détail est bien documenté sur msdn. Ceci étant dit, certaines restrictions se veulent plus fourbes …!

Désactivation des tâches en arrière-plan

Un utilisateur peut désactiver les tâches depuis les paramètres du téléphone. Ca se traduit par l’impossibilité d’ajouter sa tâche au ScheduledActionService.

Ca paraît anodin, mais oublier cette particularité peut faire planter une application dès le démarrage.

La solution :

PeriodicTask periodicTask = new PeriodicTask("MyPeriodicTask");
periodicTask.Description = "Ma tâche périodique";

// On catche l'exception lors de l'ajout au service
try
{
  ScheduledActionService.Add(periodicTask);
}
catch (InvalidOperationException exception)
{
  if (exception.Message.Contains("BNS Error: The action is disabled"))
  {
    MessageBox.Show("Les tâches en arrière-plan ont été désactivée pour cette application");
  }
}

Le lien utile : Background Agents & bonnes pratiques.

Désactivation après 2 semaines

On peut spécifier une date d’expiration (ExpirationTime) à l’ajout d’une tâche. Il faut savoir que la valeur par défaut est 14 jours.

Donc un nouvel agent fraîchement ajouté se coupera tout seul au bout de 2 semaines, si on ne le réactive pas avant. Le système a été conçu ainsi pour éviter qu’une application qui n’est plus utilisée mange des ressources pour rien. C’est effectivement justifié :)

La solution : rajouter l’agent à chaque démarrage de l’application.

Expérience utilisateur

Qui dit agent dit souvent mise à jour de tile. Attention à la synchro entre les informations de la live tile et celles de l’application ! Il ne faut pas hésiter à déclencher la mise à jour des informations dans l’application directement (à son lancement par ex.).

Par exemple, si vous affichez sur la tile un compteur de flux non lus, il faut penser à mettre ce compteur à 0 lorsque l’utilisateur va effectivement voir ces flux.

Il n’y a rien de plus pénible que d’avoir une live tile affichant des données erronées. L’utilisateur le remarquera, et ça fait toujours du tort à l’application.

[WP7] Quoties, agrégateur de citations pour Windows Phone

0

Quoties

Après quelques mois de développement et de peaufinage, voici venir ma 1ère application Windows Phone : Quoties.

Si vous avez des suggestions (ajout de flux, de fonctionnalités ou autre), n’hésitez pas à me contacter ! :)


Description

Retrouvez toutes vos citations préférées au sein d’une seule application.

Au programme, plus d’une dizaine de sources françaises :
- Vie De Merde
- Dans Ton Chat
- webAgencyFAIL
- Chuck Norris Facts
- BashTweet
- PEBKAC
- La Punaise
- Mon Pire Coup
- Expressions à la Con
- Perles de Profs
- Wiki Pourri
- etc.

Profitez de nombreuses fonctionnalités :
- Consultation des dernières citations ou en mode aléatoire
- Mode hors ligne pour lire les citations même sans connexion
- Copie ou partage via mail ou réseaux sociaux
- Personnalisation de la liste des sources

Screenshots & Vidéo






Liens utiles

Page de présentation

Télécharger Quoties pour Windows Phone 7

Télécharger Quoties pour Windows Phone 7

[Communauté] Silverlight France

0

C’est dans 1 mois les enfants … dans 1 mois ! Que c’est excitant, l’aventure Silverlight France débute réellement avec un lancement programmé le (alors … on est le 26 septembre, si j’ajoute 1 mois ça fait …) 26 octobre 2011 !

Au début du commencement

SL France, c’est avant tout une bande de passionnés qui voulait construire une communauté autour de leur techno préférée. C’est ainsi que depuis quelques mois, Nathanaël Marchand,  Aymeric Lagier, Christophe Argento, Kévin Alexandre et moi-même travaillons sur le sujet, pour montrer au monde entier la puissance de la lumière d’argent.

La communauté a tout d’abord pris la forme d’un groupe Facebook, lançant les principes de base de partage et échange autour de Silverlight. Comme ce n’était pas suffisant, nous sommes passés à la vitesse supérieure …

Un site pour les réunir tous et dans Silverlight les lier

Une communauté pour échanger, c’est bien, avec de bons outils, c’est mieux (Facebook ça va un temps) …

C’est dans nos marmites secrètes que nous vous concoctons quelques mets exquis : un site web hébergeant du contenu exclusif (articles techniques, tutoriels, applications de démonstration, etc.). Il y en aura pour tous les goûts, des mangeurs confirmés aux débutants.

Le site ne s’arrêtera pas là et aggrègera également des articles externes, en prenant soin de les classer par thème, difficulté et sujets, afin de rendre le contenu interne ou externe accessible à tous le plus simplement possible.

Après-midi de lancement du site

Il fallait marquer le coup, et pour l’occasion, avec l’aide de Microsoft, nous organisons un après-midi de folie (rien que ça) centré sur Silverlight uniquement. Que du bonheur à venir :)

Au programme :

Présentation de la communauté

Pourquoi réunir les gens ? Que pouvons-nous échanger, comment, où, pourquoi ? Tant de questions … Ce sera le moment d’y répondre en vous exposant notre vision de la communauté, et comment vous pouvez y participer. Ben oui, une communauté sans personne, c’est complètement inutile, on a besoin de monde pour la faire vivre, et on compte sur vous !

Nouveautés Silverlight 5

par David Catuhe (Microsoft France), Nathanael Marchand (So@t) & Cyril Cathala (So@t) aka moi :)

Une über session de découverte des nouveautés introduites dans cette nouvelle version, qui vient enrichir et améliorer nos développements, et inclue un moteur 3D basé sur XNA pour passer à la dimension supérieure !

Rx Framework

par Aymeric Lagier (SUPINFO/MSP Expert Silverlight), Christophe Argento (Ineat Conseil) et Kévin Alexandre (Wygwam)

Manipulez le temps à votre guise, grâce à la puissance d’une library qui vous veut du bien et qui vous simplifiera probablement la vie.

Communication en Silverlight

par John Thiriet (MCNext) et Matthieu Mezil (Infinite Square/MVP)

Silverlight offre différents scénarios d’accès aux données que nous passerons en revue : polling, browser/client stack, nouveautés SL5…

Retours d’expérience sur MVVM

par Stéphanie Hertrich (Microsoft France) et Jonathan Antoine (Inifite Square/MVP)

Session spéciale, interactive et inédite, une première mondiale messieurs dames ! Nous discuterons de MVVM, comment il améliore la vie de chacun, les problèmes qu’il apporte, les frameworks du marché et autres joyeusetés …

Notez vite dans vos agendas !

Quoi ?
Lancement de la Communauté Silverlight France

Quand ?
26 octobre 2011 de 14h00 à 18h00

Où ?
Campus Microsoft France
41 Quai du Président Roosevelt
Issy-les-Moulineaux, France

L’entrée est libre et gratuite, alors venez nombreux ! Vous pouvez par ailleurs vous inscrire à l’évènement Facebook, ça nous aidera à gérer la logistique :)

Ca sert à rien de toute façon, Silverlight est mort !

Je ne vais pas m’étendre sur le sujet, de nombreux très bons articles le font déjà pour moi :
En résumé et complètement en vrac :

Des compétences réutilisables

    • Windows 8 proposera effectivement une nouvelle interface avant tout dédiée au tactile. Ce sera un nouveau point d’entrée à des applications estampillées XAML + C# (entre autres). Ca tombe plutôt bien, ce sont les armes préférées des développeurs Silverlight !
    • XAML ! XAML ! XAML ! Microsoft continue d’investir pour sûr dans ce langage déclaratif, le pratiquer est donc bon pour la santé et un bon acquis pour l’avenir :)
    • Silverlight for Windows Phone reste le langage privilégié des applications Windows Phone 7.

Windows 8, les entreprises et les Metro Apps

    • Le mode « desktop » existera toujours, et de ce point de vue, aucune différence avec Windows 7 ou Windows XP. 
    • Toutes les entreprises ne sont pas prêtes à passer à Windows 8 …
    • … et les « Metro Apps » ne vont pas remplacer les applications de gestion (line-of-business aka LOB), le domaine de prédilection de SL.

Le futur

    • Aucune annonce n’indique que Silverlight 6 ne verra jamais le jour. Et même si c’était le cas, la version 5 est suffisamment complète pour répondre à un large panel de scénarios.
Alors signer la mort de Silverlight me paraît largement prématuré, la technologie a encore de belles années devant elle, que ce soit dans les entreprises ou les media.

Aller plus loin

La communauté ne se résumera pas à un site web. Ce sera évidemment l’endroit privilégié pour y déposer nos connaissances et les partager, mais de nombreux évènements restent à prévoir : d’autres après-midi, des afterworks, des tables rondes, et plus encore …!

[Silverlight] Binder sur le ViewModel depuis un DataTemplate

6

Lorsqu’on implémente du MVVM, on se retrouve rapidement face à certains scenarios rendant le ViewModel (= DataContext) difficile d’accès. Pas de panique, voyons comment contourner ces quelques difficultés simplement.

Cas simple : DataTemplate

Pour rappel, les contrôles affichant une liste d’éléments (ex.: ListBox, ComboBox, etc.) exposent généralement une propriété ItemTemplate, permettant de modifier l’apparence de chaque élément de la liste. Prenons un exemple simple :

public class MyViewModel
{
    public ObservableCollection<User> Users { get; set; }

    public ICommand ClickCommand { get; set; }
}
<UserControl>
  <UserControl.Resources>
    <local:MyViewModel />
  </UserControl.Resources>

  <Grid x:Name="LayoutRoot">
    <ItemsControl ItemsSource="{Binding Users}">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
           <StackPanel>
             <TextBlock Text="{Binding Prenom}" />
             <Button Content="Clique-moi !"
                     Command="{Binding ClickCommand}" />
           <StackPanel>
        </DateTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
  </Grid>

</UserControl>

L’ItemsControl va itérer sur chaque élément de Users et produire le visuel déterminé dans l’ItemTemplate. Dans cet exemple, on affiche 2 éléments :

  • Un TextBlock bindé sur la propriété Prenom de l’objet courant
  • Un button bindé sur une commande

Le soucis provient du DataContext du DataTemplate qui correspond à l’élément sur lequel on itère, et non notre « ViewModel ». Si on traduit le résultat des bindings en bon vieux C#, ça donnerait :

foreach (var user in Users)
{
   TextBlock.Text = user.Name;
   Button.Command = user.ClickCommand;
}

Ce n’est pas exactement ce qu’on veut, étant donné que la propriété ClickCommand provient du ViewModel. Il faudrait en fait changer la source du binding, pour viser le contexte extérieur au DataTemplate.

Heureusement, depuis Silverlight 3, la résolution est plutôt simple. On va simplement changer la source du binding en pointant vers un autre élément de l’UI à l’aide de la propriété ElementName :

<Grid x:Name="LayoutRoot">
  <ItemsControl ItemsSource="{Binding Users}">
    <ItemsControl.ItemTemplate>
      <DataTemplate>
         <StackPanel>
           <TextBlock Text="{Binding Prenom}" />
           <Button Content="Clique-moi !"
                   Command="{Binding DataContext.ClickCommand, ElementName=LayoutRoot}" />
         <StackPanel>
      </DateTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</Grid>

Et voilà, par le biais du DataContext du LayoutRoot, on accède à la propriété ClickCommand du ViewModel.

Plus complexe : la DataGrid

Ok, c’était le cas simple. Cette fois, on s’attaque à la DataGrid.

<sdk:DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False">
   <sdk:DataGrid.Columns>
     <sdk:DataGridTemplateColumn>
       <sdk:DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
              <ComboBox ItemsSource="{Binding DataContext.Users, ElementName=LayoutRoot}"/>
          </DataTemplate>
       </sdk:DataGridTemplateColumn.CellTemplate>
     </sdk:DataGridTemplateColumn>
   </sdk:DataGrid.Columns>
</sdk:DataGrid>

Allez, varions les plaisirs pour ce nouvel exemple, cette fois on veut accéder à une liste définie dans mon ViewModel, depuis une cellule de DataGrid. Tout fier de moi, j’ai directement appliqué l’astuce de l’ElementName … argh, ça ne fonctionne pas !

Pourquoi tant de haine ? L’ElementName équivaut à un FindName et recherche donc un élément dans l’arborescence visuelle. Or, les DataGridColumns n’existent pas dans l’arborescence visuelle …

L’astuce : le seul moyen de modifier la source du binding est de passer par une ressource. On va s’aider d’une classe intermédiaire qui fera le pont vers le ViewModel :

public class DataContextProxy : DependencyObject
{
    public static readonly DependencyProperty SourceProperty =
        DependencyProperty.Register(
            "Source",
            typeof(object),
            typeof(DataContextProxy),
            new PropertyMetadata(null));

    public object Source
    {
        get { return GetValue(SourceProperty); }
        set { SetValue(SourceProperty, value); }
    }
}

Comment l’utiliser ?

<UserControl>
  <UserControl.Resources>
    <local:DataContextProxy x:Key="DataProxy" Source="{Binding}"/>
  </UserControl.Resources>
  <sdk:DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False">
     <sdk:DataGrid.Columns>
        <sdk:DataGridTemplateColumn>
            <sdk:DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                  <ComboBox ItemsSource="{Binding Source.Users, Source={StaticResource DataProxy}}"/>
               </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>
        </sdk:DataGridTemplateColumn>
     </sdk:DataGrid.Columns>
  </sdk:DataGrid>
</UserControl>

Par étape :

  1. Ajout du DataContextProxy aux ressources courantes, et on notera bien le Source= »{Binding} » signifiant qu’on binde sur le DataContext courant (=ViewModel)
  2. Changement de la Source du binding pour pointer sur le proxy : Source={StaticResource DataProxy}
  3. Modification du Path : {Binding Path=Source.Users}

Et le tour est joué !

Le roi du binding

Avec ces deux méthodes, vous voilà parés à toutes les situations de binding tortueux du DataContext.

[WP7] LongListSelector et LayoutCycleException

0

L’histoire

Récemment, j’ai eu la bonne idée de vouloir remplacer un « pauvre » ItemsControl par un LongListSelector du Silverlight Toolkit dans mon application WP7.

J’ai changé ça :

[sourcecode language="XML"]

<ScrollViewer>
<ItemsControl ItemsSource="{Binding Settings}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}"
Margin="10,0,0,0"
VerticalAlignment="Center"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>

[/sourcecode]

… en ça :

[sourcecode language="XML"]

<ScrollViewer>
<toolkit:LongListSelector ItemsSource="{Binding Settings}">
<toolkit:LongListSelector.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}"
Margin="10,0,0,0"
VerticalAlignment="Center"/>
</DataTemplate>
</toolkit:LongListSelector.ItemTemplate>
</toolkit:LongListSelector>
</ScrollViewer>

[/sourcecode]

Ca paraît simple pourtant, non ? Que nenni !

Je lance mon émulateur, et là ô surprise, dès que je scroll tout en bas de ma liste, paf ! Sans faire de Chocapic, je me retrouve avec ça :

« Layout cycle detected. Layout could not complete. » Au secours, que se passe-t-il ?

La solution

Il s’avère que le ScrollViewer vient embrouiller le LongListSelector.

Le LongListSelector intègre une gestion spécifique de la virtualisation, sans ScrollViewer de base. Du coup, il gère le scrolling et ViewPort en interne, ça se voit notamment à l’effet de rebond en début et fin de liste, qui n’est pas exactement le même que d’habitude. Du coup, le ScrollViewer semble perturber le calcul de la zone à afficher, ce qui fait partir le LongListSelector dans une boucle infinie en fin de scroll.

En bref, la solution est simple : il ne faut jamais encadrer un LongListSelector par un ScrollViewer ! Ca peut paraître simple vu comme ça, mais dans un fouilli de XAML plus complexe, ça peut faire tourner en rond quelques heures (cycle, tourner en rond… merci public :) ).

HappyNet – Application de référence en Silverlight

0

Vous trouviez que Silverlight manquait d’exemples concrets, de vraies applications open-source incluant les dernières bonnes pratiques à la mode ?

Quelle chance ! J’ai l’application Silverlight qu’il vous faut :

>>> http://happynet.codeplex.com <<<

HappyQuoi ?

So@t a animé une session durant les TechDays 2010 (1 an déjà …) qui faisait un retour d’expérience sur Silverlight, en tâchant de répondre à une simple question : “Comment utiliser Silverlight en conditions réelles ?”.

Pour illustrer les propos, j’ai eu l’occasion de développer une application de référence en Silverlight, j’ai nommé : HappyNet (ça c’est un nom qui en jette) !

Kézako ?

HappyNet est un projet regroupant quelques « bonnes pratiques » (je parle surtout des miennes) et montre comment construire une base de site web de type e-commerce.

Pour quoi faire ?

L’application compile un certain nombre de problèmes rencontrés lors de mon expérience, et montre une façon de les résoudre.

Le principe est de répondre à quelques questions et besoins fréquents du web, saupoudré de quelques astuces exclusives !

Et côté technique ?

L’application est full Silverlight, basée sur une architecture solide et s’appuie sur la base de données AdventureWorks2008.

De nombreux sujets y sont abordés, dont notamment des notions d’architecture (Prism & MVVM), de communication (WCF), d’ORM (Entity Framework, Enterprise Library), d’authentification, de localisation, de référencement, etc.

Bref, il s’agit globalement de points classiques du monde du web, et pourtant parfois peu maîtrisés ou mal documentés en Silverlight.

Sujets abordés

Le projet est accompagné d’une documentation complète répondant à de nombreuses problématiques, dont voici un aperçu :

  • Architecture (code et applicatif)
  • MVVM : Rappels
  • Points techniques
    • PRISM & Navigation Framework
    • Web services
    • Localisation
    • Authentification
    • Logging
    • Web Analytics
    • Référencement
    • Fuites mémoire
    • Autres scénarios
      • Binding dans un DataTemplate
      • Binding & DataGrid (Headers, CellTemplate)
      • Changer d’ancre sans naviguer
      • Traiter uniquement le dernier appel à un web service
      • Texte sélectionnable
  • Conseils & Bonnes pratiques
    • Snippets / Templates
    • IsHitTestVisible
    • MetalScroll
    • SplashScreen

Le mot de la fin

HappyNet vient en aide au développement. Ce n’est pour l’instant pas la base d’exercices de formation. Le projet vient surtout combler le manque d’exemple concret dans la communauté Silverlight. En ce sens, j’espère que cela vous sera utile !

(J’assume complètement le caractère publicitaire de ce billet :)

C’est parti !

0

Il est toujours difficile de savoir par quoi démarrer … le commencement paraît être un bon début d’amorce, non ? :)

Faisons simple : bienvenue !

Go to Top