Il y de cela quelques semaines, David Catuhe, a commencé à écrire une série d'articles, sur la manière de "Cuisiner" une application Windows 8 avec HTML 5, CSS 3 et JavaScript.
Le but étant étant de fournir une recette pragmatique pour écrire une application Windows 8 à partir de zéro.
A ça demande, je reprends son idée de l'application UrzaGatherer http://urzagatherer.codeplex.com/ (Application pour aider les collectionneurs de cartes Magic The Gathering à gérer leur collection) et vous propose une série d'articles mais cette fois-ci en .NET avec C# et en XAML. (Bien évidement vous pouvez choisir également Visual Basic .NET, ou alors de le faire en natif avec C++ et XAML).
Note : La version C# sera ISO fonctionnelle par rapport à la version HTML ni plus ni moins.
Pour développer l’application, vous allez donc avoir besoin de :
• Un ordinateur avec Windows 8 Consumer Preview installé dessus (Vous pouvez le télécharger ici: http://preview.windows.com)
• Visual Studio 11 (La version Express Beta pour Windows 8 peut être téléchargée ici: http://msdn.microsoft.com/en-us/windows/apps/br229516)
• Et c’est tout!
Note : Cet série d'articles est consacré à la manière de créer une application Windows 8 au Style Metro de bout en bout, afin que vous développeurs, vous en maitrisiez les concepts et que votre application adhère aux principes d'une application au style Metro. Pour les puristes, pas de MVVM, d'injection de contrôle et autres modèles de développement, ce n'est pas le but recherché. Mais bon vous pouvez toujours améliorer la recette en lui ajoutant une pincée de MVVM, MVMM light étant désormais disponible pour WinRT http://mvvmlight.codeplex.com/.
La solution peut-être téléchargée ici : Day0
La première chose à faire est de créer un projet vide (nous aurions bien sur pu utiliser un modèle plus complet de Visual Studio comme le ‘Grid Application"’ mais l’objectif ici est de comprendre comme tout fonctionne) en utilisant le menu Fichier/Nouveau projet
Le projet est ainsi crée avec uniquement les fichiers nécessaires
Le fichier package.appxmanifest permet de décrire votre application auprès de Windows 8. Il contient particulièrement la description de l’application ainsi que tous les logos et ressources graphiques nécessaires :
Nous allons ajouter ces ressources afin de donner tout de suite un air de “vraie application”.
Le “splash screen” par exemple est très important car c’est la première chose que vos utilisateurs vont voir et comme chacun sait la première impression est toujours la plus importante :
Cette partie est souvent la plus dure au final car les développeurs ne sont que très rarement de bons designers
La structuration va dépendre de votre manière de travailler, mais elle aide le plus souvent à s'y retrouver plus rapidement. Dans notre exemple nous avons choisi une structuration tout à fait commune.
En créant deux répertoires supplémentaire par rapport à la solution de base,
DataModel, pour le modèle de données, et Views qui contiendra les vues de l’application
La connexion aux données sera faite dans le fichier /DataModel/UrzaGathererDataSource.cs
Pour UrzaGatherer, les données sont composées de :
• Un fichier all.json qui décrit toutes les cartes supportées
• Les images de chaque carte (plus de 4Go!!)
• Un logo pour chaque extension (sachant qu’une carte appartient à une extension qui appartient à un bloc)
• Un logo pour chaque bloc
Dans un premier temps, nous allons ajouter dans le répertoire DataModel, une nouvelle classe UrzaGathererDataSource.cs
Avant d’implémenter quoi que ce soit dans cette classe, nous allons créer dans l’espace de nom UrzaGatherer.DataModel, trois autres classes JSONBlock, JSONExpansion et JSONCard, dérivant de la classe UrzaGatherer.Common.BindableBase. Cette dernière étant une classe helper, créée automatiquement par Visual Studio 11 et qui implémente INotifyPropertyChanged pour le Binding de données.
Implémentons maintenant notre classe UrzaGathererDataSource
Le fichier all.json , contenant les données sera téléchargé au démarrage de l’application et sauvegardé dans un répertoire local, c’est la méthode asynchrone, LoadRemoteCardsAsync() qui sera en charge :
Une fois que les données sont mappées, l’évènement CardsLoaded sera levé afin de prévenir les vues qui s’y sont abonnées.
Vous noterez également la présence des méthodes IsCardsOnCacheAsync et ReadJsonDataFromCacheAsync qui utilisées en conjonction permettront d’éviter de re-télécharger le fichier all.json, ce qui peut prendre un certain temps.
Comme je le disais précédemment, le téléchargement du fichier all.json, peut prendre un certain temps, il est donc de bon ton, d’indiquer à l’utilisateur que les données sont en cours de chargement.
Pour ce faire, nous allons créer une vue à base d’un UserControl, que l’on nommera ExtendedSplachScreen, et qui aura pour rôle :
Une fois que l’évènement CardsLoaded est levée, la méthode dataSource_CardLoaded() se déclenche. C’est elle qui à l’aide de l’élément Frame, va naviguer vers la page Home, en lui passant en paramètre, e.Blocks, contenant les données à afficher.
Vous noterez que nous utilisons la classe Frame, qui contiendra tout l’historique de navigation. Pas la peine alors de redévelopper son propre système, si vous souhaitez faire au plus vite.
La 1ere page que l’on nommera Home, aura pour but d’afficher , sous forme d’une collection groupée, les blocs et leurs logos , ainsi que les expansions associées à chaque bloc.
Ici nous allons ajouter une nouvelle page, basée sur le modèle Grouped Items Page, car il nous fournit un bon point de démarrage pour afficher les données sous forme d’une collection de données groupées.
Une fois créée, nous modifions la liaison de données des éléments par défaut, par nos propres éléments de type expansion contenus dans un bloc.
Modifions l’attribut ItemsPath=”items” du CollectionViewSource, par notre ItemsPath=”expansions”, comme illustré sur l’extrait de XAML suivant.
Note : expansions, étant définie comme une propriété de type ObservableCollection<JSONExpansion> de la classe JSONBlock
La liaison proprement dite Source=”{Binding Groups}” est assurée, sur l’évènement OnNavigated de la page.
Note : La page dérive de la classe LayoutAwarePage, qui entre autre offre un modèle de vue par défaut, nommé DefaultViewModel, et qui assure la liaison de données en liant les données avec le DataContext de la page. Le modèle s’appelle Groups, mais il peut bien évidement prendre le nom que vous souhaitez, pour peut que vous n’oubliez pas de le changer également dans le CollectionViewSource du fichier XAML.
L’affichage de nos données, se fait dans une GridView, qui est liée par défaut, avec le CollectionViewSource=”groupedItemsViewSource”. Cette GridView, sera constituée d’un “Header” liée aux blocs, et d’un panel d’éléments qui sera liées aux expansions. D’ou la présence de deux Templates SemanticZoomOutItemTemplate et SemanticZoomOutHeaderTemplate qui vont influer sur la manière dont les données seront affichées.
Par défaut l’attribut ItemTemplate, est liée avec le DataTemplate “Standard250x250ItemTemplate” contenu dans le fichier StandardStyles.xaml.
Nous allons modifier ce modèle afin que la liaison de données ainsi que l’affichage se fasse avec les éléments JSONBlock et JSONExpansion, pour ce faire, il suffit d’ajouter aux styles standard le XAML suivant :
La liaison de données se faisant sur les champs logo (lié à un contrôle Image) et name (lié à un contrôle TextBlock), deux propriétés de nos blocs et de nos expansions. Vous noterez également la présence d’un VisualStateManager, qui permet de changer la bordure de l’élément (ici un bouton) à l’aide d’une animation, lorsque la souris passe au dessus de l’élément.
Pour les plus aguerrit, ils auront noté également la présence du style SemanticZoomInItemTemplate, que nous utiliseront lorsque nous mettrons en place le SemanticZoom.
Comme nous venons de le voir, nos données sont structurées dans une GridView, organisée avec un entête constitué de nos blocs, et des expansions rattachées à chaque bloc. L’idée avec la vue sémantique, c’est de rajouter une autre GridView, qui affichera, comme on le voie sur l’image une vue filtrée par entête et qui permettra de naviguer rapidement sur le bloc sélectionné.
Cette fonctionnalité est appelée zoom sémantique (http://msdn.microsoft.com/en-us/library/windows/apps/hh465492.aspx) dans le jargon de développement d’une application Windows 8 Style Metro.
Pour ce faire nous allons utiliser tout simplement le contrôle XAML SemanticZoom, qui encapsulera dans la vue ZoomedInView, la 1ere GridView et dans la vue ZoomOutView la seconde GridView.
Cette seconde GridView, sera liée au modèle SemanticZoomInItemTemplate, que nous avons vu au préalablement.
Il est important de noter que la Liaison, utilise les chemins Group.name, et Group.logo, afin que l’affichage des données se fasse correctement.
Enfin par code, nous allons indiqué sur l’évènement OnNavigatedTo() de la page Home, que la vue ZoomedOutView, doit se lier à source de données, contenant les entêtes de la Collection, c’est à dire nos blocs. C’est ce qui permettra cette navigation rapide d’un bloc à un autre.
Note : Avec la souris, le zoom sémantique, s’active par CTRL + MOLETTE.
Enfin, il faut mettre en musique tout ce petit monde, sur l’évènement OnLaunched du fichier App.xaml.cs, ajoutez le code suivant :
Le prochain article introduira les fonctionnalités suivantes : •La page des cartes •La page des extensions •Gestion du mode offline •Gestion des settings