Par XavierBoubert
www.siteduzero.com
2/240
Sommaire
Sommaire ........................................................................................................................................... Lire aussi ............................................................................................................................................ Crez des applications pour Windows 8 en HTML et JavaScript ....................................................... Partie 1 : Premiers pas avec Windows 8 ............................................................................................ 2 3 5 7
WinRT .............................................................................................................................................................................. 51
Une nouvelle API ....................................................................................................................................................................................................... 52 Architecture ............................................................................................................................................................................................................... 52
www.siteduzero.com
Sommaire
3/240
53 54 55 55
Utilisation de la WinRT en JavaScript : ..................................................................................................................................................................... Encapsule avec IE 10 ............................................................................................................................................................................................. Comment a fonctionne ? ......................................................................................................................................................................................... La notion d'arrire-plan .............................................................................................................................................................................................
WinJS .............................................................................................................................................................................. 57
Une bibliothque JavaScript ..................................................................................................................................................................................... 57 Qu'est-ce que WinJS ? .............................................................................................................................................................................................. 57 Comment utiliser WinJS ? ......................................................................................................................................................................................... 58 Les notions de WinJS ............................................................................................................................................................................................... 59 Structurer son JavaScript .......................................................................................................................................................................................... 59 Excuter du code aprs le chargement complet du DOM ......................................................................................................................................... 67 Les selectors ............................................................................................................................................................................................................. 68 Les restrictions .......................................................................................................................................................................................................... 70 Les requtes AJAX .................................................................................................................................................................................................... 72 Les tches asynchrones ............................................................................................................................................................................................ 73 Crons une tche parallle avec WinJS.Promise() ................................................................................................................................................... 73 Utiliser then() et done() .............................................................................................................................................................................................. 75 Utiliser plusieurs tches la suite ............................................................................................................................................................................. 76 Arrter une tche en cours dexcution ..................................................................................................................................................................... 77 Arrter automatiquement une tche au bout d'un certain temps .............................................................................................................................. 77 Le cycle de vie d'une application ............................................................................................................................................................................... 78 Le cycle de vie ........................................................................................................................................................................................................... 78 Simuler les trois tats grce Visual Studio ............................................................................................................................................................. 82
www.siteduzero.com
Lire aussi
4/240
Utiliser le partage de Windows 8 ............................................................................................................................................................................. 158 Partager du contenu vers une autre application ..................................................................................................................................................... 159 Utiliser le partage vers notre application ................................................................................................................................................................. 160 Utiliser la diffusion multimdia sur d'autres priphriques de Windows 8 ............................................................................................................... 161 Une diffusion par dfaut .......................................................................................................................................................................................... 162 Choisir sa source de diffusion manuellement ......................................................................................................................................................... 163
www.siteduzero.com
Lire aussi
5/240
Par
XavierBoubert
4 448 visites depuis 7 jours, class 39/800 Qui ne connat pas ou n'a jamais utilis Windows ? Depuis 27 ans, Microsoft a sorti sept versions de son systme d'exploitation principal et nous rserve cette anne une nouvelle version pleine de nouveauts, dont la possibilit de dvelopper les applications en HTML5 et JavaScript ! La grande entreprise espre ainsi toucher un vaste rseau de dveloppeurs web et souhaite les retrouver sur son systme pour crer un maximum d'applications. Windows 8 dispose maintenant d'un nouveau type d'applications, bases sur les dernires tendances techniques et interfaces modernes. Il est dsormais aussi facile de crer un site web que de dvelopper une application sur Windows 8. Avec des rgles trs compltes et dtailles, des outils de dveloppement comme Microsoft sait en faire depuis des dizaines d'annes et ce big tuto sur votre cran, cela va devenir un jeu d'enfant de crer des applications. Je pars du principe que vous connaissez dj HTML5/CSS3 et JavaScript. Ce cours n'a pas la prtention de vous apprendre utiliser ces langages, mais plutt de vous les faire utiliser pour le dveloppement d'applications pour Windows 8. V ous devriez connatre galement la programmation oriente objet, mme si ce n'est pas indispensable. V ous tes ici pour crer sur Windows 8 et cest ce que nous allons tudier ! De la cration complte dune application sa soumission sur le Windows Store, en passant par sa connexion des services web et son internationalisation, vous saurez tout sur comment crer une application en HTML5 et JavaScript sur Windows 8.
Logo de Windows 8
www.siteduzero.com
6/240
Tuto vido: apprenez migrer votre site web vers Windows Azure Web Services
www.siteduzero.com
7/240
Le systme Windows
Windows est le systme d'exploitation principal de Microsoft. C'est un norme programme install sur un ordinateur, capable de lancer des applications dans des fentres. Ce systme comporte galement un noyau capable de supporter des applications dveloppes par des dveloppeurs tiers. Depuis des annes, de nombreuses socits se sont donc construites en dveloppant et vendant des applications au travers des nombreuses versions de Windows. C'est en 1985 que Bill Gates, le fondateur de Microsoft et ancien prsident, sort la premire version de Windows, la 1.0. Depuis la version 95 sortie en 1995 Microsoft nous a habitu une interface qui n'a que trs peu volu. Avec son clbre menu dmarrer , sa barre des tches et son bureau, les utilisateurs se sont habitus depuis longtemps cette utilisation. Mme si le style s'est modernis et mis au got du jour avec le temps, l'ergonomie principale n'a jamais vraiment t bouscule. Afin de vous faire une ide, regardez la figure suivante.
www.siteduzero.com
8/240
Avec l'arrive des nouveaux matriels - smartphones, tablettes, ultraportables - le type d'interface que proposait Windows depuis de nombreuses annes ne remplissait plus totalement sa fonction. Difficile d'utiliser un clic droit ou un petit menu avec les doigts directement sur une surface tactile. Il fallait donc faire voluer tout ce petit monde, ce qui entranait forcment un changement d'habitudes et d'utilisations. Microsoft a donc pris le pari de lancer une nouvelle version de son systme d'exploitation, Windows 8, avec une toute nouvelle
www.siteduzero.com
9/240
Nouveau concept
Dans sa grande contrainte de devoir voluer vers du neuf, Windows s'est vu dot d'une nouvelle interface, reprsente la figure suivante.
cran de dmarrage de Windows 8 Un nouveau type d'applications a vu le jour, spcialement conu pour cette interface, et qui, de par sa nature, son style et son ergonomie, prend en compte les nouveaux matriels dont je vous parlais. L'une des grandes forces des versions de Windows, c'est leur compatibilit descendante. Chaque Windows peut - en principe faire fonctionner les logiciels des versions prcdentes. Il fallait donc trouver un moyen de pouvoir utiliser les anciennes applications en sachant qu'elles n'avaient clairement pas leur place dans cette nouvelle interface. Microsoft a donc dcid de garder l'ancien bureau de Windows 7, avec toutes ses fonctionnalits ! Windows 8 dispose donc de deux interfaces, se rfrant deux concepts bien distincts.
Le graphisme
Cette nouvelle interface de Windows 8 n'est pas trs rcente, car nous avons dj pu la voir sur l'application de musique Zune (voir figure suivante). Nous l'avons ensuite retrouve sur les Windows Phone 7, puis la Xbox.
www.siteduzero.com
10/240
Le logiciel Zune Ce style, vous le connaissiez peut-tre dj sous l'appellation Metro , abandonne en aot 2012 par Microsoft. Aujourd'hui, Microsoft utilise tout simplement Windows 8 style . Nous reviendrons avec beaucoup plus de dtails sur ce style dans le chapitre suivant. Le graphisme de la partie Windows 7 a galement subi un lifting pour tre plus proche des rgles du nouveau style. Il y a eu l'ajout du ruban que l'on trouvait dj dans quelques applications de la suite Office depuis la version 2007, comme l'explorateur de fichiers par exemple, visible la figure suivante. Il permet d'utiliser tactilement des options comme le copier-coller grce de plus gros boutons et en vitant le clic droit.
Le noyau
Pour cette nouvelle version, Microsoft a mis au point une toute nouvelle API pour pouvoir utiliser son noyau : Windows RunTime (ou WinRT pour les intimes). Pour ne pas rpter les mmes erreurs, cette API a t place bien plus au cur du systme et proche de son noyau. Elle garde en plus toutes les meilleures fonctionnalits du .NET en les amliorant. Elle n'est cependant accessible que par les langages suivants :
www.siteduzero.com
11/240
Et a tombe bien parce que c'est en JavaScript que l'on va dvelopper nos applications dans ce cours. Nous verrons plus tard ce qu'est vraiment la WinRT et comment elle fonctionne.
Mme si Windows 8 volue avec sa WinRT, le .NET reste nanmoins toujours utilisable, et il arrive en plus avec une nouvelle version, la 4.5.
Le cloud
On ne cesse d'en parler sur le web depuis ces dernires annes, le cloud est partout. Citation : Wikipdia Le cloud est un concept qui consiste dporter sur des serveurs distants des stockages et des traitements informatiques traditionnellement localiss sur des serveurs locaux ou sur le poste de l'utilisateur.
En bref, le cloud vous permet de stocker des informations directement en ligne. C'est le cas de tous les services en ligne, comme SkyDrive, Google Drive ou Dropbox, qui stockent vos fichiers en ligne. C'est galement le cas d'Office 365 ou de Google Docs, qui vous permettent de crer des documents textes ou tableurs sur des sites web. Microsoft ne l'a malheureusement jamais vraiment intgr jusqu' maintenant sur ses systmes et c'est ce que va corriger Windows 8. Tout d'abord, vous pouvez vous connecter avec votre compte Live ID sur n'importe quelle machine disposant de Windows 8. En paramtrant votre compte, il sera automatiquement synchronis sur les serveurs de Microsoft et pourra donc enregistrer : V otre photo de profil ; V otre fond d'cran ; Chacun de vos comptes de rseau social comme Facebook ou Twitter ; La disposition de vos applications sur l'cran de dmarrage ; V os fichiers stocks sur SkyDrive (l'application de partage de fichiers) ; V os applications dj installes sur d'autres ordinateurs sous Windows 8 ; Et pas mal d'autres paramtres. En bref, votre connexion sur un ordinateur, vous retrouverez votre environnement, vos fichiers et vos petites habitudes. Notez bien que, de toute manire, il est obligatoire d'utiliser un Live ID pour installer des applications qui proviennent du Windows Store ou d'y ajouter celles d'un dveloppeur.
Le Windows Store
Jusqu' maintenant, trouver une application pour Windows demandait forcment une recherche. Que ce soit sur le web ou ailleurs, le seul moyen d'avoir une application oprationnelle sur son ordinateur tait : De rcuprer son systme d'installation (CD, cl USB, tlchargement sur internet) ; De l'installer, avec plus ou moins d'options compliques pour les utilisateurs novices.
www.siteduzero.com
12/240
Avec l'arrive des systmes de centralisation d'applications - comme l'a fait Apple avec son Apple Store - Microsoft a voulu reprendre le concept et a donc lanc son Windows Store . Chaque dveloppeur peut donc ajouter son application au Store et ainsi la voir mise disposition sur les ordinateurs ou appareils mobiles des utilisateurs du monde entier. En cliquant simplement sur un bouton, le Store se chargera ensuite de tlcharger l'application sur l'ordinateur, de l'installer, et d'y ajouter une tuile sur la page de dmarrage.
www.siteduzero.com
13/240
www.siteduzero.com
14/240
Pas pratique
d'utiliser le clavier virtuel sur un diteur de texte lorsqu'il prend la moiti de l'cran !
www.siteduzero.com
15/240
Cette interface a donc t dveloppe pour le tactile et plus spcifiquement pour des tablettes (voir figure suivante). Elle a t dote de nombreux mouvements appels gestures par Microsoft pour que les utilisateurs puissent faire beaucoup d'actions avec une seule main. Nous y reviendrons un peu plus tard dans ce cours.
Le style Windows 8
Le nouveau design de Windows 8 est tir d'un style graphique mrement rflchi et travaill par Microsoft ces dernires annes. Un norme travail a t fait pour revoir ds la base lergonomie, la rapidit et la fluidit de ce qu'on appelle l'UI du systme. UI signifie User Interface , soit interface pour utilisateur en franais. C'est tout ce qui touche l'interface que les utilisateurs utilisent et voient sur leur cran. On dit par exemple qu'un bouton est un lment de l'UI.
De grandes rgles ont donc t dfinies pour les dveloppeurs du systme, mais galement pour les dveloppeurs qui soumettent leurs applications sur le Windows Store. C'est--dire nous.
www.siteduzero.com
16/240
Les icnes
Les icnes servent indiquer, en un coup d'il, une action ou une information. Lorsqu'une icne est incomprise, c'est toute l'information qui devient incomprise. C'est pourquoi, dans ce style, les icnes doivent tre le plus simple possible. Clart et simplicit sont de rigueur, et les icnes ne font pas bande part. Ce sont donc des icnes composes d'une seule couleur (monochromes), sans fond, sans relief, sans bordure, sans reflet et sans ombre, comme le montre la figure suivante. Ce sont les mmes genres d'icnes que vous rencontrez sur les panneaux de signalisation, dans les mtros ou les gares.
Les alignements
Les alignements sont la structure mme d'un affichage de contenu. Microsoft a rdig des rgles trs prcises pour avoir un alignement identique sur chaque application. Les utilisateurs gardent ainsi la mme exprience partout. Un systme de grille cr pour ce style nous permet d'aligner nos lments le plus simplement du monde. Nous verrons comment ce style fonctionne concrtement dans le chapitre Les rgles de l'UI de la deuxime partie de ce cours. Nous verrons les rgles trs compltes que Microsoft a crites pour nous aider dvelopper nos applications.
Le Windows Store
Le Windows Store est une des grandes nouveauts de Windows 8. C'est lui qui permet de centraliser toutes les applications pour le systme sans qu'il faille aller les chercher droite et gauche sur internet ou ailleurs (voir figure suivante).
www.siteduzero.com
17/240
applications pour tous les utilisateurs Microsoft oblige les dveloppeurs soumettre leurs applications sur le Store pour pouvoir ensuite les distribuer dans le monde. Nous ne pouvons donc pas distribuer nos applications sans passer par leur validation. Mme si a peut en contrarier plus d'un, ce systme a ses avantages car il permet : De centraliser les applications, toutes au mme endroit. De dcouvrir de nouvelles applications. De filtrer les applications qui contiendraient des virus et autres contenus malveillants. Dtre srs que les applications respectent une homognit dans leurs interfaces. D'avoir un systme de vente d'applications unique pour lutilisateur, qui n'aura pas donner sa carte bancaire d'autres endroits. Si vous souhaitez vendre vos applications, vous n'aurez donc pas mettre en place la moindre structure marchande. Une simple case cocher avec le montant de l'application suffira pour la mettre en vente sur tous les ordinateurs des utilisateurs de Windows 8. Cela permet galement Microsoft de gnrer du profit. Chaque dveloppeur qui met en vente son application donne Microsoft 30% des recettes nettes engendres.
Recherche d'applications
Un utilisateur de Windows 8 peut rechercher une application sur le Store comme il chercherait un fichier sur son systme. L'ide est celle-ci : J'ai besoin d'une fonctionnalit ? Je la recherche et l'ajoute mon systme. En imposant aux dveloppeurs d'avoir les mmes structures d'interface sur leurs applications, Microsoft arrive fondre les applications au sein du systme de manire presque transparente. Du coup, pour l'utilisateur, c'est presque comme une extension de son ordinateur ou de sa tablette. De ce fait, la recherche devient trs simple. Le Windows Store tant compos de catgories d'applications, l'utilisateur peut dcouvrir de nouvelles applications, soit en naviguant dans les catgories, soit en tapant directement une recherche, comme le montre la figure suivante.
www.siteduzero.com
18/240
www.siteduzero.com
19/240
Autorisations
Lorsque vous tes sur la page des dtails d'une application, vous pouvez voir en bas gauche les autorisations que l'utilisateur donnera automatiquement l'application en l'installant, comme le montre la figure suivante. En fait, lorsqu'un dveloppeur ajoute certaines fonctionnalits son application, ou qu'il a besoin d'informations personnelles, il doit dfinir des autorisations que l'utilisateur devra valider pour utiliser cette application. C'est l'un des gros avantages pour les utilisateurs, d'avoir de la transparence sur ce que les applications sont capables de faire.
www.siteduzero.com
20/240
Un premier projet
On a vu ce qu'tait Windows 8, ses nouveauts, son Store, son concept et son style. Un sacr morceau ! Nous allons pouvoir mettre en place notre environnement de dveloppement et crer un premier projet de test pour voir comment tout cela fonctionne. Nous verrons galement comment dboguer et tester nos applications. Une fois notre environnement bien pris en main, il ne nous restera plus qu' tester un peu de code en le documentant pour nous y retrouver plus facilement.
Visual Studio 12
Visual Studio est un environnement de dveloppement (IDE) propritaire et payant comprenant une foule d'outils tous assembls les uns aux autres dans une mme interface. Il permet de dvelopper des projets avec plusieurs langages diffrents. La premire version remonte plus de 15 ans (1997) et incluait dj quelques langages comme le Visual Basic, le Visual C++, le Visual J++, le Visual FoxPro 5.0 et le Visual InterDev. Ces langages ne vous disent srement rien aujourd'hui, car Microsoft en a ajouts et supprims dans son volution au fil du temps. Visual Studio ne permet de dvelopper que sur Windows et que pour les plateformes Microsoft. V ous pourrez ainsi coder facilement pour Windows 8 et versions antrieures, les Windows Server ou bien les Windows Phone, mais bien moins facilement pour Linux ou Mac. Il existe cependant des extensions qui pallient ce problme, mme si ce n'est pas notre sujet. La nouvelle version 2012 permet quant elle de dvelopper sur le nouveau noyau Windows RT de Windows 8. Aucune des prcdentes versions n'en est capable, et je ne vous conseille donc pas de les utiliser, mme si vous en avez une version. La version 2012 dispose en plus d'un outil spcialis pour l'UI qui s'appelle Blend. C'est un logiciel de cration d'UI trs performant et bien videmment li aux interfaces Windows. Nous l'utiliserons pour styliser nos contrles, pour enrichir nos vues et pour crer de belles animations. Aujourd'hui il existe des versions dites Express de Visual Studio spcifiques aux langages. Ces versions sont gratuites et disposent de moins de fonctionnalits, il n'y a par exemple pas d'outils de travail en quipe. Nous allons utiliser la version Visual Studio Express 2012 pour Windows 8, qui nous convient totalement pour ce que nous devons faire.
Je vous conseille de vous quiper d'un clavier et d'une souris si vous utilisez une tablette. Le dveloppement sur Windows vous demande forcment de taper du code et de jouer avec des lments graphiques, nous travaillerons dans la partie Entreprise de Windows 8.
www.siteduzero.com
21/240
Rendez-vous sur le site de tlchargement de Visual Studio Express 2012. Descendez le long de la page jusqu' tomber sur Visual Studio Express 2012 pour Windows 8 . Cliquez ensuite sur le lien Tlcharger la version de Visual Studio Express 2012 pour Windows 8 FR . V ous devriez obtenir la figure suivante.
Attention, Visual Studio 2012 demande plus de 400 Mo d'espace disque et prendra donc un certain temps tre tlcharg suivant votre connexion internet.
Premier lancement
Au premier lancement de Visual Studio 2012, le logiciel vous demande une cl de produit. Pas de panique, il vous suffit de vous inscrire en ligne pour en rcuprer une gratuite. Cliquez sur le lien S'inscrire en ligne droite du champ de texte de la cl, comme le montre la figure suivante.
www.siteduzero.com
22/240
logiciel Microsoft vous demande alors un Live ID. Si vous utilisez le Windows Store, c'est que vous en disposez ; connectez-vous avec le mme. Remplissez le long formulaire qui s'affiche ensuite, puis cliquez sur Suivant (attention aux nombreux champs obligatoires). Une cl vous est alors automatiquement attribue et vous n'avez plus qu' la copier dans Visual Studio. En cliquant sur Suivant, la cl est applique. V ous pouvez fermer la fentre pour laisser Visual Studio s'ouvrir. Maintenant que notre IDE est ouvert, il vous demande d'obtenir une licence de dveloppeur. l'inverse de celle permettant de soumettre votre application sur le Windows Store, celle-ci est gratuite et limite l'utilisation de cette unique machine. V ous en avez donc besoin pour dployer et tester vos dveloppements. Cliquez sur J'accepte pour voir s'ouvrir une fentre de connexion. Renseignez une nouvelle fois votre compte Live ID. Une licence vous est alors attribue pour une dure d'un mois, comme le montre la figure suivante. Mais vous pourrez la renouveler.
www.siteduzero.com
23/240
V ous voil avec un Visual Studio prt pour vos dveloppements. Je ne sais pas vous, mais j'ai hte de commencer taper du code !
Nouveau projet
Une fois Visual Studio lanc, il prsente une page de dmarrage classique avec quelques liens d'aide et des ressources d'apprentissage (voir figure suivante). Comme vous avez ce cours entre les mains, vous ne devriez pas en avoir besoin tout de suite.
www.siteduzero.com
24/240
Pour crer notre projet, cliquez sur Nouveau projet dans la colonne de gauche, sous Dmarrer. Une fentre d'aide la cration d'un projet s'ouvre et vous permet de choisir votre langage et quelques paramtres, comme la figure suivante.
Fentre d'aide la cration d'un nouveau projet Nous allons choisir dans la colonne de gauche la catgorie des Modles, puis le langage qui nous concerne : JavaScript. Dans la colonne du milieu, nous avons le choix entre plusieurs modles. Application de quadrillage sera celui que l'on utilisera le plus grce son architecture. V ous verrez dans la prochaine partie du cours de quoi il retourne. Pour le moment nous allons choisir le modle Application vide pour plus de simplicit. En bas de la fentre, renseignons galement le nom que portera l'application : Hello World . Le nom de l'application sera galement le nom de la solution, le nom du projet, et le nom du rpertoire que vous retrouverez dans le dossier des projets de Visual Studio.
www.siteduzero.com
25/240
L'diteur de code
La figure suivante vous est forcment familire si vous avez dj dvelopp en HTML/JavaScript. Elle reprsente l'diteur de code de Visual Studio. Elle contient les diffrentes pages de code ouvertes sous forme d'onglets. Comme tout bon diteur, il possde sa coloration syntaxique des langages, la possibilit de fermer des parties de code et bien sr la vision des erreurs de code. Il existe tout un tas d'autres fonctionnalits comme l'Intellisense que l'on retrouvera dans la prochaine section.
L'diteur de code
Les proprits
www.siteduzero.com
26/240
Les proprits ne peuvent tre appliques qu' certains lments de certains fichiers. Si vous ouvrez le fichier default.html par exemple, vous aurez les mmes proprits qu' la figure suivante. V ous avez donc la possibilit de modifier les proprits de la page directement dans cette vue plutt que de le faire dans le code. L'avantage tient au fait que les champs contenus dans cette vue aident se remplir par des valeurs dj existantes dans les autres fichiers. Comme avec des classes CSS dj dfinies dans des feuilles de style par exemple.
Les proprits
Un peu de code
Comme nous avons ouvert le fichier default.html, nous allons y insrer un peu de code pour rendre un peu plus fun notre Hello World . Supprimez tout ce qu'il y a entre les balises <body></body>, puis ajoutez ce petit bout de code : Code : HTML <div class="bulle"> <div class="fleche"></div> Hello World ! </div>
Maintenant, ouvrez votre feuille de style principale dans l'explorateur de solutions (CSS\default.css), puis ajoutez le code suivant : Code : CSS body { padding: 50px; } .bulle { position: relative; width: 300px; border-radius: 4px; padding: 20px; background: #00aedf; color: white; } .bulle .fleche { position: absolute; top: 20px; left: -20px; width: 0; height: 0; border-width: 10px; border-color: transparent #00aedf transparent transparent;
www.siteduzero.com
27/240
Maintenant, excutons notre code. Pour ce faire, vous avez deux solutions. Soit vous cliquez sur la flche verte Ordinateur local en haut sous le menu principal (voir figure suivante), soit vous appuyez sur F5. Cliquez sur la flche verte pour excuter le code
Les paramtres dexcution de votre application sont par dfaut renseigns de cette manire : Ordinateur local dfinit l'endroit o va tre dploy l'application. Tant que nous sommes sur Windows 8, il n'y a pas de raison de changer ce paramtre. Debug est le mode de compilation de votre application. Pour le moment, comme nous souhaitons la tester et suivre ce qu'elle fait, nous la gardons en mode Debug. Mais le jour o nous voudrons la distribuer sur le Windows Store, nous changerons ce mode par Release pour avoir une version finale. Any CPU vous permet de tester l'application sur divers processeurs. Comme Microsoft propage plusieurs architectures de tablettes, certaines contiennent des processeurs ARM. Il sera bon de pouvoir tester vos applications sur ce processeur dans l'avenir pour tre srs de pouvoir les distribuer un maximum d'utilisateurs.
Une fois lexcution lance, elle va compiler votre application puis la dployer sur votre machine, comme si c'tait une application venant du Windows Store. Elle ajoutera mme une icne sur l'cran de dmarrage de Windows 8. Si tout s'est bien pass, vous devriez voir la figure suivante apparatre en plein cran.
L'interface du dbogage
Notre application est en train de tourner. Elle est en plein cran et rien ne la force quitter. C'est trs bien, c'est l'tat qu'il nous faut pour aller la dboguer. Sans la quitter, revenez sur Visual Studio. V ous remarquez que l'interface a quelque peu chang. Elle est passe en mode Excution. V ous avez maintenant deux nouveaux panneaux intressants.
L'explorateur DOM
Cet explorateur vous permet de visualiser en temps rel votre code HTML. S'il est modifi par le JavaScript, vous le verrez modifi ici aussi. Il vous est ainsi possible de suivre les modifications du HTML et des styles CSS. En plus de pouvoir visionner ces informations, vous pouvez vous-mmes diter les styles et balises en cliquant dessus. Pour slectionner un lment directement dans votre application, cliquez sur Slectionner un lment tout en haut du panneau (voir figure suivante), puis cliquez n'importe o dans votre application. N'hsitez pas tester directement votre code CSS, pour des dispositions par exemple. V ous pourrez ainsi affiner votre code en temps rel.
www.siteduzero.com
28/240
L'explorateur DOM
La console JavaScript
Cette console, visible la figure suivante, vous permet de voir les erreurs ou les avertissements du code JavaScript lorsqu'il y a des problmes, mais galement de voir des messages importants sur la navigation ou les interactions utilisateur. V ous avez galement la possibilit de pouvoir excuter directement du code JavaScript dans le champ textuel du bas. V ous pourrez donc excuter des fonctions et tester des pans de code sans devoir ajouter des boutons tout va.
La console JavaScript
Arrter l'application
V ous pouvez fermer votre application comme n'importe quelle autre application Windows 8. En maintenant enfonc le doigt sur le haut de l'application puis en la glissant tout en bas de l'cran, elle se fermera toute seule. V ous avez galement la possibilit de cliquer sur le petit carr rouge ct de la barre de compilation dans Visual Studio. Cela mettra fin au programme sans dclencher d'erreur.
www.siteduzero.com
29/240
Aperu d'un point darrt, en rouge Un point darrt va arrter votre code la ligne voulue lors de lexcution de votre application. Pour en ajouter un, positionnez votre curseur sur une ligne, puis appuyez sur la touche F9 de votre clavier. Cela marquera la ligne sur un fond rouge et ajoutera une puce sur sa gauche. Lorsque vous dmarrez ensuite l'application, Visual Studio reviendra au premier plan avec la ligne dont le code est arrt en surbrillance. Pour continuer de dboguer et tester le code ligne par ligne, appuyez sur F10. V ous passerez alors la ligne suivante. V ous pouvez passer votre souris sur les variables du code en cours d'affichage pour voir leurs valeurs en temps rel.
Un panneau Pile des appels en dessous du code vous affiche galement l'ordre des fonctions qui ont conduit au code arrt. V ous pouvez ainsi double-cliquer sur ces lignes pour voir les prcdents appels avec quelques dtails. Pour que l'application reprenne le cours de son excution, appuyez sur F5, comme pour la dmarrer. V ous pouvez maintenant jongler entre votre application et Visual Studio pour tester et dboguer votre code en toute tranquillit.
IntelliSense
IntelliSense est une fonctionnalit qui existe depuis un moment dans les versions de Visual Studio. Il aide les dveloppeurs crire du code plus vite en vitant les erreurs de frappe. Son principe est le suivant : lorsque vous crivez du code au fil des fichiers, IntelliSense mmorise les objets, les fonctions, les classes, les proprits, etc. Il se charge ensuite, de manire intelligente, de vous aider retrouver les bons objets lorsque vous tapez des caractres en affichant un petit menu rapide. En plus de votre code, il mmorise galement toutes les rfrences que vous utilisez au sein de votre projet, ainsi que bien videmment les structures du langage utilis. Une auto-compltion intelligente en quelque sorte. Un exemple simple : vous souhaitez ajouter une fonction toute bte. crivez simplement les lettres fun pour voir IntelliSense apparatre, comme la figure suivante.
www.siteduzero.com
30/240
IntelliSense en action
Il slectionne pour vous le mot function . La petite icne avec un ciseau signifie que c'est un bout de code que vous allez pouvoir ajouter. Pour insrer directement ce bout de code et donc gagner du temps, appuyez une premire fois sur la touche Tabulation pour voir le mot s'crire tout seul. Un second appui sur la touche Tabulation et hop ! une fonction est gnre automatiquement. Il vous slectionne en prime le nom de la fonction donner, que vous n'avez plus qu' remplir. V ous avez donc une fonction toute prte en cinq touches de clavier. V ous pouvez ainsi vous faire aider tout au long de la rdaction de votre code.
IntelliSense propose une documentation V ous voyez ici que l'on a quelques informations trs intressantes. On sait qu'il y a deux paramtres, que ce sont des nombres, et on a une description de la fonction. Nous allons voir maintenant ces fameuses balises et dcrire leur fonctionnement.
La balise var
La balise var est utilisable au-dessus d'une dclaration de variable. Elle permet d'en dfinir la description ainsi que le type (optionnel). Code : JavaScript /// <var type="Number">uneVariable est une variable de
www.siteduzero.com
31/240
En ajoutant ce commentaire au-dessus d'une variable, vous pouvez lui donner les informations suivantes : Le type de la variable (ici Number pour afficher un nombre) ; La description de la variable lintrieur de la balise. V ous aurez ainsi une variable documente et, chaque fois que vous l'utiliserez, vous pourrez voir sa description et son type apparatre.
La balise summary
La balise summary est utilisable lintrieur d'une fonction ou d'une mthode. Elle en dfinit la description. Code : JavaScript function addition(nombre1, nombre2) { /// <summary>Additionne 2 nombres</summary> return nombre1 + nombre2; }
La balise returns
La balise returns est galement utilisable lintrieur d'une fonction ou d'une mthode. Elle en dfinit la valeur de retour avec une description et un type. Code : JavaScript function addition(nombre1, nombre2) { /// <summary>Additionne 2 nombres</summary> /// <returns type="Number">Retourne le nombre additionn</returns> return nombre1 + nombre2; }
La balise param
La balise param est utilisable pour un paramtre de fonction ou de mthode. Elle en dfinit le nom, le type et la description. Code : JavaScript function addition(nombre1, nombre2) { /// <summary>Additionne 2 nombres</summary> /// <param name="nombre1" type="Number">Le premier nombre additionner</param> /// <param name="nombre2" type="Number">Le second nombre additionner</param> /// <returns type="Number">Retourne le nombre additionn</returns> return nombre1 + nombre2; }
www.siteduzero.com
32/240
La balise field
La balise field est utilisable pour un champ ou un membre d'un objet. Elle dfinit son nom, son type, sa description et si elle est statique (true ou false). Code : JavaScript var Rectangle = { /// <field type="Number" static="false">La largeur du rectangle</field> largeur: 5, /// <field type="Number" static="false">La hauteur du rectangle</field> hauteur: 4, /// <field type="Number" static="false">Mthode qui retourne l'aire du rectangle</field> getAire: function () { return this.largeur * this.hauteur; } }
V oila, vous pourrez maintenant documenter correctement votre code et ainsi vous faire aider tout au long de votre dveloppement. Nous utilisons Visual Studio 12 avec Blend pour dvelopper des applications Windows 8. Il existe une version gratuit dite Express de Visual Studio 12 et Blend. Nous pouvons dployer et lancer une application en dveloppement directement sur notre Windows 8 pour lui faire subir des tests en direct. En documentant correctement son code, on peut utiliser IntelliSense pour s'aider crire du code plus vite. Cette premire partie est termine. Nous avons explor et dcouvert les premiers pas dans le monde du dveloppement pour Windows 8. Nous sommes prt entrer dans le vif du sujet maintenant que nous savons : Ce qu'est Windows 8 compar ses prdcesseurs Qu'il existe des rgles d'interfaces trs compltes et conues pour les utilisateurs Mettre en place notre environnement de dveloppement Je vous laisse continuer dans la prochaine partie qui comporte tout ce que vous devez apprendre pour dvelopper une application stable sur Windows 8.
www.siteduzero.com
33/240
Aperu de l'cran de dmarrage en horizontal et en vertical En plus de ces orientations, l'affichage horizontal permet trois types de disposition. Il n'est plus possible aujourd'hui de redimensionner la vole et de faon trs prcise ses applications. Ces trois dispositions couvrent en fait les trois seuls diffrents espaces que peuvent prendre les applications au sein de l'cran.
www.siteduzero.com
34/240
Le plein cran
Par dfaut une application s'ouvre en plein cran. C'est l'affichage standard qui prend tout l'espace. C'est lui qui aura le plus de contenu et qui permettra une meilleure navigation dans l'application. V ous en avez un exemple la figure suivante.
La vue snapped
Windows 8 peut videmment lancer plusieurs applications en mme temps. Mme si celles-ci tournent en arrire-plan sans problme pendant qu'une seule est affiche en plein cran, l'utilisateur a tout de mme la possibilit d'en afficher une deuxime sur le ct. La vue snapped permet de placer une application sur les cts gauche ou droite d'une autre application. Il faut alors adapter son affichage cette vue qui ne prend que le tiers de l'cran. Elle est beaucoup plus petite et doit afficher moins d'lments. Par exemple, l'application Musique affiche la lecture en cours et quelques boutons de navigation dans les pistes. L'application Messages , que l'on retrouve la figure suivante, affiche la discussion en cours avec un ami. C'est vous de trouver ce qu'il est intressant de montrer par rapport vos applications.
www.siteduzero.com
35/240
La vue filled
L'application qui tait en plein cran prend maintenant une surface plus rduite cause de l'application snapped (voir figure suivante). On appelle cette vue filled , car elle n'occupe plus que les deux-tiers de l'cran. Si vous avez bien prvu votre affichage pour qu'il s'adapte aux tailles d'cran, vous n'aurez pas grer cette vue car l'application devrait s'adapter d'elle-mme.
www.siteduzero.com
36/240
L'application Messages en vue filled V ous l'aurez compris, le but est de rendre votre interface la plus adaptable possible. Ne faites pas de rendus figs qui se bloqueraient sur certains affichages et qui gcheraient lexprience de l'utilisateur. V oyez large et dynamique. Plus vous serez souples, plus votre application sera utilisable sur un grand nombre de types d'cran diffrents.
Systme de grille
La grille (voir figure suivante) est un modle par dfaut qui est utilis dans toutes les applications Windows 8. Les dveloppeurs peuvent ainsi placer leurs lments d'UI en tant srs de bien les aligner. V ous allez voir que chaque lment y trouve sa place. Cette grille possde ses units de mesure, savoir : L'unit : quivaut un carr de 20 pixels de large sur 20 pixels de hauteur. La sous-unit : quivaut un carr de 5 pixels de large sur 5 pixels de hauteur. En utilisant ces mesures, vous garantirez vos applications une homognit et des alignements toujours parfaits.
www.siteduzero.com
37/240
La grille
Nous utiliserons partir de maintenant les termes unit et sous-unit , aussi je vous conseille de bien mmoriser leur taille.
L'entte de page
Le titre d'une page est toujours positionn 5 units (100 pixels) du haut de page et 6 units (120 pixels) de la gauche, comme le montre la figure suivante. Il est crit avec la police Segoe UI Stylistic de taille 20. C'est un titre imposant et le fait de le trouver toujours au mme endroit dans toutes les applications permet l'utilisateur de s'habituer au systme et de retrouver les informations importantes rapidement. Nous reviendrons plus tard sur le choix des polices de l'application, car elles aussi sont importantes.
www.siteduzero.com
38/240
La rgion du contenu
En dessous de l'entte se trouve la rgion o l'on doit mettre le contenu de nos pages. Ses rgles de disposition sont : Elle est place avec une marge de 7 units de hauteur et de 6 units partir de la gauche. V ous pouvez mettre autant de contenu que vous le souhaitez sur la droite, mme en sortant de l'cran. L'utilisateur est habitu dfiler vers la droite. Libre vous de mettre la taille que vous souhaitez sur la marge du bas en sachant qu'elle doit tre comprise entre 2,5 (50 pixels) et 6,5 units (130 pixels). La figure suivante schmatise ces points.
www.siteduzero.com
39/240
Marges de la rgion du contenu Lintrieur du contenu dispose aussi de marges dfinies. Elles permettent de bien espacer les articles. Elles se dfinissent ainsi : Entre deux rgions de contenu, il faut une marge de 4 units ; Entre deux articles d'une mme rgion (par exemple deux colonnes), il faut une marge de 2 units ; Entre deux lments d'un article, il faut une marge de 2 sous-units. La figure suivante schmatise ces points.
www.siteduzero.com
40/240
Marges du contenu
La navigation
La navigation est un des points les plus importants pour le dveloppement des applications Windows 8. Elle va nous permettre de structurer notre contenu en pages afin que les utilisateurs puissent naviguer entre elles.
www.siteduzero.com
41/240
Le principe est de faire en sorte que les pages ne se chevauchent jamais. Lorsqu'un utilisateur commence naviguer et suit un chemin de page en page, il doit pouvoir revenir en arrire, sans passer deux fois par la mme page. On utilise pour cela trois types de pages qui sont trs utiles pour prsenter son contenu, et qui sont le cur de cette hirarchisation.
La page Hub
Cette page est le point d'entre d'une application. Lorsque l'utilisateur ouvre cette dernire, il rencontre cette page qui structure son contenu sous forme de sections, les unes derrire les autres de manire horizontale, comme le montre la figure suivante. Il suffit de mettre en avant une info trs courte par contenu disponible - comme une image et un titre par exemple - et de les regrouper dans un espace ddi une section. Il est possible d'utiliser plusieurs types de dispositions pour prsenter du contenu ou des fonctionnalits. vous de faire travailler votre imagination pour prsenter votre contenu le plus clairement possible. L'utilisateur n'a plus qu' faire dfiler l'cran vers la droite pour voir toutes les sections disponibles.
La page Hub
La page Section
Cette page (voir figure suivante) prsente le deuxime niveau dans une application. On y accde partir du Hub, en cliquant sur un titre de section par exemple. Elle regroupe ses propres informations comme sa description, des aides, etc., mais galement ses lments de contenu un peu plus dtaills. Ici aussi, il est possible d'utiliser la disposition que l'on souhaite, en sachant qu'il est toujours prfrable de faire un affichage horizontal, comme pour le Hub.
www.siteduzero.com
42/240
La page Section
La page Detail
Sur les deux autres pages, nous avons vu la prsentation du contenu. Ici nous avons la page dtaille d'un article de contenu (voir figure suivante). On peut y accder par l'une ou l'autre des pages prcdentes. Le but est d'y mettre un maximum d'informations, du texte, des images, des vidos, etc. vous de choisir la disposition de vos lments, que ce soit sur une vue horizontale ou verticale.
La page Detail
Gardez bien en tte le systme de grille lorsque vous prsentez vos pages. Les tailles des marges tant dj calcules pour vous, il vous suffit simplement de les appliquer. Avec ce type d'architecture trois niveaux, les utilisateurs peuvent plus facilement revenir en arrire sans tre jamais perdus. V ous pouvez bien videmment ajouter des sous-sections, et agrandir la taille de cette architecture. Le principe est de toujours utiliser une hirarchie descendant au dtail du contenu que vous souhaitez diffuser.
www.siteduzero.com
43/240
La typographie
la sortie de Windows Vista et Office 2007 - et donc en cette mme anne - Microsoft a introduit de nouvelles polices d'criture, spcialement conues pour l'UI. Son but : rendre la typographie son grand rle de clart au sein d'une interface. C'est pourquoi Windows 8 arrive avec en son noyau une grande palette d'outils pour que les dveloppeurs puissent grer leurs textes de manire avance.
Segoe UI
La Segoe UI (voir figure suivante) est la police d'criture au cur de Microsoft. Elle est devenue avec le temps son instrument prfr pour ses interfaces, ses publicits et plus rcemment son logo. Elle existe en plusieurs dclinaisons que l'on peut utiliser dans des parties bien spcifiques d'une application. Comme par exemple sur des titres, o l'on utilisera la Segoe UI Light avec une grande taille pour donner une impression de grandeur, tout en gardant une certaine finesse. On peut dans un autre cas mettre en avant du contenu en affichant les titres d'article en Segoe UI Bold. Cela donne de l'importance au texte et attire trs rapidement l'il de l'utilisateur.
www.siteduzero.com
44/240
Plusieurs
Calibri
La police Calibri est quant elle ddie aux textes crits par l'utilisateur. Que ce soit des longs textes avec paragraphes ou simplement l'dition de petits champs, elle est trs utile pour faire ressortir ces zones d'dition de l'UI. C'est la police utilise dans l'dition des textes de la suite Office depuis la version 2007 (voir figure suivante).
Extrait d'un texte sur Word 2010 en Calibri Les contrles, les titres et les vues auront leur style dj dfini lorsque nous les ajouterons nos projets. Nous verrons cependant comment mettre en avant nos contenus pour qu'ils ressortent de l'UI et deviennent bien visibles pour nos chers utilisateurs.
Les animations
Les animations sont une des grandes pierres de l'difice qu'est le style de Windows 8. Elles sont l pour ajouter une grande fluidit dans les applications. Elles permettent de faire comprendre l'utilisateur le comportement qu'il peut adopter avec l'interface et comment celle-ci fonctionne. Par exemple, si l'utilisateur ajoute un lment dans une liste, on peut ajouter une animation qui montrera comment ce nouvel lment prend sa place dans la liste. Il ne faut pas hsiter en ajouter, c'est toute la force de ce style, la simplicit allie la fluidit des animations. Les quelques rgles pour avoir un bon effet dans nos applications sont : Une animation doit tre trs courte. Quitte ne faire qu'une fin d'animation, il faut garder en tte que l'utilisateur ne doit pas attendre.
www.siteduzero.com
45/240
Il nous faut mettre des animations chaque changement de page, ou chaque changement de vue. Une animation ne doit faire que peu de mouvements. Il ne faut pas que des lments partent dans tous les sens par exemple, et que les yeux du pauvre utilisateur ne sachent plus quoi regarder. La figure suivante vous montre un exemple d'animation simple.
Aperu d'une animation d'ouverture d'une page avec la dcouverte du contenu par un dfilement vers la gauche Il existe une bibliothque que nous utiliserons sans retenue, car elle contient dj pas mal d'animations, comme des transitions ou des effets de clic. Mais, bien videmment, ces animations ne remplissent pas tous les scnarios que nous aurons besoin d'utiliser. Aussi est-il possible de concevoir compltement nos propres animations.
www.siteduzero.com
46/240
App bar de l'cran de dmarrage La barre se cachera d'elle-mme lorsque l'utilisateur cliquera autre part sur l'cran, mais il est possible de la laisser affiche tout le temps.
Les commandes
Les commandes sont les boutons affichs dans l'app bar qui se composent d'une icne et d'un petit texte, comme vous pouvez le voir la figure suivante. Lorsque l'utilisateur clique ou tapote dessus, cela engendre une action programme.
Les vignettes
Sur les anciens Windows, il y avait des icnes que l'on plaait sur le bureau pour que les utilisateurs puissent lancer leurs applications. Windows 8 a fait place un nouveau genre d'icnes, qu'on appelle vignettes . Places sur l'cran de dmarrage du systme, ces grands rectangles permettent de lancer des applications, mais pas que. Maintenant, les dveloppeurs peuvent en plus y ajouter du contenu qui est mis jour dynamiquement et que les utilisateurs peuvent lire sans devoir entrer dans l'application. Sur la figure suivante, vous pouvez voir les quatre types d'affichage que peut avoir une vignette.
www.siteduzero.com
47/240
Vignettes de l'application
Mto , avec ou sans contenu En haut, vous retrouvez la vignette avec sa simple icne, et juste en dessous cette mme vignette avec du contenu. En plus de pouvoir tre dplaces et supprimes, elles ont la particularit de prendre deux formes. Une forme large en rectangle qui permet l'affichage d'un contenu plus grand, mais galement une forme carre plus petite, qui prend moins d'espace. C'est l'utilisateur qui personnalise sa page de dmarrage avec toutes ses vignettes. Il peut dcider de la taille de chacune comme de sa position, ou s'il veut carrment l'enlever. Il mettra bien videmment en premires celles dont il suit le contenu. noter qu'il existe plusieurs formats d'affichage de contenu disponibles pour les dveloppeurs, que nous retrouverons dans un chapitre totalement ddi aux vignettes.
L'action de tapoter
Appuyer et maintenir
Appuyer et maintenir (voir figure suivante) est l'quivalent du clic droit de la souris. Le but est de maintenir le doigt enfonc sur un lment. Cela permet d'afficher des informations contextuelles. Un cadre volant peut alors apparatre avec des informations plus dtailles, un menu, des boutons, etc.
www.siteduzero.com
48/240
Glisser
Le but premier de faire glisser un doigt vers l'une des extrmits de l'cran est de pouvoir faire dfiler le contenu (voir figure suivante). La navigation utilise beaucoup ce geste pour la page du hub par exemple. Il existe aussi la possibilit de faire glisser son doigt pour dessiner ou crire.
L'action de glisser
Pincer
l'origine, pincer avec deux doigts permet de dzoomer une vue (voir figure suivante). L'inverse, en faisant partir ses doigts vers lextrieur, permet de zoomer sur une vue. Mais Windows 8 intgre galement une nouvelle fonctionnalit qui s'appelle le zoom smantique, dont nous allons voir ensemble les caractristiques.
L'action de pincer
Tourner
Faire tourner deux doigts sur un lment qui le permet le fait tourner sur lui-mme (voir figure suivante). Il est possible de faire tourner ainsi des photos ou des pices de puzzle dans un jeu par exemple.
www.siteduzero.com
49/240
L'action de tourner
La majorit des contrles utilisent dj ces gestes par dfaut, vous n'aurez donc presque jamais les activer ou les programmer. Tant que vous restez dans les rgles de l'UI imposes par Microsoft, vous n'aurez jamais de problme avec les interactions tactiles.
Le zoom smantique
Cette fonctionnalit lie l'interface tactile est trs utile pour grer l'affichage de beaucoup de donnes. En pinant vos doigts sur l'cran, vous allez dzoomer du niveau des donnes sa catgorisation. Cela vous permet de naviguer dans les catgories pour revenir ensuite dans la vue de base. Si vous allez sur le Windows Store par exemple, comme la figure suivante, vous vous retrouvez avec un hub trs large, car il contient beaucoup de catgories. Le contenu prsente sur chaque catgorie quelques applications ainsi que des boutons pour voir des classifications d'applications, comme les meilleurs produits gratuits.
La page du hub du Windows Store Malheureusement, il existe beaucoup de catgories et il va vous falloir faire glisser votre cran jusqu' trouver la bonne. Grce au zoom smantique, vous allez pouvoir voir directement le nom de toutes les catgories et choisir celle qui vous concerne, comme la figure suivante.
www.siteduzero.com
50/240
La page du hub sur sa vue smantique En tapotant sur cette dernire, vous pourrez revenir sur l'affichage principal du hub directement sur la position de votre catgorie, comme si vous aviez fait dfiler votre cran, comme le montre la figure suivante.
Le hub affiche la catgorie slectionne C'est donc vous de dfinir ce que vous allez pouvoir afficher dans votre vue smantique. Testez les diverses autres
www.siteduzero.com
51/240
applications pour voir de quelle manire elles catgorisent leurs vues smantiques. Pour l'application des contacts par exemple, elle donne simplement un alphabet pour pouvoir naviguer dans les noms. Mme la page de dmarrage possde sa vue smantique, ainsi que la vue qui affiche toutes les applications (disponible via l'app bar). Les rgles d'interface sont trs dtailles pour que les dveloppeurs puissent fabriquer des interfaces homognes avec le systme. La police d'criture Segoe UI est la police au coeur de Windows 8, et plus rcemment Microsoft tout entier. Windows 8 intgre totalement le tactile avec une foule de gestes possible.
www.siteduzero.com
52/240
WinRT
Il est important de bien comprendre le noyau sur lequel nous travaillons. Toute notre application dpend aussi bien des rgles qu'il fixe que des fonctionnalits qu'il nous laisse utiliser. Nous allons voir dans ce chapitre : Ce qu'est vraiment ce noyau ; Pourquoi on est li Internet Explorer 10 ; Comment fonctionnent les tches parallles.
Architecture
Une application est automatiquement ferme sur elle-mme avec la WinRT. C'est--dire qu'elle ne pourra pas communiquer avec lextrieur, utiliser des contrles sur son interface ou quoi que ce soit d'autre sans communiquer avec la WinRT. C'est le noyau qui a tout le pouvoir pour dcider ce qu'il est possible de faire. Le schma visible la figure suivante montre l'architecture d'une application et comment elle communique avec la WinRT.
Schma de
www.siteduzero.com
53/240
Comme vous le voyez sur ce schma, nous avons tout en haut ce que voient les utilisateurs : l'application. Juste en dessous, il n'existe la possibilit que de dvelopper l'interface avec deux catgories de langages : En utilisant le combo XAML avec, au choix, C# ou Visual Basic. Il est en plus possible d'utiliser du C++ pour aller plus loin. En utilisant, et c'est notre choix ici, le combo HTML et JavaScript. Pour notre cas, le HTML est ce qu'on appelle le langage de la vue et le JavaScript le contrleur. C'est ce dernier qui va tre entre la vue et la WinRT. Il va par exemple pouvoir utiliser le noyau pour aller chercher des informations, puis ensuite revenir sur la vue pour les afficher. Il garde donc la mme fonction que lorsqu'il est utilis pour faire des sites web. En dessous des langages, vous avez ce fameux noyau. Il est trs strict car il ne nous permet que trois choses : 1. Communiquer de manire limite avec certains fichiers et certaines connexions distantes. 2. Grer les lments graphiques de l'application. 3. Utiliser des priphriques enregistrs et limits (comme une imprimante ou une webcam). Ce qui donne lieu plusieurs limitations, comme par exemple : L'impossibilit de communiquer avec une application. V ous pourrez partager du contenu, comme par exemple publier une image sur Facebook, mais seulement si l'utilisateur le souhaite et seulement certains types de contenu. Nous verrons ces dtails dans un chapitre bien plus tard. L'impossibilit de communiquer directement avec le systme. V ous ne pourrez donc pas accder des informations comme les cls de registre, des fichiers stocks certains emplacements du disque dur ou bien mme les applications du bureau. V oir les autres applications lances. Lancer votre application au dmarrage du systme. Etc.
Ds que vous excutez votre application, la page internet du Site du Zro s'ouvre dans un navigateur web. Explications :
www.siteduzero.com
54/240
Tout d'abord, nous utilisons la classe Uri, qui fait partie de la WinRT et qui permet de formater une URL partir d'un simple texte. C'est une classe qui est utilise partout et que vous utiliserez souvent. Elle permet de faire quelques oprations intressantes, comme rcuprer des paramtres ou le protocole de l'adresse. Ensuite, nous utilisons la classe Launcher, qui contient la mthode de lancement d'une adresse URL (launchUriAsync) sur le navigateur. Nous lui passons l'URL formate en paramtre et le tour est jou. Nous avons ici un bel exemple du canal que met en place la WinRT. Sans passer par elle, vous ne pourriez donc pas ouvrir de page internet. Elle est heureusement facile utiliser et se retrouve dans tout le code que vous pourriez crire. V ous pourrez donc n'importe quel moment utiliser l'espace de noms Windows.
Encapsule avec IE 10
IE est le petit nom donn au trs clbre navigateur web Internet Explorer. Il est distribu gratuitement par Microsoft sur tous ses Windows depuis les annes 90. Avec Windows 8, Microsoft lance une dixime version de son navigateur, qui comprend de belles amliorations telles que le support complet d'HTML5 et CSS3. Il dispose en plus de nombreuses autres fonctionnalits comme le support du tactile avec les gestes spciaux de Windows 8. Son moteur JavaScript, appel Chakra et qui a fait ses dbuts sur IE 9, nous revient dans une version beaucoup plus rapide. Il a t retravaill sur ses principales fonctions, notamment dans sa compilation et sa facult utiliser tous les processeurs d'une machine en mme temps. Microsoft nous dit que cette nouvelle version est 50 % plus rapide que sur IE 9. Un site complet a d'ailleurs t mis en place par Microsoft, qui vous permet de tester la puissance du navigateur (voir figure suivante).
Aperu d'Internet Explorer 10 sur Windows 8 Pour en revenir nos applications Windows 8, le fait qu'elles soient crites en HTML et JavaScript les obligent avoir un moteur de rendu pour transformer le code en vue utilisable. V ous voyez o je veux en venir ? V os applications sont affiches par IE 10, comme l'illustre la figure suivante.
www.siteduzero.com
55/240
V os fichiers de code et
Comment a fonctionne ?
Au moment de la compilation de votre application, le moteur va fabriquer une boite qui sera votre application contenant : V otre code d'un cot ; Internet Explorer 10 de l'autre ! Une fois dploye et lance, elle est alors traite par IE qui l'affiche comme si vous tiez sur une page web. V otre application n'est donc qu'un site web enferm sur lui-mme avec son propre navigateur. On lui donne le terme de sandbox, qui veut dire en anglais bac sable .
La notion d'arrire-plan
Une application Windows 8 est capable de lancer des processus parallles pour faire plusieurs travaux en mme temps. V ous pouvez par exemple crire un fichier sur le disque dur tout en lanant une animation dans l'affichage. C'est la base mme d'un systme d'exploitation et, avec les machines plusieurs processeurs dont on dispose aujourd'hui, il serait dommage de s'en priver. Nous appelons cela des tches asynchrones ou parallles. Par dfaut, le code que vous excutez est sur la tche principale qui excute l'affichage. V ous pouvez donc sans problme lancer une animation ou rcuprer une action utilisateur, comme un clic par exemple. Le souci d'une tche, c'est qu'elle ne sait faire qu'une seule chose la fois. Qu'adviendrait-il de l'affichage si vous tiez par exemple en train d'crire un trs gros fichier sur le disque ? Eh bien, elle se figerait et l'utilisateur ne pourrait plus l'utiliser tant que le fichier ne serait compltement crit. La figure suivante illustre mes propos.
www.siteduzero.com
56/240
Schma de l'architecture de tches parallles Mais n'avions-nous pas vu que, dans les grands principes de Windows 8, la fluidit en tait une pice matresse ? C'est pourquoi une rgle trs stricte a t dfinie par Microsoft : aucun travail ne peut tre fait sur la tche principale qui gre l'affichage si celui-ci dpasse le temps dexcution de 50 millisecondes . Pour ce faire, chaque fonction ou mthode, ajoute par Microsoft, qui pourrait prendre plus que ce temps lance son code dans une nouvelle tche. Pour diffrencier ces mthodes des classiques, leurs noms se terminent tous par Async . Donc lorsque vous ajoutez des fonctions qui prennent un peu de temps, il vous faut galement les lancer dans une nouvelle tche asynchrone et mettre Async la fin de leurs noms. Une application pour laquelle cette exigence ne serait pas respecte ne passerait pas la validation du Windows Store et ne serait donc pas accessible. Mais alors, une fois qu'on est sur une autre tche que celle de l'interface, peut-on continuer de toucher aux lments d'UI ? La rponse est oui . Compar beaucoup d'autres langages, JavaScript est monoprocessus. Cela veut dire qu'il bloquera lexcution de toute autre portion de code tant que celle qu'il est en train de lire n'est pas termine. En bref, tout le code que vous dvelopperez sera toujours sur la tche principale. Cependant, certaines fonctionnalits, comme la fonction setTimeout() par exemple, se permettent d'tre asynchrones et de lire du code plus tard. La bibliothque WinJS, que nous utiliserons dans le prochain chapitre, fournit une solution qui permet de retourner une valeur de fonction qui sera appele plus tard. Cela peut paratre complexe au dbut, mais nous verrons tous les dtails dans le chapitre WinJS sur l'utilisation des tches parallles. La WinRT est une nouvelle API pour les dveloppements Windows 8. La WinRT supporte JavaScript pour que les applications crites en HTML/JavaScript puissent utiliser le systme. Une application HTML/JavaScript est un groupement de pages web encapsules sous Internet Explorer 10. Un processus de code ne peut dpasser le temps dexcution de 50 ms s'il n'est pas asynchrone.
www.siteduzero.com
57/240
WinJS
Maintenant que nous avons vu les notions de la WinRT et des tches asynchrones, nous allons mettre les mains dans le cambouis et dcouvrir la bibliothque JavaScript WinJS. Ce chapitre est sans doute le plus lourd de tout ce cours. Nous allons revenir sur certaines notions JavaScript et leur interprtation dans nos projets. V ous allez voir : Toutes les notions de WinJS. Et croyez-moi, il y en a pas mal. Comment crer des tches asynchrones par le code. Grer le cycle de vie de vos applications. Il y a beaucoup lire et apprendre. C'est un gros morceau, alors prenez bien votre temps.
Pour lui ajouter une classe, en JavaScript nous ferions quelque chose comme : Code : JavaScript // La classe que nous souhaitons ajouter s'appelle blue var myClass = 'blue'; // Nous rcuprons llment DOM
www.siteduzero.com
58/240
Beaucoup de code pour pas grand-chose finalement, non ? Grce la bibliothque WinJS, il est possible de faire beaucoup plus simple, car elle utilise une fonction dj toute prte pour reproduire le code prcdent : Code : JavaScript // La classe que nous souhaitons ajouter s'appelle blue var myClass = 'blue'; // Nous rcuprons llment DOM var el = document.getElementById('myDiv'); // Nous ajoutons simplement la classe llment grce la fonction addClass() de lespace de noms Utilities de WinJS el = WinJS.Utilities.addClass(el, myClass); // La fonction nous retourne ensuite l'lment modifi // Elle s'est bien videmment charge de tester si la classe existait dj sur llment
Nous n'avons donc pas dvelopper une fonction que l'on devrait utiliser souvent, comme addClass(), puisque WinJS s'en charge dj.
www.siteduzero.com
59/240
Rfrences est un rpertoire virtuel, c'est--dire qu'il n'existe pas rellement sur votre disque dur. Il est recompos dans ce panneau pour vous permettre d'avoir accs toutes vos rfrences de projet facilement. Il rassemble toutes les bibliothques que vous lierez votre projet. Comme vous le remarquez, vous disposez dj de WinJS dans votre projet actuel. Pour utiliser WinJS dans une page, il vous faut lui ajouter trois fichiers dans son en-tte (entre les balises <head> et </head>). Un fichier CSS que vous devez choisir entre le thme sombre ou le thme lumineux, ainsi que deux fichiers JavaScript : Code : HTML <!-- vous de choisir entre ces deux thmes, pour ne laisser qu'un seul fichier --> <link href="//Microsoft.WinJS.1.0/css/ui-dark.css" rel="stylesheet" /> <link href="//Microsoft.WinJS.1.0/css/ui-light.css" rel="stylesheet" /> <script src="//Microsoft.WinJS.1.0/js/base.js"></script> <script src="//Microsoft.WinJS.1.0/js/ui.js"></script>
Comme je vous le disais, WinJS vous permet d'ajouter des contrles utilisateur. Ce sont des contrles spcialement conus par Microsoft en plus de ceux d'HTML5 dj existants. Le fichier base.js contient l'ensemble des fonctions et mthodes, tandis que ui.js contient ces fameux contrles. Si vous ouvrez votre page default.html contenu dans votre projet, vous y trouverez ces lignes dj rfrences. V ous pouvez maintenant utiliser WinJS au mme titre que Windows dans vos pages.
Nous allons voir dans cette section toutes les notions de base de WinJS. V ous allez dcouvrir comment bien structurer votre code, comment slectionner facilement des lments du DOM et comment envoyer quelques requtes AJAX.
www.siteduzero.com
60/240
C'est exactement le mme code que vous retrouvez dans default.js. Tout le code qui sera jou dans ce module ne sera pas visible de l'extrieur. En revanche, nous pourrons faire ressortir les variables et classes que nous voudrons grce la variable global ou bien grce aux mthodes d'aide proposes par WinJS que nous allons voir ensemble.
Le mode strict
Dans les derniers standards de JavaScript, il est possible d'activer un mode pour que ce langage soit plus strict. Pour ce faire, il vous faut utiliser 'use strict'; en dbut de code. V ous en avez l'exemple dans default.js : Code : JavaScript (function() { 'use strict'; // })();
Avec ce mode activ, des erreurs plus gnrales, comme oublier de mettre un var avant une variable pour la dclarer, vous seront renvoyes et bloquerons le code. Je vous conseille de toujours l'utiliser pour viter au maximum les bugs.
www.siteduzero.com
61/240
Jusqu'ici, rien de compliqu. Lorsque vous voudrez utiliser des objets du namespace, il suffira de l'appeler comme ceci : Code : JavaScript var utilisateurs = Utilisateurs; var groupes = Utilisateurs.Groupes; var robots = Utilisateurs.Robots;
www.siteduzero.com
62/240
Pour driver une classe, c'est peu prs la mme chose, sauf qu'il faut donner la classe de dpart. Nous aurons au final une nouvelle classe contenant toute la construction de son parent, mais avec de nouveaux lments : Code : JavaScript (function() { 'use strict'; // la suite de la cration de Utilisateurs.Utilisateur //Nous ajoutons au namespace une classe drive de Utilisateur Utilisateurs.UtilisateursAvecAge = WinJS.Class.derive(Utilisateurs.Utilisateur, // Le nouveau constructeur dans lequel nous ajoutons l'ge function(prenom, nom, age) { // Nous pouvons appeler le constructeur original de la classe drive en utilisant son prototype avec call() Utilisateurs.Utilisateurs.prototype.constructor.call(this, prenom, nom); this.age = age; }, // Nous ajoutons l'ge { age: 0 }, // Nous ajoutons une mthode pour avoir le nom complet avec l'ge { nomCompletAvecAge: function(utilisateur) { var nomComplet = Utilisateurs.Utilisateur.nomComplet(utilisateur); return nomComplet + ' ' + utilisateur.age + ' ans'; } } ); })(); // Notre nouvel objet var xavierBoubert26 = new Utilisateurs.UtilisateurAvecAge('Xavier', 'Boubert', 26); // La nouvelle mthode statique var nomCompletAvecAge = Utilisateurs.UtilisateurAvecAge.nomCompletAvecAge(xavierBoubert); // Retournera Xavier Boubert 26 ans
Maintenant nous souhaitons ajouter une mthode notre classe Utilisateurs.UtilisateurAvecAge. Nous allons utiliser WinJS.Class.mix(), qui permet de mixer deux objets : Code : JavaScript (function() { 'use strict'; // la suite de la cration de Utilisateurs.UtilisateurAvecAge // Nous utilisons WinJS.Class.mix pour ajouter notre classe des lments WinJS.Class.mix(utilisateurs.UtilisateurAvecAge,
www.siteduzero.com
63/240
} ); })();
// Notre nouvel objet var xavierBoubert26 = new Utilisateurs.UtilisateurAvecAge('Xavier', 'Boubert', 26); // Pour connatre son ge dans un an var ageDansUnAn = xavierBoubert26.ageDansUnAn(); // Retournera 27
Nous pouvons galement mettre dans WinJS.Class.mix() plusieurs classes la suite pour les mixer, il n'y a pas de limite. N'oubliez pas de documenter vos classes et mthodes comme nous l'avons vu dans le chapitre 3 de la premire partie. Cela vous permettra d'utiliser vos objets long terme.
Les proprits
Dans les derniers standards de JavaScript, vous pouvez utiliser des proprits la place de variables simples dans vos classes. Cela permet de sparer le code qui vous permet de mettre jour la variable du code qui permet de rcuprer sa valeur. On les utilise de cette manire : Code : JavaScript // Dfinition d'une classe en JavaScript standard var Utilisateur = function(prenom) { // Ici nous enregistrons le prnom qui n'est pas accessible publiquement var _prenom = prenom; }; // Nous dclarons maintenant une proprit prenom qui nous permet de modifier et rcuprer le prnom Object.defineProperty(Utilisateur.prototype, 'prenom', { // Le mot-cl get nous permet de mettre le code de rcupration de la proprit get: function () { return _prenom; }, // Le mot-cl set , lui, nous permet de mettre jour la proprit set: function(value) { _prenom: value; } });
WinJS inclut directement dans sa cration de classe la possibilit de crer des proprits. C'est donc trs utile et bien plus confortable que de devoir ajouter ces proprits l'extrieur de la cration d'une classe. V oici comment faire avec la mme classe
www.siteduzero.com
64/240
} );
V ous pouvez maintenant dfinir du code au moment de modifier ou rcuprer une proprit. Il est galement possible de ne pas mettre l'un des deux mots-cls get ou set pour empcher la modification ou la rcupration d'une proprit.
Code : JavaScript (function(global) { 'use strict'; // Fonction prive qui nous permet de gnrer des ID uniques var dernierID = -1; function nouvelID() { dernierID++; return dernierID;
www.siteduzero.com
65/240
// Fonction prive qui nous permet de convertir du texte en majuscules function majuscules(text) { return text.toUpperCase(); } // Cration du namespace WinJS.Namespace.define('Utilisateurs', { Utilisateur: WinJS.Class.define( function(prenom, nom) { this.prenom = prenom; this.nom = nom; // Nous utilisons ici une fonction qui est dans notre module courant, mais inaccessible lextrieur this._id = nouvelID(); }, { // Nous dfinissons des variables pseudo-prives // Qui contiendront les valeurs de nos proprits _id: -1, _yeux: 0, // Puis des variables et fonctions publiques prenom: '', nom: '', // La proprit id ne peut tre que rcupre et non mise jour // Car nous n'ajoutons pas le mot-cl set id: { get: function() { return this._id; } }, // La proprit yeux peut tre rcupre // Mais il faut qu'elle fasse partie de la liste des couleurs des yeux disponibles pour la mettre jour yeux: { get: function() { return this._yeux; }, set: function(valeur) { var yeux: for(yeux in Utilisateurs.Utilisateur.ListYeux) { if(Utilisateurs.Utilisateur.ListYeux[yeux] == valeur) { this._yeux = valeur; break; } } } }, module // Utilisation une fois encore d'une fonction prive du nomMajuscules: function() { return majuscules(this.prenom + ' ' + this.nom); }
},
www.siteduzero.com
66/240
} ) });
})(this); // Maintenant nous pouvons jouer avec la cration et modification d'un utilisateur facilement var xavierBoubert = new Utilisateurs.Utilisateur('Xavier', 'Boubert'); // Par dfaut la couleur des yeux est Inconnue // Nous la changeons donc par le marron en passant par la liste statique des couleurs xavierBoubert.yeux = Utilisateurs.Utilisateur.ListeYeux.Marrons; // Nous pouvons rcuprer son id unique var idUnique = xavierBoubert.id; // Retournera 0 car le premier id commence par 0 // Et rcuprer son nom en majuscules var nomEnMajuscules = xavierBoubert.nomMajuscules(); // Retournera XAVIER BOUBERT
www.siteduzero.com
67/240
ensuite tre excute par WinJS.UI.processAll ou WinJS.Binding.processAll. query retourne une collection d'lments rcuprs grce la requte spcifie. ready excute la fonction spcifie lorsque toute la page est compltement charge. removeClass supprime la classe spcifie de l'lment spcifi. requireSupportedForProcessing teste si la valeur spcifie est marque comme compatible pour tre excute par WinJS.UI.processAll ou WinJS.Binding.processAll. setInnerHTML appelle la mthode innerHTML d'un lment spcifi. setInnerHTMLUnsafe appelle la mthode innerHTML d'un lment spcifi en dsactivant la scurit. setOuterHTML appelle la mthode outerHTML d'un lment spcifi. setOuterHTMLUnsafe appelle la mthode outerHTML d'un lment spcifi en dsactivant la scurit. startLog configure un journal de logs qui crit des messages contenant des balises spcifies dans la console JavaScript. stopLog arrte le journal de logs qui crit des messages. toggleClass ajoute ou supprime une classe spcifie d'un lment. Si la classe est prsente, elle est supprime. l'inverse, si elle est absente, elle est alors ajoute.
WinJS propose donc deux mthodes qui permettent d'excuter du code aprs que la page a t compltement charge. Pourquoi deux mthodes ? C'est simple : WinJS.Utilities.ready() excute du code lorsque la page est compltement charge. WinJS.UI.processAll().done() excute du code lorsque les contrles UI sont galement chargs. Pour utiliser WinJS.Utilities.ready, rien de plus simple : Code : JavaScript // Nous ajoutons simplement une fonction dans le premier paramtre // Lorsque la page est ready (prte) notre fonction sera excute WinJS.Utilities.ready(function() { // notre code });
Comme je vous le disais, WinJS possde des contrles spciaux crits en JavaScript qui ajoutent des fonctionnalits
www.siteduzero.com
68/240
Les selectors
Lorsque vous fabriquez une page d'une application Windows 8, vous avez besoin de modifier des lments du DOM HTML. Par exemple, vous pourriez avoir besoin de mettre jour toutes les balises contenant une certaine classe CSS ou toutes les cases cocher d'un formulaire. Il existe une solution pour slectionner les lments que vous recherchez en excutant une requte : les selectors. V ous les utilisez dj dans tous vos fichiers CSS. Lorsque par exemple vous faites : Code : CSS div.bleu { color: blue; }
vous demandez au navigateur dattribuer un style toutes les balises <div> qui contiennent la classe CSS bleu. Avec WinJS, nous utilisons le mme type de selector. Cela nous permet de rcuprer des lments du DOM et de pouvoir ensuite jouer avec.
Nous allons jouer avec ce code plutt basique. Notre but est de changer la couleur de la premire <div> qui contient le style color: blue en une couleur rouge. Nous allons donc utiliser la fonction query du namespace WinJS.Utilities :
www.siteduzero.com
69/240
lexcution de votre application, votre premier texte devrait tre rouge. Mais attention, la requte ne renvoie pas que llment recherch mais tous les lments recherchs dans un objet QueryCollection. Cet objet est en fait une collection de tous les lments retrouvs. Il possde galement beaucoup de mthodes capables de modifier ses lments rapidement.
la diffrence de document.getElementById('id'), ici il vous sera retourn un objet QueryCollection avec comme premier lment votre <div>.
www.siteduzero.com
70/240
N'oubliez pas que, comme QueryCollection drive d'un array, vous avez donc toutes les mthodes et aides des tableaux, comme forEach() ou slice().
Les restrictions
V ous vous en doutez srement, le fait de dvelopper une application sur un systme pose forcment des problmes de scurit. Imaginez par exemple que vous alliez chercher du contenu sur un serveur distant et que vous l'affichiez directement dans votre code HTML. Si ce contenu est malicieux, vous pourriez excuter du code qui irait parler avec la WinRT et potentiellement casser votre application. Pour viter cela, le JavaScript de Windows 8 possde quelques restrictions que nous allons dcouvrir tout de suite.
www.siteduzero.com
71/240
Si vous lancez votre application, vous verrez qu'elle vous retournera une erreur. V os seuls moyens de contourner ce problme sont les suivants : V ous pouvez utiliser createElement() et donc crer tout votre DOM vous-mmes ; V ous pouvez utiliser les fonctions setInnerHTMLUnsafe et setOuterHTMLUnsafe contenues dans WinJS.Utilities, qui fonctionnent comme innerHTML et outerHTML mais sans les scurits ; V ous pouvez utiliser MSApp.execUnsafeLocalFunction(), qui dsactivera la scurit sur la portion de code que vous lui insrerez.
www.siteduzero.com
72/240
www.siteduzero.com
73/240
V oici la liste des paramtres possibles dfinir dans la requte : type (optionnel) : une chane de caractres qui spcifie la mthode HTTP. Cela peut tre GET , POST ou HEAD . Par dfaut, le type est GET . url (obligatoire) : une chane de caractres qui dfinit l'adresse URL, relative ou absolue. user (optionnel) : une chane de caractres avec le nom d'un utilisateur pour une connexion demandant une authentification. password (optionnel) : une chane de caractres avec le mot de passe d'un utilisateur pour une connexion demandant une authentification. responseType (optionnel) : une chane de caractres qui renvoie le type de la rponse d'une requte GET . Ce type peut tre : text (par dfaut) : le type est une chane de caractres. arraybuffer : le type est un arrayBuffer. Il est utilis pour retourner un tableau de donnes binaires de plusieurs lments. blob : le type est un blob. Il est utilis pour retourner des donnes binaires d'un seul lment. document : le type est un document XML pars (DOM XML). Il permet ensuite de naviguer dedans comme dans du DOM HTML. json : le type est une chane de caractres. ms-stream : le type est un format spcial de Microsoft : msStream. Il est utilis pour certaines compatibilits de donnes. headers (optionnel) : un objet dont les proprits sont utilises pour fabriquer l'en-tte de la requte. data (optionnel) : un objet qui contient les donnes passer dans la requte. Souvent utilis pour les requtes de type POST . customRequestInitializer (optionnel) : une fonction qui peut excuter du code juste avant de lancer la requte.
V oila un gros morceau du cours qui se termine. Ces notions sont trs importantes pour la suite du cours. V ous savez maintenant structurer votre code selon la mthode de WinJS et utiliser beaucoup de fonctionnalits de la bibliothque.
www.siteduzero.com
74/240
Cependant, l'utilisation des callbacks gnre des problmes : Chaque callback force tre imbriqu. On peut donc se retrouver avec un code trs peu lisible et qui contient beaucoup de callbacks les uns dans les autres. Les erreurs leves partir d'un ensemble de callbacks imbriqus peuvent ne pas tre propages jusqu' la fonction premire. Il est donc difficile de dterminer exactement o un bogue est cach. On peut ajouter l'appel des fonctions dj dfinies au lieu de faire des fonctions anonymes, mais le code devient toujours compliqu cause du nombre de fonctions possibles. Etc. C'est pour a que Microsoft a dvelopp la fonction Promise(), inclue dans la bibliothque WinJS, qui corrige ces problmes. Microsoft ne l'a pas invente, elle fait partie des derniers standards de JavaScript sans pour autant avoir t dveloppe dans tous les navigateurs. Son principe : rsoudre les problmes des callbacks en rendant le code plus simple, plus lisible et avec une meilleure gestion des erreurs. V ous pouvez grce elle : Rcuprer une valeur plus tard dans le temps lorsque le code contenu dans une Promise() est termin. Empiler les Promise() les unes aprs les autres sans imbriquer votre code. Sparer par diffrentes fonctions les erreurs, les succs ou la progression de la tche. Pour l'utiliser, rien de plus simple, vous l'avez dj vue plusieurs fois au fil des exemples du chapitre. V ous vous souvenez de la requte AJAX avec WinJS.xhr() ? Nous utilisions la fonction done() aprs la requte pour ajouter des fonctions qui rcupraient les rsultats. Eh bien, c'est parce que WinJS.xhr() retourne une WinJS.Promise(). Regardons comment fabriquer cette fameuse fonction : Code : JavaScript // Nous fabriquons ici une nouvelle instance de WinJS.Promise() et y ajoutons une fonction qui contient notre code var maPromise = new WinJS.Promise(function() { // Notre code ici });
Jusque l, c'est trs facile, le simple fait de fabriquer cet objet excute automatiquement la fonction en son sein. Nous souhaitons maintenant rcuprer les valeurs que le code de la fonction gnrera. Pour ce faire, il faut ajouter trois paramtres notre fonction : 1. Une fonction complete() qui rcuprera la valeur de retour en cas de succs. 2. Une fonction error() qui rcuprera la valeur d'erreur en cas d'chec. 3. Une fonction progress() qui rcuprera la progression de la fonction au fur et mesure. Chaque fonction est bien videmment optionnelle et c'est vous de les utiliser lorsque vous en avez besoin. V oici comment procder : Code : JavaScript // Nous passons en paramtres les fonctions complete, error et
www.siteduzero.com
75/240
} });
Maintenant que notre fonction est faite, il va nous falloir l'utiliser dans notre code et dfinir quoi faire avec les fonctions de retour.
www.siteduzero.com
76/240
V ous remarquerez que le dmarrage du setTimeout(), tout comme le rsultat de la somme, a t inscrit dans la console aprs l'excution du code Aprs l'addition . Maintenant que vous savez utiliser les tches asynchrones, nous allons voir quelques fonctionnalits bien pratiques qui nous permettent d'utiliser WinJS.Promise() avec encore plus de flexibilit.
www.siteduzero.com
77/240
Avec les WinJS.Promise() c'est pareil, vous aller pouvoir renvoyer une nouvelle tche une fois que la premire sera termine. Pour l'exemple suivant, nous allons utiliser WinJS.xhr() plusieurs fois pour rcuprer des informations sur le web sans devoir imbriquer notre code : Code : JavaScript // Nous excutons une requte simple pour rcuprer la premire page du Site du Zro WinJS.xhr({ url: 'http://www.siteduzero.com' }) // Comme WinJS.xhr() nous renvoie un WinJS.Promise(), nous pouvons utiliser then() pour grer son rsultat // Nous utilisons seulement la fonction complete(), car les autres ne nous sont pas utiles ici .then(function complete(resultat) { // la fin de la fonction, nous retournons l'excution d'une nouvelle requte // Cela aura pour effet de la retourner directement dans le then() }) return WinJS.xhr({ url: 'http://www.siteduzero.com' });
// Nous rutilisons then() pour le nouveau retour de WinJS.xhr() // Et nous pourrions continuer de retourner des Promise() encore et encore .then(function() { console.log('Bon on arrte l'); });
Beaucoup de fonctions, en plus de celles qui se terminent par Async() , retournent un objet WinJS.Promise(). V ous pouvez donc enchaner les then() et done() sans devoir imbriquer votre code.
La mthode cancel() gnrera une erreur dans l'objet. V ous aurez alors la fonction error(), qui sera appele et dans laquelle vous pourrez grer l'annulation.
www.siteduzero.com
78/240
temps donn en millisecondes. Si jamais la tche prenait plus de temps que celui dfini en paramtre, elle retournerait alors une erreur et sarrterait. V oici comment l'utiliser : Code : JavaScript // Cration d'une tche dfinie dans un timeout de 2 secondes WinJS.Promise.timeout(2000, WinJS.xhr({ url: 'http://www.siteduzero.com' }) // On place nos fonctions habituelles sur notre Promise() .then(function complete(resultat) { }, function error(erreur){ // Si le timeout arrivait chance, cette fonction error() serait alors appele }) );
Les tches asynchrones n'ont maintenant plus aucun secret pour vous. Les callbacks restent videmment toujours disponibles, mais avec tout ce que vous savez vous ne devriez plus en utiliser aucun.
Le cycle de vie
Une application Windows 8 possde trois tats dans son cycle de vie, dont elle change trs rgulirement suivant les actions de l'utilisateur et les besoins du systme. Regardons le schma la figure suivante.
Le cycle de vie d'une application Windows 8 Dtaillons ce schma, point par point : En tout premier lieu, notre application n'est pas active sur le systme. Elle le devient lorsque l'utilisateur la lance. Un cran de dmarrage apparat alors en plein cran le temps qu'elle charge ses lments, puis disparat pour faire place la premire page. L'application passe alors dans un tat dexcution , elle est active. Et elle le restera tant que l'utilisateur la gardera au premier plan. Lorsque l'utilisateur revient sur l'cran de dmarrage ou lorsqu'il passe une autre application, notre application passe alors en arrire-plan et entre dans un tat suspendu . Cela veut dire que votre code sera compltement fig, plus aucun JavaScript ne sera excut. Si l'utilisateur revient sur notre application, elle repassera dans un tat dexcution . Mais le systme peut avoir besoin de ressources. Il peut intervenir n'importe quel moment dans une application suspendue pour la fermer dfinitivement et vider compltement sa mmoire. Elle passe alors en tat arrt . C'est galement le cas si l'utilisateur ferme de lui-mme l'application.
www.siteduzero.com
79/240
Quoi qu'il arrive, une application passera toujours par l'tat suspendu avant de se fermer compltement. L'tat suspendu dure au minimum 5 secondes. V ous aurez donc toujours l'occasion de pouvoir interagir dans le code avant que l'application soit compltement ferme.
Notre but va donc tre de pouvoir bien grer ces trois tats pour que nos utilisateurs ne perdent pas de donnes et n'aient pas un affichage changeant lorsqu'ils reviennent sur l'interface de l'application.
L'tat de lancement
Lorsque vous dmarrez un nouveau projet, vous avez des parties de code dj dveloppes dans le fichier default.js. L'une d'entre elles contient tout ce qu'il faut savoir sur le code du lancement. Lorsqu'une application dmarre, elle appelle l'vnement activated de WinJS.Application. Elle renseigne quelques dtails contenus dans les paramtres de lvnement pour dfinir : Qu'elle entre dans un tat de lancement ; Ce qu'tait son prcdent tat. V ous pouvez donc placer le code que vous voulez ici, tout en sachant que c'est son premier lancement. Gnralement, il n'y a aucun code ajouter puisque l'application dmarre pour la premire fois. Elle n'a en principe aucun autre besoin que de s'initialiser tranquillement. V oyons a de plus prs : Code : JavaScript // Nous dfinissons un alias pour appeler plus rapidement WinJS.Application var app = WinJS.Application; // Nous dfinissons le code qui est excut lorsque l'vnement activated de l'application est lanc app.onactivated = function (eventObject) { // Avec le paramtre de l'vnement, nous regardons si l'application est en train de se lancer if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) { // Nous vrifions maintenant si le prcdent tat de l'application tait diffrent de arrt // Pourquoi ? Parce que le terme terminated veut dire qu'elle a dj t lance puis arrte par le systme. // Dans notre cas actuel, nous recherchons une application qui n'a pas encore t en cours d'instance (en principe le terme notRunning ) if (eventObject.detail.previousExecutionState !== Windows.ApplicationModel.Activation.ApplicationExecutionState.terminated) { // Vous pouvez placer ici votre code } // Comme nous l'avions dja vu, nous demandons WinJS de gnrer tous les contrles JavaScript de l'UI avec WinJS.UI.processAll() // N'oubliez pas que vous pouvez ajouter un .then() la fin du processAll() pour pouvoir ensuite toucher au code HTML } args.setPromise(WinJS.UI.processAll());
};
Si jamais vous vouliez utiliser cet vnement sur une autre partie de votre code, c'est tout fait possible. V ous pouvez prendre la main de cette manire :
www.siteduzero.com
80/240
L'tat suspendu
Lorsque votre application entre dans son tat suspendu, elle va appeler lvnement checkpoint. C'est ici qu'il va nous falloir sauvegarder les donnes, paramtres et statuts de l'affichage. Attention toutefois ne pas oublier que le code n'a que 5 secondes dexcution maximum. L'application est mise en suspension lorsque : L'utilisateur passe sur une autre application. L'application est mise en arrire-plan. L'utilisateur ferme l'application, avant qu'elle soit compltement arrte par le systme. V oici comment l'utiliser : Code : JavaScript // Toujours sur le mme alias, nous dfinissons le code qui est excut pour lvnement checkpoint app.oncheckpoint = function(args) { // C'est ici que vous faites vos sauvegardes de donnes et d'affichage // Si vous avez des tches asynchrones excuter, insrez les dans args.setPromise() comme pour WinJS.UI.processAll() };
Pour utiliser cet vnement dans d'autres parties de code, c'est aussi simple que pour lvnement activated : Code : JavaScript // Nous ajoutons une fonction excuter pour lvnement checkpoint WinJS.Application.addEventListener('checkpoint', function(eventObject) { // Votre code });
www.siteduzero.com
81/240
Fermeture de l'application
Lorsque l'application est dfinitivement ferme par le systme, elle est forcement passe par l'tat suspendu auparavant. Il n'y a donc plus moyen de pouvoir excuter du code. Cela arrive lorsque : L'utilisateur a ferm de lui-mme l'application. Le systme avait besoin de ressources et a donc ferm quelques applications suspendues. L'utilisateur s'est dconnect du systme.
www.siteduzero.com
82/240
Attention toutefois. Ne mettez pas jour l'affichage de votre interface sans passer par la Promise de WinJS.UI.processAll(). Nous verrons plus tard comment ruser avec l'cran de dmarrage pour qu'il dure plus longtemps ou pour faire des animations d'attente.
En cliquant sur la flche, vous pouvez utiliser les actions qui changeront l'tat de l'application : Interrompre plongera l'application dans son tat suspendu comme si vous l'aviez passe en arrire-plan. Reprendre fera revenir l'application au premier plan et la rendra active. Interrompre et quitter plongera l'application dans son tat suspendu pendant 5 secondes puis la fermera dfinitivement. Lorsque vous la relancerez ensuite, elle gardera son ancien statut terminated.
N'hsitez pas ajouter des points d'arrt dans votre code pour regarder les vnements qui sont jous en cas de changement d'tat. C'est une partie prendre en considration ds le dbut du dveloppement pour l'architecture globale de l'application. Plus vous arriverez bien grer ce changement d'tat et plus vous aurez une application fluide pour l'utilisateur. WinJS est une bibliothque JavaScript qui contient des fonctions, des classes et des objets divers pour aider les dveloppeurs dans leurs codes. WinJS permet de structurer son code en plus d'ajouter de nombreuses fonctionnalits aux applications. WinJS possde des restrictions lies des soucis de scurit, notamment au niveau de l'injection de contenu HTML directement dans les pages. WinJS permet de faire des tches asynchrones en utilisant WinJS.Promise(). Une application a un cycle de vie qui permet au systme de la dsactiver et rcuprer sa mmoire quand l'utilisateur n'en a plus le besoin.
www.siteduzero.com
83/240
Navigation et vues
Maintenant que nous savons utiliser la WinJS, nous allons dcouvrir la navigation. Nous allons voir dans ce chapitre comment : Naviguer de page en page avec JavaScript et du code HTML ; Utiliser la hirarchisation des pages dans un nouveau projet ; Styliser notre application par rapport au mode d'affichage.
Cration du projet MaNavigation Avant de regarder le code du projet, nous allons voir comment il s'utilise. Excutez-le en appuyant sur la touche F5 de votre clavier et dcouvrons-le ensemble : La premire page qui s'ouvre est le Hub. On le reconnat facilement grce ses groupements et ses grosses vignettes du contenu. V ous pouvez dfiler jusque tout droite pour dcouvrir tous les lments qu'il met en avant. Ici nous avons le
www.siteduzero.com
84/240
choix entre cliquer sur un lment ou sur le nom d'un groupe. Nous allons cliquer sur le titre du premier groupe : Group Title: 1 . Nous entrons alors dans la deuxime page de notre hirarchie, la page Section. Sur sa gauche, nous retrouvons le dtail du groupe, avec notamment une image et une description. Ensuite sur la droite, tous ses lments de contenu qui apparaissent avec le dfilement. Cliquons sur l'un de ces lments. Enfin, nous voici sur la troisime et dernire page, la page Detail. Nous y trouvons tout le dtail d'un lment, une image, du texte, etc. En plus de pouvoir descendre dans la hirarchie et naviguer au travers des pages, nous pouvons galement remonter jusqu'au Hub. Il suffit de cliquer sur la flche arrire en haut gauche de la page ou sur votre clavier la touche Retour arrire pour remonter dans l'historique de navigation. V ous pouvez essayer de naviguer dans tous les sens ; grce la hirarchisation, vous pourrez toujours revenir au Hub dans l'ordre oppos votre navigation.
Sur cet exemple, nous utilisons une adresse relative. Il est possible de mettre une adresse absolue en utilisant le protocole msappx://. Ce protocole est spcifique aux applications Windows 8. Il permet de donner une adresse lintrieur de l'application courante. Nous lui ajoutons un troisime slash ( / ) pour dire que nous sommes la racine du projet. V oici ce que a donne avec l'exemple prcdent : Code : HTML <a href="ms-appx:///page2.html">Page 2</a>
Pour naviguer avec JavaScript, il nous faut utiliser le namespace WinJS.Navigation. Il contient des proprits et fonctions trs utiles pour grer notre navigation par le code. Il utilise un historique qui mmorise les pages que l'utilisateur parcourt. Il peut ensuite remonter dans l'historique et naviguer vers de nouvelles pages. Pour naviguer directement vers une autre page, on utilise la fonction navigate() : Code : JavaScript // On navigue vers la page 2 WinJS.Navigation.navigate("/page2.html"); // navigate() tant une Promise(), il faut lui ajouter then() ou done() pour excuter du code aprs son excution
Pour naviguer en avant ou en arrire suivant l'historique, on utilise back() et forward() : Code : JavaScript // On teste si l'historique contient une page prcdente grce la proprit canGoBack if(WinJS.Navigation.canGoBack) { // On retourne sur la page prcdente
www.siteduzero.com
85/240
// On teste si l'historique contient une page suivante grce la proprit canGoForward if(WinJS.Navigation.canGoForward) { // On repart vers la page suivante WinJS.Navigation.forward(); }
Enfin, il est possible d'couter l'vnement navigated qui sera appel lorsqu'une navigation aura t produite : Code : JavaScript // On ajoute une fonction anonyme l'coute de l'vnement navigated WinJS.Navigation.addEventListener('navigated', function (args) { // args.detail contient les dtails de la navigation qui vient d'avoir lieu });
L'utilisation de PageControlNavigator est implicite, il se charge de la navigation notre place. Pour grer nos pages, il faut nous rendre dans le rpertoire pages de notre projet. Il contient un rpertoire par page, avec ses fichiers HTML, JavaScript et CSS. Pour choisir la premire page qui sera affiche lorsque l'utilisateur entrera dans l'application, vous pouvez changer la
www.siteduzero.com
86/240
Avec cette hirarchisation, vous n'avez plus vous embter pour grer la navigation et le code que vous devriez utiliser dans toutes vos pages. Il suffit de l'ajouter dans votre fichier default.js pour que toutes en profitent.
Sauvegarde de la navigation
Dans le chapitre prcdent, nous avons vu que, dans le cycle d'une application, cette dernire pouvait tre ferme par le systme n'importe quel moment. Il nous fallait alors mmoriser ses donnes mais galement sa navigation. Pour sauvegarder sa navigation, notre modle utilis a dj mis en place des lments pour nous. Dans default.js, vous trouvez ce code qui est excut lorsque l'application passe en tat suspendu : Code : JavaScript app.oncheckpoint = function (args) { // app.sessionState est un objet qui garde en mmoire des informations, mme lorsque l'application est ferme // On enregistre donc dedans l'historique de la navigation app.sessionState.history = nav.history; };
Ensuite, lorsque l'application est active, ce code-ci est jou : Code : JavaScript // Nous regardons si nous avons dj enregistr l'historique de la navigation if (app.sessionState.history) { // Si c'est le cas, nous le rcuprons directement dans l'historique actuel nav.history = app.sessionState.history; } args.setPromise(WinJS.UI.processAll().then(function () { // Lorsque tous les lments de la page default.html ont t affichs // Nous regardons si nous avons une page qui devrait tre active dans l'historique if (nav.location) { // Si c'est le cas, nous naviguons directement sur cette page nav.history.current.initialPlaceholder = true; return nav.navigate(nav.location, nav.state); } else { // Sinon, nous naviguons sur la page contenu dans l'option home return nav.navigate(Application.navigator.home); } }));
vous de jouer avec vos pages pour les remplir de contenu. V ous pouvez bien videmment en ajouter de nouvelles et modifier celles existantes.
www.siteduzero.com
87/240
Si la taille de l'cran change, nous pouvons couter l'vnement resize de Window de cette manire : Code : JavaScript window.addEventListener("resize", function(args) { // Notre vue vient de changer de taille });
Ensuite, pour rcuprer l'orientation de l'cran, nous devons utiliser la classe Windows.UI.ViewManagement.ApplicationView contenue dans la WinRT. Elle contient la valeur actuelle de l'orientation ainsi que la liste de ses orientations possibles : Code : JavaScript // Alias sur ApplicationView var appView = Windows.UI.ViewManagement.ApplicationView; // Alias sur la liste des vues var vues = Windows.UI.ViewManagement.ApplicationViewState; // Nous rcuprons l'orientation actuelle var vue = appView.value; // Puis nous testons la vue if(vue == vues.fullScreenLandscape) { // La vue est en mode paysage en plein cran // C'est la vue premire } else if(vue == vues.fullScreenPortrait) { // La vue est en mode portrait en plein cran } else if(vue == vues.snapped) { // La vue est en mode paysage en mode snapped (1/3 de l'cran) } else if(vue == vues.filled) { // La vue est en mode paysage en mode filled (2/3 de l'cran) }
88/240
Entrons maintenant dans la feuille de style principale de l'application, default.css (que vous retrouvez dans le rpertoire css). Par dfaut, tout code que vous placez dans ce fichier est automatiquement jou pour toutes les vues. V ous pouvez donc dfinir les tailles de vos lments et leurs couleurs par exemple. Ce qui va changer suivant les vues, c'est surtout la structure des conteneurs. Pour ajouter du code CSS qui ne soit utilisable que dans la vue paysage du plein cran, vous devez l'encapsuler avec @media. On y ajoute une condition sur le paramtre -ms-view-state qui devra contenir fullscreen-landscape : Code : CSS @media screen and (-ms-view-state: fullscreen-landscape) { /* Le code insr ici l'est seulement pour la vue paysage du plein cran */ }
Ensuite, pour ajouter du code seulement pour le mode portrait, la condition doit contenir fullscreen-portrait : Code : CSS @media screen and (-ms-view-state: fullscreen-portrait) { /* Code CSS pour la vue portrait */ }
La vue snapped
Pour cette vue, c'est la mme chose que pour les autres. V ous devez encapsuler votre code au moyen de @media avec la condition porte sur snapped : Code : CSS @media screen and (-ms-view-state: snapped) { /* Code CSS pour la vue snapped */ }
Attention cette vue. Elle est si petite que les lments que vous y placez doivent vraiment changer de structure. En testant votre application actuelle, vous verrez par exemple que le Hub affiche simplement le nom des groupes et que les groupes affichent le nom des lments.
La vue filled
Ici toujours pareil, avec la condition filled : Code : CSS @media screen and (-ms-view-state: filled) { /* Code CSS pour la vue filled */ }
89/240
Tant qu'on est dans la partie CSS, je vous livre une petite astuce trs sympa pour placer facilement vos lments sur l'UI. La grille est le systme qui permet, grce ses mesures, de disposer ses lments. Pour rappel : Une unit quivaut un carr de 20 pixels de large sur 20 pixels de hauteur. Une sous-unit quivaut un carr de 5 pixels de large sur 5 pixels de hauteur. Pour vous aider l'utiliser, placez ce bout de code dans votre fichier CSS, sous aucune encapsulation : Code : CSS body { background-color: black; background-image: -ms-linear-gradient(rgba(0,173,239,.3) 1px, transparent 1px), -ms-linear-gradient(0deg, rgba(0,173,239,.3) 1px, transparent 1px); background-size: 20px 20px; background-position: -1px -1px; }
Attention, c'est un code de test qu'il vous faudra commenter ou enlever pour la mise en production de votre application.
Maintenant, en lanant votre application, vous pouvez voir la grille qui apparat en arrire-plan. Elle affiche un carr par unit (soit 20 px sur 20 px). Cette astuce sera d'autant plus utile lorsque nous utiliserons Blend pour le rendu de nos affichages et animations. Une structure hirarchique a t mise au point pour la cration de pages dans une application Windows 8, qu'il est fortement recommand d'utiliser. Il est possible de styliser ses trois types de vues savoir : plein cran, Snapped et Filled.
www.siteduzero.com
90/240
Modliser sa vue
En tant que dveloppeurs de sites internet, vous tes sans doute habitus crire d'un ct le code HTML et de l'autre le code JavaScript. Mais il n'est pas toujours facile de bien sparer les deux. Il arrive bien souvent que du code HTML finisse dans du code JavaScript et que vous ayez dfinir des proprits du DOM HTML avec JavaScript. C'est pourquoi, dans ce chapitre, nous allons voir deux fonctionnalits trs importantes de WinJS qui permettent de bien sparer votre code en vous assistant le plus possible pour ne pas avoir modifier systmatiquement vos vues avec du JavaScript. Nous dcouvrirons galement un nouveau logiciel et apprendrons l'utiliser. V oici ce que vous allez dcouvrir : Microsoft Blend : un logiciel qui permet de fabriquer des vues en temps rel avec du HTML et du CSS ; Le binding , qui permet de connecter un objet JavaScript au DOM HTML ; Les templates, qui permettent de gnrer des vues HTML en utilisant des donnes d'objets JavaScript.
Les bindings
Avoir JavaScript entre l'affichage et les donnes d'une application en fait un contrleur. C'est lui qui place les donnes aux bons emplacements de l'interface et en rcupre de nouvelles via l'utilisateur. Il est toujours fastidieux de devoir rcuprer les lments dans le DOM HTML pour les mettre jour, surtout lorsqu'il s'agit de grosses donnes dont il faut gnrer les diffrents types d'affichage. C'est pourquoi la bibliothque WinJS contient une fonctionnalit trs importante qui permet de ne plus se soucier de ces problmes et pour les grer notre place : le binding , qui sert connecter des donnes d'objets JavaScript directement des lments du DOM HTML. La plus grande valeur ajoute de cette fonctionnalit est la dissociation entre le code de dveloppement des vues et le code mtier. V ous l'aurez compris, le but est de distribuer aux graphistes et intgrateurs HTML le travail de l'affichage avec le HTML et le CSS, tandis que les dveloppeurs mtier s'occupent du JavaScript et des donnes. Il ne doit plus y avoir le moindre code HTML dans les fichiers JavaScript. Pour les dveloppeurs mtier, l'outil principal utilis est Visual Studio avec lequel nous travaillons depuis le dbut du tutoriel. Pour les intgrateurs et graphistes, il existe un autre outil qui a t install avec Visual Studio : Microsoft Blend. Nous allons apprendre l'utiliser pour pouvoir modliser nos vues.
Microsoft Blend
Blend est un diteur de documents HTML similaire Dreamweaver, mais spcifiquement cr pour les applications Windows. Il va nous tre trs utile dans la composition de notre interface avec une vue en temps rel de l'affichage final. V ous pouvez utiliser Blend et Visual Studio ouverts en mme temps sur le mme projet. Lorsque vous modifierez des fichiers sur l'un, l'autre se mettra automatiquement jour. Lancez Blend et ouvrez notre dernier projet MaNavigation pour avoir la mme vue que sur la figure suivante.
www.siteduzero.com
91/240
En cliquant dessus, vous pourrez parcourir votre application comme si elle tait lance. En cliquant une nouvelle fois sur l'icne, vous reviendrez l'affichage principal, mais en gardant la vue dans laquelle vous avez navigu. V ous pouvez alors modifier vos nouveaux lments affichs.
Rgles de styles
Pour crer de nouvelles rgles de styles, regardez le panneau Rgles de styles sur la colonne de gauche. En cliquant sur le + ct de default.css par exemple, vous allez pouvoir crer une nouvelle rgle. V ous pouvez ensuite l'associer un lment avec le panneau Attributs HTML que nous venons de voir.
Projets
Pour voir tous les fichiers de votre projet, utilisez le panneau Projets dans la colonne de gauche. Il est exactement pareil sur Visual Studio. V ous pouvez ainsi ouvrir toutes vos pages HTML et en crer des nouvelles.
Composants
Pour ajouter de nouveaux lments au code, vous disposez d'un panneau Composants juste aprs Projets. Cliquez et dposez un lment directement l'endroit dsir dans la vue pour l'ajouter. V ous disposez de contrles HTML, HTML5, mais galement de contrles spcifiques crs en JavaScript. Nous apprendrons bientt comment les utiliser et comment crer les ntres.
DOM actif
V ous tes-vous rendu compte que, dans la vue centrale, vous arrivez voir le code jou comme si l'application tait lance ? De mme que le code HTML au-dessus est compos de ses donnes, ce qui n'a rien voir avec le code de base que vous avez crit
www.siteduzero.com
92/240
dans default.html. Le principe de Blend est de pouvoir modifier les lments comme s'ils taient en train d'tre excuts. Si vous modifiez un lment jou, vous modifierez son modle directement ! Et pour bien pouvoir naviguer dans ces lments, vous avez un panneau DOM actif en bas de votre colonne de gauche qui reprsente l'arbre du HTML.
Appareil
Enfin, le dernier panneau est Appareil, qui se situe juste aprs le DOM actif et vous permet de modifier la simulation de votre vue centrale. V ous allez ainsi pouvoir l'utiliser avec un affichage snapped , filled , portrait, ou bien mme dans des rsolutions d'cran diffrentes. V oil pour Blend. Prenez un peu le temps pour l'utiliser et le prendre en main. V ous savez maintenant comment il fonctionne et vous allez pouvoir grer vos affichages avec un outil trs puissant.
Le binding
Le binding est la fonctionnalit qui permet de connecter des objets JavaScript des lments HTML. WinJS nous permet de paramtrer un objet JavaScript qui ira modifier automatiquement des lments HTML, avec lesquels il est branch, lorsqu'il sera modifi. Attention en revanche, si les lments HTML sont modifis par quelque chose d'autre, comme une intervention de l'utilisateur par exemple, ils ne mettront pas jour l'objet JavaScript. Le branchement ne s'effectue que dans un seul sens. Nous allons prendre un exemple concret. Nous voulons afficher le nom d'un utilisateur slectionn partir d'une liste dans une phrase simple. Nous avons un bouton qui va se charger de faire la slection de cet utilisateur et, une fois cela fait, la phrase devra se mettre jour d'elle-mme. Retournons sur Visual Studio, puis ouvrons un nouveau projet sur le modle Application vide et appelons-le Modelisation . Si vous ouvrez le fichier default.js, vous remarquerez une ligne dont on n'a encore jamais parl : Code : JavaScript WinJS.Binding.optimizeBindingReferences = true;
Cette ligne est trs importante. Elle permet de dire explicitement WinJS que nous utilisons les bindings. Sans cette ligne, nous pourrions avoir des fuites de mmoire et ne pas passer la validation lors de la publication sur le Windows Store. Faites donc bien attention toujours l'utiliser. Commenons par fabriquer notre phrase dans le HTML. Remplacez tout ce qu'il y a dans <body> par : Code : HTML <p> Hello, je suis <span id="utilisateurSpan"></span> </p> <button id="selectionBouton">Slectionner un utilisateur</button>
Ici, rien de compliqu, nous avons notre phrase avec un <span> vide qu'il conviendra de complter par le nom de l'utilisateur. Nous avons ajout galement un bouton qui va nous permettre de slectionner l'utilisateur en question. Maintenant, passons au JavaScript. Dans votre fichier default.js, nous allons ajouter du code qui va tre excut aprs le chargement de la page. Nous plaons ce code juste aprs app.start(); : Code : JavaScript WinJS.Utilities.ready(function () { // Nous dfinissons une petite liste d'utilisateurs avec leur nom et une couleur
www.siteduzero.com
93/240
Habituellement, pour mettre le nom dans le <span>, nous utiliserions quelque chose comme innerHTML : Code : JavaScript // On rcupre le premier utilisateur var selectionUtilisateur = Utilisateurs[0]; // Puis on affiche son nom via innerHTML utilisateurSpan.innerHTML = selectionUtilisateur.nom;
Mais il faudrait chaque fois rpter ce code pour chaque changement d'utilisateur. Sans compter la possibilit d'ajouter d'autres champs comme la couleur par exemple. Nous allons donc connecter l'objet de l'utilisateur au <span> grce au binding : Code : JavaScript WinJS.Utilities.ready(function () { var Utilisateurs = [{ nom: 'Xavier', couleur: 'red' }, { nom: 'Guillaume', couleur: 'yellow' }, { nom: 'Sandra', couleur: 'green' }]; var utilisateurSpan = document.getElementById('utilisateurSpan'); // On rcupre le premier utilisateur var selectionUtilisateur = Utilisateurs[0]; // Nous demandons WinJS d'appliquer les donnes de l'utilisateur dans l'lment grce la mthode processAll de WinJS.Binding // Il suffit de lui passer en paramtre l'lment du DOM concern et l'objet dont il tirera les donnes WinJS.Binding.processAll(utilisateurSpan, selectionUtilisateur); // Puis nous fabriquons une source de binding sur l'utilisateur, qui sera le lien de la connexion var bindingSource = WinJS.Binding.as(selectionUtilisateur); });
La variable bindingSource est trs importante. C'est la reprsentation de l'objet qui nous a servi la crer et qui modifiera
www.siteduzero.com
94/240
Maintenant que le <span> reoit des donnes, il faut lui dire quoi utiliser. Pour cela, nous utilisons l'attribut data-win-bind qui contient le nom des proprits dont on tire les infos de l'objet. Modifiez votre <span> avec le code suivant : Code : HTML Hello, je suis <span id="utilisateurSpan" data-win-bind="innerText: nom; style.color: couleur"></span>
Dans l'attribut data-win-bind, il faut donner le nom de la proprit de l'lment modifier avec le nom de la proprit de l'objet de donnes. Dans notre exemple, c'est comme si nous crivions : Code : JavaScript document.getElementById('utilisateurSpan').innerText = bindingSource.nom; document.getElementById('utilisateurSpan').style.color = bindingSource.couleur;
En excutant votre code, vous verrez que votre <span> aura bien le nom de l'utilisateur avec une couleur de texte rouge. Et pour montrer qu'en changeant la source du binding nous changeons le contenu du HTML, nous allons ajouter ces quelques lignes la suite pour utiliser le bouton : Code : JavaScript // Nous ajoutons l'vnement click sur le bouton document.getElementById('selectionBouton').onclick = function () { // Nous slectionnons alatoirement un utilisateur var utilisateurIndex = Math.floor(Math.random() * 3); var utilisateur = Utilisateurs[utilisateurIndex]; // Puis nous changeons les proprits de la source. bindingSource.nom = utilisateur.nom; bindingSource.couleur = utilisateur.couleur;
Excutez votre code, puis cliquez plusieurs fois sur le bouton. La phrase change automatiquement avec des noms et des couleurs d'utilisateurs diffrents. Maintenant, vous savez comment utiliser de manire simple les bindings. V ous allez pouvoir connecter vos objets et les modifier sans devoir traiter l'affichage. Avec cet exemple, on se rend bien compte du partage entre le dveloppeur qui se charge du code mtier et l'intgrateur qui se charge des vues. L'intgrateur utilise les proprits qu'il souhaite des objets mtier et le dveloppeur n'a plus devoir modifier des vues dans son code JavaScript. Attention toutefois, le binding utilise les id des lments. Il est donc obligatoire de ne jamais utiliser le binding sur un ID d'un lment HTML.
www.siteduzero.com
95/240
Nous allons crer une fois encore un nouveau projet que nous nommons ModelisationComplexe . Dans notre code HTML, nous changeons tout ce qui se trouve dans la balise <body> par : Code : HTML <p> Hello, je suis <span id="utilisateurSpan"></span> </p> <button id="selectionBouton">Slectionner un utilisateur</button>
Cette fois-ci, nous n'utilisons pas data-win-bind dans notre <span>, car nous allons dvelopper nous-mmes nos actions lorsque les objets seront modifis. Dans notre code JavaScript, revenons sous la ligne app.start(); du fichier default.js. Nous allons y ajouter la cration d'une classe toute simple d'un utilisateur : Code : JavaScript var Utilisateur = WinJS.Class.define(function (premierNom, premiereCouleur) { this.nom = premierNom; this.couleur = premiereCouleur; });
Nous avons dj vu comment crer une classe, mais pour rappel nous ne dfinissons ici que le constructeur avec deux proprits qui contiennent le nom et la couleur de l'utilisateur. Ce que nous souhaitons faire, c'est pouvoir utiliser le binding sur ces deux proprits pour chaque instance de classe cre. Pour que cette classe puisse utiliser le binding, il est ncessaire de l'tendre avec des mthodes spciales contenues dans la bibliothque WinJS. Nous allons lui ajouter la mthode bind() contenue dans WinJS.Binding.mixin, qui permet de connecter une proprit. Nous allons galement lui ajouter WinJS.Binding.expandProperties qui permet d'tendre les proprits dont on souhaite activer le binding. Pour ce faire, ajoutez ce code la suite : Code : JavaScript // Nous utilisons mix() qui permet d'tendre le premier objet pass en argument avec les suivants WinJS.Class.mix( Utilisateur, // Nous ajoutons mixin qui contient la mthode bind() WinJS.Binding.mixin, // Puis expandProperties() avec la liste des mthodes que l'on souhaite tendre WinJS.Binding.expandProperties({ nom: '', couleur: '' }) );
partir de maintenant, notre classe est presque utilisable pour utiliser le binding. Je dis presque parce qu'il nous manque une fonction qui doit initialiser le binding : _initObservable(). Il faut placer cette fonction au tout dbut du constructeur de notre classe. Ce qui nous donne comme dfinition de classe : Code : JavaScript var Utilisateur = WinJS.Class.define(function (premierNom, premiereCouleur) { // Initialisation du binding this._initObservable();
www.siteduzero.com
96/240
Maintenant, retrouvons le code que nous avions avec notre liste d'utilisateurs. Ajoutez ce code directement la suite : Code : JavaScript WinJS.Utilities.ready(function () { var Utilisateurs = [{ nom: 'Xavier', couleur: 'red' }, { nom: 'Guillaume', couleur: 'yellow' }, { nom: 'Sandra', couleur: 'green' }]; });
Juste sous la liste, nous allons crer une nouvelle instance d'un utilisateur : Code : JavaScript var monUtilisateur = new Utilisateur('Xavier', 'red');
Maintenant que notre utilisateur existe, nous allons dfinir ce qu'il se passe lorsque son nom et sa couleur changent. Pour ce faire, nous devons utiliser la mthode bind() qui va connecter nos proprits des fonctions. Ces fonctions seront excutes chaque fois que les proprits changeront. nous de dfinir ce que nous souhaitons faire avec. Ajoutez le code suivant la suite pour connecter nos deux proprits au <span> : Code : JavaScript // Nous utilisons bind() pour connecter la proprit nom une fonction anonyme monUtilisateur.bind('nom', function (nouvelleValeur) { // Puis nous plaons la nouvelle valeur dans le contenu du <span> document.getElementById("utilisateurSpan").innerText = nouvelleValeur; }); // Pareil pour la proprit couleur monUtilisateur.bind('couleur', function (nouvelleValeur) { document.getElementById("utilisateurSpan").style.color = nouvelleValeur; });
partir de maintenant, chaque fois qu'une de nos proprits changera, le <span> sera automatiquement modifi. Pour montrer une fois encore comment cela fonctionne, ajoutons ce dernier morceau de code la suite pour pouvoir utiliser notre bouton : Code : JavaScript
www.siteduzero.com
97/240
En cliquant plusieurs fois sur votre bouton, vous devriez voir apparatre des noms diffrents avec des couleurs diffrentes tout comme dans notre exemple prcdent. V ous savez prsent utiliser les bindings sur des petits objets comme sur des classes plus complexes. vous de spcifier ce que vous souhaitez dans les fonctions utilises dans bind().
Les templates
Pour nous aider dans la cration d'affichages, la WinJS possde une fonctionnalit qui permet de grer des modles de vues. Le but est de pouvoir utiliser du code HTML dj prt en l'insrant dans le DOM lorsqu'on en a besoin. Ces modles, ou templates comme on les appelle, peuvent tre utiliss en les combinant avec des objets JavaScript pour y insrer des paramtres, variables, classes CSS, etc. Nous allons apprendre les utiliser avec des bindings pour grer des vues dtailles sans devoir toucher directement au DOM avec le code JavaScript. Dans notre prochain exemple, nous souhaitons crer un modle HTML d'un cadre contenant les informations d'un utilisateur. Nous avons une liste de plusieurs utilisateurs et nous voulons gnrer un cadre par utilisateur. Notre but est de bien sparer le code HTML du code JavaScript, il ne doit y avoir aucun code de l'un chez l'autre. Commenons par crer un nouveau projet Application vide dans Visual Studio, et appelons-le Modeles . Dfinissons tout de suite le code HTML pour dfinir notre affichage. Placez le code suivant la place de ce que contient la balise <body> dans le fichier default.html : Code : HTML <!-Tout d'abord, nous dfinissons notre modle. Nous n'avons pas encore vu les contrles, mais n'ayez crainte, vous allez comprendre. Nous dfinissons simplement le type de contrle avec l'attribut data-win-control. Ici, c'est un template. Tout ce qui est contenu dans cette balise ne sera pas affich sur la page de l'utilisateur. En revanche, elle sera sauvegarde en mmoire pour pouvoir l'utiliser avec du JavaScript. --> <div id="modeleDIV" data-win-control="WinJS.Binding.Template"> <!- lintrieur de notre template, nous ajoutons notre code qui sera gnrique chaque utilisateur. Nous utilisons les proprits de l'objet utilis dans le template de la mme manire qu'avec un binding classique --> <div data-win-bind="style.background: couleur"> <p> <span style="font-size: 200%;">Nom : <span data-winbind="textContent: nom"></span></span><br /> Age : <span data-win-bind="textContent: age"></span> </p> </div> </div> <!-- Nous ajoutons ensuite un bouton qui excutera le code. --> <button id="donnerResultat">Donner le rsultat</button> <!-- Et enfin nous ajoutons une <div> qui contiendra le rsultat
www.siteduzero.com
98/240
Maintenant que notre code d'affichage est crit, passons au JavaScript. Nous allons tout de suite dfinir notre liste de donnes des utilisateurs. Nos utilisateurs sont des instances d'un objet qui utilise le binding. C'est lui qui va permettre de connecter une fois encore ses proprits aux lments du DOM HTML de la vue. Et cette fois-ci, il se connectera au template. Ajoutez le code suivant sous la ligne app.start(); du fichier default.js : Code : JavaScript // Pour crer un objet qui utilise totalement le binding sur toutes ses proprits, la fonction WinJS.Binding.define() nous permet de le faire trs simplement. // Rien ne vous empche de le faire comme nous l'avons vu dans la section prcdente. var Utilisateur = WinJS.Binding.define({ nom: '', couleur: '', age: 0 }); // Nous fabriquons var utilisateurs = new Utilisateur({ new Utilisateur({ new Utilisateur({ ]; ensuite la petite liste d'utilisateurs [ nom: 'Xavier', couleur: 'red', age: 26}), nom: 'Sandra', couleur: 'green', age: 25 }), nom: 'Guillaume', couleur: 'yellow', age: 24 }),
Nous avons notre template d'un ct, nos utilisateurs de l'autre. Entrons dans la partie intressante du sujet, le code qui va permettre de combiner les deux. Le principe est simple: au clic sur le bouton, nous allons rcuprer le contrle du template. Pour chaque utilisateur, nous allons gnrer un code HTML partir du template combin l'utilisateur en question. Ajoutez ce code la suite du prcdent : Code : JavaScript WinJS.Utilities.ready(function () { document.getElementById('donnerResultat').onclick = function () { // Nous rcuprons le template inclus dans le code mais masqu, ainsi que la <div> qui contiendra le rsultat final var modele = document.getElementById("modeleDIV"); var resultat = document.getElementById("resultatDIV"); // Nous bouclons sur chaque utilisateur for (var index = 0; index < utilisateurs.length; index++) { // Nous utilisons maintenant la proprit winControl du template qui contient la fonction render() qui permet de fusionner le code du template un lment // Nous lui ajoutons en paramtre l'utilisateur courant modele.winControl.render(utilisateurs[index]) .done(function (result) { // Une fois que le code est gnr, nous l'ajoutons dans la <div> du rsultat final resultat.appendChild(result); }); } }
www.siteduzero.com
99/240
V ous pouvez maintenant excuter votre projet, puis cliquer sur le bouton. V ous devriez voir trois cadres gnrs, utilisant la liste des utilisateurs avec pour chacun un nom, un ge et une couleur de fond diffrents. Avec les bindings et les templates, vous pouvez maintenant bien sparer votre code et rendre chaque langage sa fonction. Si vous devez modifier seulement la vue, vous n'avez plus besoin de toucher au JavaScript. Il vous suffit de modifier vos templates, d'y ajouter des lments qui utilisent les proprits des objets comme bon vous semble. Pareil du ct JavaScript, vous n'avez plus la ncessit de modifier du CSS ou des lments directement dans votre code, seule la structure de vos donnes compte. Blend est le logiciel qui permet de manager les vues de ses applications. Le binding est la fonctionnalit qui permet de connecter des objets JavaScript des lments HTML. Les templates permettent de grer des modles de vues combines des lments JavaScript.
www.siteduzero.com
100/240
Ici, c'est un peu grossier, mais c'est pour que vous compreniez bien que ce n'est pas du tout quelque chose dpendant du navigateur, mais bien du simple HTML gnr par JavaScript. Pour utiliser un contrle, deux choix s'offrent nous : Nous pouvons le dfinir directement dans le code HTML pour qu'il soit gnr automatiquement lors de la cration de la page. Nous pouvons le gnrer manuellement la vole avec JavaScript.
www.siteduzero.com
101/240
Au lancement de la page, WinJS gnrera le contrle et vous affichera la figure suivante. Affichage du contrle TimePicker
quel moment WinJS gnre-t-il ces contrles ? V ous vous souvenez de la fonction WinJS.UI.processAll() utilise dans le fichier default.js ? Eh bien, c'est elle qui construit chacun des contrles de manire asynchrone. C'est pourquoi nous ajoutions un then() juste aprs, pour pouvoir toucher au DOM HTML une fois tous les contrles mis en place sur la page.
Code : JavaScript // On rcupre l'lment HTML du DOM var maDivElement = document.getElementById('maDiv'); // On transforme l'lment en TimePicker en ajoutant les paramtres avec un objet dans le second argument var monTimePicker = new WinJS.UI.TimePicker(maDivElement, { current : '12:30:30' });
Chaque contrle a en plus des mthodes qui lui sont propres. Pour accder ces mthodes, il faut passer par la proprit winControl attribue directement l'lment : Code : JavaScript var controleTimePicker = document.getElementById("monTimePicker").winControl;
www.siteduzero.com
102/240
Avec ce paramtre, vous pouvez interagir sur la classe JavaScript qui a servi crer le contrle, comme WinJS.UI.TimePicker par exemple. Chaque type possde ses propres mthodes et proprits que nous allons voir dans cette section. Il est galement possible de grer des vnements spciaux en plus des classiques. Lors de l'utilisation de addEventHandler() sur un lment du DOM directement (et non sur winControl), nous pouvons habituellement ajouter des click, mousemove et autres vnements. Pour ces contrles, c'est exactement la mme chose, sauf que vous avez de nouveaux vnements attribus chaque type de contrle. Nous en verrons la liste galement dans cette section.
la suite de cela, il est possible de styliser chacun de nos contrles en surchargeant leurs classes CSS. Dans la liste des contrles qui va suivre, je vous mets pour chacun d'eux le nom de ses styles surcharger pour pouvoir le modifier. N'hsitez pas utiliser l'explorateur de DOM au moment de l'excution de votre application pour explorer les dtails des lments des contrles.
Les contrles
V oici la liste de tous ces nouveaux contrles tablis dans la WinJS. Je vous livre ici tout ce qu'il faut savoir sur la manire de les utiliser. Je vous conseille de les tester avant de les ajouter vos interfaces, certains sont un peu spcifiques, comme l'AppBar par exemple.
TimePicker
Nous venons de le voir, WinJS.UI.TimePicker permet l'utilisateur de slectionner une heure. Le contrle dispose de deux listes de slection spcifiant l'heure et les minutes. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.TimePicker"></div>
Par dfaut, il prend l'heure actuelle. Cela nous donnera la figure suivante. Le contrle affiche l'heure actuelle
V oici sa liste des options configurables : clock : permet de choisir le type de temps, bas sur 12 ou sur 24 heures. En choisissant 12 heures, cela ajoute une troisime liste contenant AM et PM.
www.siteduzero.com
103/240
current : permet de spcifier une heure par dfaut au format '00:00:00'. disabled : permet de dsactiver le contrle en le spcifiant true. hourPattern : permet de formater la structure du chiffre de l'heure. savoir avec un zro ou non devant s'il n'y a qu'un chiffre. minuteIncrement : permet de spcifier le choix d'incrmentation des minutes dans la liste pour l'utilisateur. minutePattern : permet de formater la structure du chiffre des minutes. savoir avec un zro ou non devant s'il n'y a qu'un chiffre.
V oici sa liste d'vnements utilisables : onchange: survient lorsque les heures ou les minutes sont changes.
V oici sa liste de classes CSS : win-timepicker : stylise le contrle. win-timepicker-hour : stylise spcifiquement le champ de l'heure. win-timepicker-minute : stylise spcifiquement le champ des minutes. win-timepicker-period : stylise spcifiquement le champ des priodes (AM/PM).
DatePicker
WinJS.UI.DatePicker permet l'utilisateur de slectionner une date. Le contrle dispose de trois listes de slection spcifiant le jour, le mois et l'anne. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.DatePicker"></div>
Par dfaut, il prend la date actuelle. Cela donnera la figure suivante. Le contrle affiche la date actuelle
V oici sa liste des options configurables : calendar : permet de spcifier le type de calendrier. Les valeurs possibles sont : GregorianCalendar, HijriCalendar, HebrewCalendar, JapaneseCalendar, KoreanCalendar, ThaiCalendar, TaiwanCalendar, UmAlQuraCalendar, JulianCalendar. current : permet de dfinir une date par dfaut. datePattern : permet de formater la structure du chiffre du jour. disabled : permet de dsactiver le contrle en le spcifiant true. maxYear : permet de dfinir une limite suprieure de choix d'une anne. minYear : permet de dfinir une limite infrieure de choix d'une anne. monthPattern : permet de formater la structure du mois. yearPattern : permet de formater la structure du chiffre de l'anne.
V oici sa liste d'vnements utilisables : onchange: survient lorsqu'une des valeurs de la date est change.
www.siteduzero.com
104/240
FlipView
WinJS.UI.FlipView permet de crer un carrousel avec du contenu HTML affich sous forme de pages. On peut y mettre des images, du texte, des vidos, etc. L'utilisateur peut naviguer directement dessus avec quatre boutons disponibles, suivant son orientation, contenant des flches chaque extrmit du contrle : haut, droite, bas et gauche. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.FlipView"></div>
La figure suivante est un exemple de ce qu'il est possible de faire avec ce contrle.
titres V oici ses options : currentPage: spcifie l'index (numrique) de la page afficher. itemDataSource: spcifie la source des donnes (binding) des lments afficher. itemSpacing: spcifie l'espace entre chaque lment, en pixels. itemTemplate: spcifie le template utilis pour chaque lment. orientation: spcifie l'orientation du contrle, savoir horizontal ou vertical.
V oici ses vnements : ondatasourcecountchanged : survient lorsque le nombre d'lments de la source change. onpagecompleted : survient lorsque le contrle tourne sur une page et qu'elle est compltement affiche. onpageselected : survient lorsque le contrle tourne sur une page. onpagevisibilitychanged : survient lorsqu'un lment devient visible ou invisible.
V oici ses mthodes : count : retourne le nombre d'lments inclus dans la source du contrle (binding).
www.siteduzero.com
105/240
forceLayout : force le contrle rafrachir sa vue. next : navigue vers la prochaine page. previous : navigue vers la prcdente page. setCustomAnimations : dfinit une animation spcifique qui remplace celle utilise dans la navigation des pages.
V oici ses classes CSS : win-container : stylise le conteneur de chaque lment du contrle. win-flipview : stylise le contrle. win-item : stylise chaque lment du contrle. win-navbottom : stylise le bouton de navigation du bas. win-navleft : stylise le bouton de navigation de gauche. win-navright : stylise le bouton de navigation de droite. win-navtop : stylise le bouton de navigation du haut.
ListView
WinJS.UI.ListView permet de crer une liste d'lments HTML utilisant le binding sur une source de donnes. Il est ainsi possible de crer une vue complte compose d'lments utilisant des images, du texte, des vidos, etc. C'est un des contrles les plus utiliss pour gnrer des vues. Nous l'avons dj utilis lorsque nous avons travaill sur l'architecture des pages. Le Hub, par exemple, est compos d'une ListView contenant des lments rangs dans une liste. Il est galement possible de rassembler les lments de la source de donnes par groupes pour structurer l'affichage avec des titres. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.ListView"></div>
La figure suivante est un exemple de ce qu'il est possible de faire avec ce contrle.
Une liste
d'lments avec une barre de dfilement pour naviguer dans le contrle V oici ses options : automaticallyLoadPages : spcifie si le prochain jeu de pages est automatiquement charg lorsque l'utilisateur navigue dans le nombre de pages spcifi par la proprit pagesToLoadThreshold. currentItem : met le focus sur l'lment.
www.siteduzero.com
106/240
groupDataSource : spcifie la source de donnes (binding) qui contient les groupes des lments de la proprits itemDataSource. groupHeaderTemplate : spcifie le template utilis pour chaque entte de groupe de la proprit groupDataSource. indexOfFirstVisible : spcifie le premier lment visible. indexOfLastVisible : spcifie le dernier lment visible. itemDataSource: spcifie la source des donnes (binding) des lments afficher. itemTemplate: spcifie le template utilis pour chaque lment. layout : spcifie le type de structure de vue qu'aura le contrle. loadingBehavior : spcifie le nombre d'lments charger dans le DOM HTML. loadingState : indique si le contrle est en train de charger. pagesToLoad : spcifie le nombre de pages charger lorsque l'utilisateur navigue. pagesToLoadThreshold : spcifie le nombre maximum de pages charger. resetGroupHeader : spcifie la fonction qui est appele lorsque le contrle recycle l'lment principal d'un entte de groupe. resetItem : spcifie la fonction qui est appele lorsqu'un lment est supprim, modifi ou sort en dehors de la plage de donnes du contrle. scrollPosition : retourne la distance entre le premier lment et la zone actuelle visible du contrle. selection : retourne une plage des lments slectionns. selectionMode : spcifie le mode de slection du contrle. swipeBehavior : spcifie la manire dont doit ragir le contrle lorsque l'utilisateur tente de slectionner un lment. tapBehavior : spcifie la manire dont doit ragir le contrle lorsque l'utilisateur clique dessus. zoomableView : retourne une vue zoomable qui supporte la vue smantique.
V oici ses vnements : oncontentanimating : survient lorsque le contrle va jouer une animation. oniteminvoked : survient lorsqu'un lment est cliqu. onkeyboardnavigating : survient lorsqu'un lment prend le focus. onloadingstatechanged : survient lorsque le contrle passe d'un statut de chargement un statut prt . onselectionchanged : survient lorsqu'un lment est slectionn. onselectionchanging : survient juste avant qu'un lment soit slectionn.
V oici ses mthodes : elementFromIndex : retourne l'lment DOM l'index spcifi. ensureVisible : rend l'lment de l'index spcifi visible. Le contrle navigue jusqu' l'lment s'il n'est pas dans la zone visible. forceLayout : force le contrle rafrachir sa vue. indexOfElement : retourne l'index de l'lment DOM spcifi. loadMorePages : charge la prochaine srie de pages. recalculateItemPosition : repositionne tous les lments visibles pour ajuster leur taille. triggerDispose : appelle manuellement la destruction du contrle.
V oici ses classes CSS : win-container : stylise le conteneur de chaque lment du contrle. win-groupheader : stylise l'entte de chaque groupe. win-item : stylise chaque lment du contrle. win-listview : stylise le contrle. win-progress : stylise l'indicateur de progression. win-selectionbackground : stylise le fond d'un lment slectionn. win-selectioncheckmark : stylise l'lment slectionn. win-surface : stylise la zone navigable du contrle. win-viewport : stylise la vue globale du contrle.
Rating
www.siteduzero.com
107/240
WinJS.UI.Rating permet de crer un composant de classement. Il donne l'utilisateur la possibilit de cliquer sur des toiles pour dfinir une note. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.Rating"></div>
La figure suivante vous montre ce qu'il est possible de faire avec ce contrle. Une note de 3 sur 5 a t donne
V oici ses options : averageRating : spcifie la moyenne des notes. disabled : dfinit le contrle comme dsactiv. L'utilisateur ne peut alors donner ou modifier une note. enableClear : autorise l'utilisateur effacer sa note. maxRating : dfinit la valeur maximale de la note, zro tant toujours la valeur minimale. tooltipStrings : dfinit un tableau des descriptions ajouter pour chaque toile. Par dfaut, c'est 1, 2, 3, etc. userRating : spcifie la note de l'utilisateur.
V oici ses vnements : oncancel : survient lorsque l'utilisateur termine dinteragir avec le contrle sans avoir not. onchange : survient lorsque l'utilisateur donne une premire note ou la change. onpreviewchange : survient juste avant que l'utilisateur donne une note.
V oici ses classes CSS : win-average : stylise une toile lorsque le contrle est affich en tant que moyenne. win-disabled : stylise le contrle lorsqu'il est dsactiv. win-empty : stylise toutes les toiles vides du contrle. win-full : stylise toutes les toiles pleines du contrle. win-rating : stylise le contrle. win-star : stylise chaque toile du contrle. win-tentative : stylise une toile lorsque le contrle est affich avec un survol de la souris. win-user : stylise une toile lorsque le contrle est affich avec la note de l'utilisateur.
Menu
WinJS.UI.Menu permet de faire apparatre un menu volant n'importe quel endroit de l'interface. Il apparat ct d'un lment auquel il est ancr. Un menu peut contenir des <button> et des <hr> en guise de sparateurs. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.Menu"></div>
www.siteduzero.com
108/240
V oici ses options : alignment : spcifie l'alignement par dfaut du contrle entre top, right, bottom, left et center. anchor : spcifie un lment du DOM qui sert d'ancre pour le contrle. commands : spcifie les boutons qui apparatront dans le menu. Peut galement tre fait avec des balises HTML dans la balise principale du contrle. hidden : retourne true si le menu n'est pas visible. placement : spcifie la position du contrle par rapport l'lment qui fait office d'ancre. Peut tre auto, top, bottom, left, ou right. Par dfaut auto.
V oici ses vnements : onafterhide : survient immdiatement aprs la disparition du contrle. onaftershow : survient immdiatement aprs l'apparition du contrle. onbeforehide : survient avant la disparition du contrle. onbeforeshow : survient avant l'apparition du contrle.
V oici ses mthodes : getCommandById: retourne le bouton spcifi par l'ID. hide: cache le contrle. hideCommands: cache les boutons spcifis du contrle. show: affiche le contrle. showCommands: affiche les boutons spcifis du contrle. showOnlyCommands: affiche seulement les boutons spcifis du contrle et cache tous les autres.
V oici ses classes CSS : win-command : stylise un bouton du menu. win-menu : stylise le contrle.
ToggleSwitch
WinJS.UI.ToggleSwitch permet d'afficher un bouton ayant deux tats : activ ou dsactiv. En cliquant dessus, l'utilisateur fait passer le bouton d'un tat l'autre. Trs pratique pour grer des options ou paramtres. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.ToggleSwitch"></div>
www.siteduzero.com
109/240
La figure suivante reprsente ce qu'il est possible de faire avec ce contrle. Affichage d'un bouton ToggleSwitch activ
V oici ses options : checked : dfinit la valeur du contrle avec true (activ) ou false (dsactiv). disabled : permet de dsactiver le contrle en le spcifiant true. labelOff : spcifie le texte afficher lorsque le contrle est dsactiv. labelOn : spcifie le texte afficher lorsque le contrle est activ. title : spcifie le titre du contrle. Ce texte est toujours affich, que le contrle soit dans un tat actif ou non.
V oici ses vnements : onchange : survient lorsque le contrle passe d'un tat un autre (activ vers dsactiv ou vice versa ).
V oici ses classes CSS : win-label : stylise le texte affich ct du bouton. win-switch : stylise le bouton qui coulisse. win-title : stylise le titre du contrle. win-toggleswitch : stylise le contrle.
SettingsFlyout
WinJS.UI.SettingsFlyout permet de crer un panneau volant comprenant du contenu HTML pour grer les options de l'application. Ce panneau apparat sur la droite la demande de l'utilisateur, et comprend les options sous forme de contrles de l'application. Comme nous le verrons dans un prochain chapitre, l'utilisateur peut faire apparatre ce panneau la demande dans le panneau systme Paramtres de Windows 8. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.SettingsFlyout"></div>
www.siteduzero.com
110/240
Affichage du
panneau d'options de l'application V oici ses options : hidden : cache le contrle si dfini true. settingsCommandId : spcifie un identifiant qui sera utilis pour les contrles attachs au panneau. width : dfinit la largeur du panneau.
V oici ses vnements : onafterhide : survient lorsque le contrle est cach. onaftershow : survient lorsque le contrle est affich. onbeforehide : survient juste avant que le contrle soit cach. onbeforeshow : survient juste avant que le contrle soit affich.
V oici ses mthodes : hide : cache le contrle. populateSettings : mthode statique qui permet d'afficher un panneau d'options par l'id spcifi. V otre application appelle cette mthode lorsque l'utilisateur clique sur un bouton des options systme et que lvnement WinJS.Application.onsettings survient. show : affiche le contrle. showSettings : mthode statique qui permet d'afficher un panneau d'options par l'id spcifi.
Tooltip
WinJS.UI.Tooltip permet d'afficher une bulle d'informations sur un lment. Lorsque l'utilisateur passe sa souris audessus de l'lment, une bulle volante apparat avec des informations qui aident comprendre les dtails de l'lment. Pour l'utiliser : Code : HTML
www.siteduzero.com
111/240
<!-- Mthode 1 --> <span data-win-control="WinJS.UI.Tooltip"> Ce texte contient la bulle d'informations </span> <!-- Mthode 2 --> <div data-win-control="WinJS.UI.Tooltip"> Tout ce contenu contient la bulle d'informations </div> <!-- Mthode 3 --> <div> <targetElement data-wincontrol="WinJS.UI.Tooltip"></targetElement> La bulle d'informations est attache directement l'lment </div>
V oici ses options : contentElement : spcifie l'id de l'lment auquel se rattache le contrle. extraClass : ajoute une classe CSS en plus l'lment qui contient le contrle. infotip : spcifie true que le contrle contient beaucoup d'informations et qu'il sera affich plus large que dans son tat classique. innerHTML : dfinit le contenu HTML l'intrieur de la bulle d'information. placement : spcifie l'emplacement du contrle par rapport l'lment auquel il se rattache. savoir top, right, bottom ou left.
V oici ses vnements : onbeforeclose: survient juste avant que le contrle ne disparaisse. onbeforeopen: survient juste avant que le contrle n'apparaisse. onclosed: survient lorsque le contrle a disparu. onopened: survient lorsque le contrle est apparu.
V oici ses mthodes : close : fait disparatre la bulle d'information. open : fait apparatre la bulle d'information.
ViewBox
www.siteduzero.com
112/240
WinJS.UI.ViewBox permet de mettre l'chelle un seul lment enfant pour remplir l'espace disponible sans le redimensionner. Ce contrle ragit aux changements de la taille du conteneur ainsi qu'aux changements dans la taille de l'lment enfant. Par exemple, en redimensionnant la fentre de l'application (passage en vue snapped), cela peut entraner un changement d'aspect du contrle. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.ViewBox"> <!-- un unique lment enfant --> </div>
Flyout
WinJS.UI.Flyout permet d'afficher un cadre volant contenant du contenu HTML n'importe o sur l'interface. Il peut contenir du texte, des images, d'autres contrles, etc. Un simple clic en dehors du contrle le fait disparatre. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.Flyout"></div>
www.siteduzero.com
113/240
alignment : spcifie l'alignement par dfaut du contrle entre top, right, bottom, left et center. anchor : spcifie un lment du DOM qui sert d'ancre pour le contrle. hidden : masque le contrle. placement : spcifie l'emplacement du contrle par rapport l'lment auquel il se rattache. savoir top, right, bottom ou left.
V oici ses vnements : onafterhide : survient lorsque le contrle est cach. onaftershow : survient lorsque le contrle est affich. onbeforehide : survient juste avant que le contrle soit cach. onbeforeshow : survient juste avant que le contrle soit affich.
V oici ses mthodes : hide : fait disparatre le contrle. show : fait apparatre le contrle.
HtmlControl
WinJS.UI.HtmlControl permet de charger une page HTML lintrieur du contrle. Telle une balise <frame> ou <iframe>, le contrle chargera tout le contenu de la page donne en paramtre et lexcutera sur la page en cours. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.HtmlControl"></div>
V oici son option : uri : permet de dfinir l'adresse (absolue ou relative) de la page charger.
SemanticZoom
WinJS.UI.SemanticZoom permet l'utilisateur de zoomer et dzoomer pour naviguer entre deux vues d'un mme lment. Nous avons dj parl de ce contrle dans le chapitre Les rgles de l'UI et expliqu son utilisation ct utilisateur. En fait, l'astuce est trs simple, on dfinit dans le code deux lments, et, lorsque l'utilisateur zoome ou dzoome, on passe d'un des lments l'autre avec une petite animation. Pour l'utiliser : Code : HTML <div data-win-control="WinJS.UI.SemanticZoom"> <!-- Le premier lment placer sera celui utilis dans la vue zoome --> <!-- Le second lment placer sera celui utilis dans la vue dzoome -->
www.siteduzero.com
114/240
L'image suivante est un exemple de ce qu'il est possible de faire avec ce contrle.
V oici ses options : enableButton : dfinit s'il faut ou non afficher le bouton qui permet de dzoomer. isDeclarativeControlContainer : dtermine si les contrles contenus dans le SemanticZoom doivent tre traits sparment. Cette proprit est toujours true, ce qui signifie que le SemanticZoom prend soin de traiter ses propres contrles. locked : spcifie que le contrle est bloqu et qu'il n'est plus possible de zoomer ou dzoomer. zoomedOut : retourne true si la vue est dzoome, false dans le cas inverse. zoomFactor : dfinit une valeur qui spcifie la valeur de la mise l'chelle de l'animation de fondu effectu dans les transitions des vues.
V oici son vnement : onzoomchanged : survient lorsque l'action de zoom ou dzoom fait changer l'tat de la vue.
V oici ses classes CSS : win-semanticzoom: stylise le contrle. win-semanticzoom-button : stylise le bouton de dzoom. win-semanticzoomactive : stylise la vue active
AppBar
WinJS.UI.AppBar permet d'afficher la barre d'outils de la page contenant des boutons d'action. Nous avons galement dj parl de cette barre dans le chapitre Les rgles de l'UI . Elle permet d'ajouter des commandes sur les lments slectionns de l'interface (places droite de la barre), mais aussi des commandes globales l'interface courante (places gauche de la barre). Pour l'utiliser : Code : HTML
www.siteduzero.com
115/240
<div data-win-control="WinJS.UI.AppBar"></div>
La figure suivante est un exemple de ce qu'il est possible de faire avec ce contrle.
V oici ses options : commands : dfinit les lments AppBarCommand qui apparaissent dans la barre. disabled : dfinit si la barre est dsactive et inutilisable. hidden : dfinit si la barre est masque. layout : spcifie la disposition de la vue de la barre. placement : spcifie le placement en haut ou en bas de l'interface de l'application grce aux valeurs top ou bottom. sticky : dfinit si le contrle est toujours visible. Par dfaut, la valeur est false, ce qui fait que la barre disparat lorsque l'utilisateur touche autre chose dans l'interface.
V oici ses vnements : onafterhide : survient lorsque le contrle est cach. onaftershow : survient lorsque le contrle est affich. onbeforehide : survient juste avant que le contrle soit cach. onbeforeshow : survient juste avant que le contrle soit affich.
V oici ses mthodes : getCommandById : retourne l'lment AppBarCommand spcifi par un id. hide : masque le contrle. hideCommands : masque la commande spcifie du contrle. show : fait apparatre le contrle. showCommands : fait apparatre la commande spcifie du contrle. showOnlyCommands : fait apparatre la commande spcifie du contrle et masque toutes les autres.
V oici ses classes CSS : win-appbar : stylise le contrle. win-command : stylise chaque commande du contrle. win-commandicon : stylise les icnes des commandes du contrle. win-commandimag : stylise les images des commandes du contrle. win-commandlayout : stylise une barre qui utilise la disposition de vue standard. win-commandring : stylise le rond des icnes des commandes du contrle. win-label : stylise chaque texte des commandes du contrle.
V oil pour cette longue liste de contrles. V ous n'tes videmment pas obligs d'apprendre tout ce qu'il y a dans cette liste. V ous pourrez y revenir lorsque vous aurez besoin de tel ou tel contrle.
www.siteduzero.com
116/240
Ce qui nous donnera quelque chose ressemblant la figure suivante. Notre TimePicker personnalis
Dans les faits, nous n'avons donc pas besoin de la WinJS pour crer un contrle personnalis. Mais la WinJS a mis en place tout un systme qui nous permet d'en crer facilement, rapidement, et qui utilise en plus son moteur de rendu pour le gnrer avec les autres contrles au moment du WinJS.UI.processAll(). Regardons comment fonctionne ce squelette : Code : JavaScript // Tout d'abord, nous encapsulons le tout dans un module (function () { "use strict"; // Nous fabriquons une classe qui sera notre contrle
www.siteduzero.com
117/240
Maintenant, nous pouvons utiliser MesControles.MonControl(element) pour gnrer un contrle sur un lment. V ous remarquerez que nous avons utilis winControl directement sur l'lment en y insrant la classe du contrle. Cela nous permet de pouvoir utiliser ensuite les mthodes et proprits de la classe sur l'lment : document.getElementById('monElement').winControl. Maintenant, ajoutez dans votre code HTML votre contrle et excutez votre application : Code : HTML <div data-win-control="MesControles.MonControl"></div>
V ous remarquez que cela fonctionne dj. Au moment du WinJS.UI.processAll(), la WinJS passe l'lment directement dans le constructeur de la classe dfinie par l'attribut data-win-control. V ous n'avez rien de plus faire pour lier votre classe la WinJS. Ensuite, c'est vous de grer votre classe et ce qu'elle fait de l'lment. Je vous conseille d'ailleurs de ne pas utiliser WinJS.Utilities.setInnerHTMLUnsafe() comme nous l'avons fait dans le premier exemple, mais de crer directement vos lments avec document.createElement() pour plus de scurit.
www.siteduzero.com
118/240
// Nous dfinissons enfin une proprit couleur qui fera changer la couleur du texte // Et qui sera accessible dans data-win-options qui est public couleur: { get: function() { return this._couleur; }, set: function(valeur) { this._couleur = valeur; this.element.style.color = valeur; } } } ); WinJS.Namespace.define("MesControles", { MonControl: maClassDeControle }); })();
}, {
Maintenant, nous pouvons utiliser le paramtre couleur dans notre contrle HTML : Code : HTML <div data-win-control="MesControles.MonControl" data-winoptions="{couleur: 'red'}"></div>
En excutant votre application, vous devriez trouver votre texte en couleur rouge.
www.siteduzero.com
119/240
}, {
// Nous appelons l'vnement couleur en lui passant comme objet la nouvelle couleur this.dispatchEvent("couleur", { couleur: valeur }); } } } ); // Nous mixons notre classe en utilisant createEventProperties() pour crer la liste d'vnements utilisables de la classe // Puis nous y ajoutons les mthodes et objets contenus dans DOMEventMixin dont la mthode dispatchEvent() que nous utilisons WinJS.Class.mix( maClassDeControle, WinJS.Utilities.createEventProperties("couleur"), WinJS.UI.DOMEventMixin ); WinJS.Namespace.define("MesControles", { MonControl: maClassDeControle }); })();
Nous pouvons tester l'vnement en l'ajoutant aprs la cration des contrles dans le then() du WinJS.UI.processAll() : Code : JavaScript // Ligne modifier dans default.js args.setPromise(WinJS.UI.processAll().then(function () { // Nous ajoutons notre lment l'coute de l'vnement couleur document.getElementById('maDiv').addEventListener('couleur', function (event) { // Lorsque la nouvelle couleur est ajoute, nous l'affichons dans la console console.log('couleur: ' + event.couleur); }); // Nous changeons la couleur du contrle manuellement en utilisant winControl document.getElementById('maDiv').winControl.couleur = 'green'; }));
www.siteduzero.com
120/240
V oil, vous savez maintenant comment crer un contrle. N'hsitez pas abuser des classes CSS dans vos lments, plutt que de paramtrer vos styles directement. V ous pourrez ainsi surcharger vos classes dans vos feuilles, plutt que de devoir modifier les classes JavaScript de vos contrles. La WinJS dispose de contrles gnrs en JavaScript, en plus des contrles habituels d'HTML5. Il est possible de styliser compltement ses contrles gnrs par la WinJS. Il est possible de fabriquer son contrle avec un squelette insrer dans la WinJS.
www.siteduzero.com
121/240
Les permissions
Avant d'entrer dans le dtail de chacun des composants, nous allons d'abord devoir grer les permissions attribues notre application par l'utilisateur. Pour viter les applications malveillantes qui pourraient se servir de fichiers personnels, Microsoft a mis au point un procd qui permet aux dveloppeurs de spcifier clairement leurs utilisateurs ce qu'ils vont manipuler. De cette manire, les utilisateurs savent ce qu'il en est au moment d'installer l'application et donnent leur accord pour l'utilisation de ces informations. Dans chaque application Windows 8 se trouve un fichier qu'on appelle le Manifest , et qui contient toutes les informations dcrivant les fonctionnalits et les paramtres de l'application. Ce Manifest est utilis pour donner ces informations l'extrieur de l'application, comme par exemple le Windows Store. Si votre application ne fait pas exactement ce que vous dcrivez dans ce Manifest, elle ne peut pas passer les tests de validation du Store. Nous n'allons pas le dtailler tout de suite, car cela ne nous est pas compltement ncessaire ici, mais nous allons voir comment dclarer au moins notre utilisation des rpertoires. Dans votre Explorateur de solutions sous Visual Studio, ouvrez le fameux fichier Manifest : package.appxmanifest. Entrez dans son deuxime onglet Capacits. C'est ici, dans une liste de cases cocher, que se trouvent toutes les fonctionnalits susceptibles d'tre utilises par notre application. Pour l'utilisation des rpertoires, nous pouvons cocher les cases suivantes si nous savons que nous allons les utiliser : Audiothque : permet d'accder tous les fichiers et rpertoires contenus dans le rpertoire des musiques de l'utilisateur. Bibliothque d'images : permet d'accder tous les fichiers images et rpertoires contenus dans le rpertoire des images de l'utilisateur. Stockage amovible : permet d'accder tous les fichiers et rpertoires d'un priphrique amovible, comme une cl USB par exemple. Vidothque : permet d'accder tous les fichiers et rpertoires contenus dans le rpertoire des vidos de l'utilisateur.
Je ne vous conseille vraiment pas de tous les cocher si votre application n'en a pas besoin.
www.siteduzero.com
122/240
Nous allons maintenant pouvoir utiliser ces rpertoires pour ouvrir ou crire des fichiers.
Utiliser FileOpenPicker
Dans nos applications, pour que nos utilisateurs puissent slectionner un fichier, nous utilisons Windows.Storage.Pickers.FileOpenPicker(). Cela cre un objet qui, lorsqu'il est excut, ouvre une fentre d'exploration de fichiers, comme le montre la figure suivante.
Slection d'une image avec FileOpenPicker Cet objet comporte plusieurs options intressantes pour personnaliser cette exploration. Regardons ensemble comment il fonctionne par un exemple. Dans un projet Visual Studio, nous souhaitons permettre l'utilisateur d'ouvrir une simple image. Ajoutez ce code dans votre balise <body> : Code : HTML <p> <button id="boutonPourOuvrir">Ouvrir une image</button> </p> <p> <img id="notreImage" alt="Notre image" /> </p>
Ce que nous souhaitons faire, c'est pouvoir choisir une image au clic sur le bouton, pour ensuite l'insrer dans la balise <img>. Dans notre fichier default.js, rcuprons le clic du bouton en ajoutant ce code dans le then() de WinJS.UI.processAll() comme nous avons pris l'habitude de faire : Code : JavaScript args.setPromise(WinJS.UI.processAll().then(function () {
www.siteduzero.com
123/240
// Au clic sur le bouton, nous excutons une fonction qui va permettre l'utilisateur de choisir une image. } })); ouvrirImage();
Avant tout, il faut savoir qu'il n'est pas possible d'appeler une fentre de slection de fichier dans une vue snapped. Il nous faut tester notre vue avant et peut-tre mme tenter de faire revenir l'application en plein cran. V oici le code utiliser avant d'ouvrir un slecteur de fichier : Code : JavaScript // Nous vrifions que la vue n'est pas snapped et, si c'est le cas, nous tentons de la remettre en plein cran var vueActuelle = Windows.UI.ViewManagement.ApplicationView.value; if (vueActuelle === Windows.UI.ViewManagement.ApplicationViewState.snapped && !Windows.UI.ViewManagement.ApplicationView.tryUnsnap()) { // Impossible de changer notre vue, nous n'excutons donc pas notre slecteur de fichiers } return;
Maintenant, entrons dans le vif du sujet, en fabriquant cette fonction ouvrirImage(). Elle contient le test de la vue snapped et galement la cration du slecteur : Code : JavaScript function ouvrirImage() { var vueActuelle = Windows.UI.ViewManagement.ApplicationView.value; if (vueActuelle === Windows.UI.ViewManagement.ApplicationViewState.snapped && !Windows.UI.ViewManagement.ApplicationView.tryUnsnap()) { return; } // Nous instancions l'objet slecteur via la classe FileOpenPicker() } var selecteur = new Windows.Storage.Pickers.FileOpenPicker();
Ajoutons maintenant quelques options notre slecteur. Nous souhaitons lui dfinir le rpertoire par dfaut dans lequel il s'ouvre, c'est dire la Bibliothque d'images : Code : JavaScript function ouvrirImage() { var vueActuelle = Windows.UI.ViewManagement.ApplicationView.value; if (vueActuelle === Windows.UI.ViewManagement.ApplicationViewState.snapped &&
www.siteduzero.com
124/240
var selecteur = new Windows.Storage.Pickers.FileOpenPicker(); // Le paramtre suggestedStartLocation dfinit l'endroit o sera ouvert par dfaut le slecteur // Ici, nous choisissons picturesLibrary d'une liste d'adresses contenue dans Windows.Storage.Pickers.PickerLocationId selecteur.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary; }
Il est possible de dfinir d'autres rpertoires par dfaut, en voici la liste : documentsLibrary : le rpertoire qui contient les documents de l'utilisateur ; computerFolder : le rpertoire racine de l'ordinateur de l'utilisateur ; desktop : le rpertoire du bureau de l'utilisateur ; downloads : le rpertoire par dfaut des tlchargements de l'utilisateur ; homeGroup : le rpertoire principal de l'utilisateur ; musicLibrary : le rpertoire qui contient les musiques de l'utilisateur ; picturesLibrary : le rpertoire qui contient les images de l'utilisateur ; videosLibrary : le rpertoire qui contient les vidos de l'utilisateur. Comme nous souhaitons que l'utilisateur choisisse des images, nous souhaitons dfinir les types de fichier possibles ouvrir, mais galement une vue plus propice l'affichage d'images : Code : JavaScript function ouvrirImage() { var vueActuelle = Windows.UI.ViewManagement.ApplicationView.value; if (vueActuelle === Windows.UI.ViewManagement.ApplicationViewState.snapped && !Windows.UI.ViewManagement.ApplicationView.tryUnsnap()) { return; } var selecteur = new Windows.Storage.Pickers.FileOpenPicker(); selecteur.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary; // Nous spcifions une liste des seuls types de fichier que l'utilisateur peut voir et ouvrir selecteur.fileTypeFilter.replaceAll([".jpg", ".bmp", ".gif", ".png"]); // Nous spcifions la vue par dfaut des fichiers, ici en miniatures pour voir les images plus facilement selecteur.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail; }
Il n'existe que deux types de vue possibles spcifier dans le paramtre viewMode : list : vue par dfaut des fichiers sous forme de liste simple. thumbnail : vue des fichiers en miniatures.
www.siteduzero.com
125/240
Notre slecteur est dj paramtr, il ne reste plus qu' le lancer. videmment, comme la fentre qui sera lance est asynchrone, la fonction utilise sera complte d'un then() pour grer le retour. Ce then() contient deux fonctions, une en cas de succs, l'autre en cas d'chec : Code : JavaScript function ouvrirImage() { var vueActuelle = Windows.UI.ViewManagement.ApplicationView.value; if (vueActuelle === Windows.UI.ViewManagement.ApplicationViewState.snapped && !Windows.UI.ViewManagement.ApplicationView.tryUnsnap()) { return; } var selecteur = new Windows.Storage.Pickers.FileOpenPicker(); selecteur.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary; selecteur.fileTypeFilter.replaceAll([".jpg", ".bmp", ".gif", ".png"]); selecteur.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail; // La mthode pickSingleFileAsync() excute la fentre du slecteur selecteur.pickSingleFileAsync().then( // Notre fonction succes retourne les informations du fichier slectionn function succes(fichier) { // Si jamais l'utilisateur clique sur Annuler , cela ne gnre pas une erreur, mais la variable fichier sera null if(fichier) { // Nous pouvons afficher son nom dans la console console.log(fichier.name); // Nous rcuprons ensuite les donnes du fichier avec la mthode JavaScript URL.createObjectURL() var imageBlob = URL.createObjectURL(fichier); image } // Puis nous ajoutons ces donnes dans la source de notre document.getElementById('notreImage').src = imageBlob;
},
// Notre fonction erreur retourne l'inverse les informations de l'erreur function echec(erreur) { ); }
V ous pouvez maintenant excuter votre projet et tester l'ouverture d'une image dans votre application, comme la figure
www.siteduzero.com
126/240
Assurez-vous d'avoir bien dclar les rpertoires que vous utilisez dans le Manifest. Mme s'il est possible de les utiliser sur un ordinateur de dveloppement, cela ne sera pas le cas pour vos utilisateurs.
Utiliser FileSavePicker
Pour slectionner un fichier enregistrer dans un rpertoire, c'est peu prs la mme chose, hormis que nous permettons l'utilisateur de donner un nom et un type son fichier, comme le montre la figure suivante.
www.siteduzero.com
127/240
Nous allons continuer avec notre exemple prcdent en y ajoutant un bouton qui permet de sauvegarder des informations de l'image dans un fichier texte. Modifions notre code HTML pour y ajouter le bouton : Code : HTML <p> <button id="boutonPourOuvrir">Ouvrir une image</button> <button id="boutonPourEnregistrer">Enregistrer les informations de l'image</button> </p> <p> <img id="notreImage" alt="Notre image" style="width: 400px;" /> </p>
Puis modifions le code du then() de WinJS.UI.processAll() dans notre fichier default.js : Code : JavaScript args.setPromise(WinJS.UI.processAll().then(function () { { document.getElementById('boutonPourOuvrir').onclick = function () } ouvrirImage();
// Ajout de l'action avec notre bouton vers la fonction enregistrerImage() document.getElementById('boutonPourEnregistrer').onclick = function () { enregistrerImage(); } }));
Ce que nous souhaitons maintenant faire, c'est rcuprer en mmoire les informations de l'image. Et comme nous les rcuprons dans la fonctions ouvrirImage(), nous allons en profiter pour les garder. Dans votre fonction ouvrirImage(), modifiez le selecteur.pickSingleFileAsync() en y ajoutant la ligne suivante : Code : JavaScript selecteur.pickSingleFileAsync().then( function succes(fichier) { if (fichier) { console.log(fichier.name); // Cette ligne nous permet d'enregistrer les informations de l'image dans une variable window.informationsImage = fichier; var imageBlob = URL.createObjectURL(fichier); } document.getElementById('notreImage').src = imageBlob;
}, function echec(erreur) { }
www.siteduzero.com
128/240
Maintenant, fabriquons notre fonction enregistrerImage() en commenant de la mme manire que pour ouvrirImage(), en testant la vue snapped. Nous y crons ensuite un slecteur bas sur FileSavePicker() dans lequel nous ajoutons quelques paramtres : Code : JavaScript function enregistrerImage() { var vueActuelle = Windows.UI.ViewManagement.ApplicationView.value; if (vueActuelle === Windows.UI.ViewManagement.ApplicationViewState.snapped && !Windows.UI.ViewManagement.ApplicationView.tryUnsnap()) { return; } // Nous regardons que nous avons bien une image dj charge avec ses informations if (window.informationsImage) { // Cration de notre slecteur qui permet de choisir un fichier enregistrer var selecteur = new Windows.Storage.Pickers.FileSavePicker(); // Nous utilisons galement suggestedStartLocation, mais cette fois-ci pour lui spcifier le rpertoire des documents selecteur.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary; // Nous spcifions ensuite le type de fichier vers lequel l'utilisateur enregistre son fichier // Ici nous donnons un nom, Texte , ainsi que le type de fichier, .txt selecteur.fileTypeChoices.insert("Texte", [".txt"]); // Nous pouvons galement dfinir un nom de fichier par dfaut que l'utilisateur pourra changer selecteur.suggestedFileName = "Informations image"; // Enfin, nous lanons la fentre et attendons un retour tout comme FileOpenPicker selecteur.pickSaveFileAsync().then( function succes(fichier) { }, function echec(erreur) { ); }
Notre utilisateur a choisi l'endroit o enregistrer son fichier. Nous devons donc maintenant formater les informations de l'image et les crire dans un fichier sur le disque. Pour ce faire, nous utilisons la classe Windows.Storage.FileIO, qui contient des mthodes trs simples pour crire des fichiers. Nous utilisons galement Windows.Storage.CachedFileManager.deferUpdates() qui permet de dire Windows de bloquer l'accs au fichier par d'autres applications le temps d'crire dedans. Regardons le code de plus prs :
www.siteduzero.com
129/240
function enregistrerImage() { var vueActuelle = Windows.UI.ViewManagement.ApplicationView.value; if (vueActuelle === Windows.UI.ViewManagement.ApplicationViewState.snapped && !Windows.UI.ViewManagement.ApplicationView.tryUnsnap()) { return; } if (window.informationsImage) { var selecteur = new Windows.Storage.Pickers.FileSavePicker(); selecteur.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary; selecteur.fileTypeChoices.insert("Texte", [".txt"]); selecteur.suggestedFileName = "Informations image"; selecteur.pickSaveFileAsync().then( function succes(fichier) { if (fichier) { // Nous demandons Windows de bloquer le fichier choisi par l'utilisateur pour qu'aucune autre application ne puisse crire dedans // Si le fichier n'existe pas, Windows bloque quand mme sa cration par une autre application Windows.Storage.CachedFileManager.deferUpdates(fichier); // Nous dfinissons le texte inscrire dans le fichier, format des donnes de l'image var texte = informationsImage.name + "\r\n" + informationsImage.displayType + "\r\n" + informationsImage.path; // Nous crivons le fichier avec son texte de manire asynchrone () { Windows.Storage.FileIO.writeTextAsync(fichier, texte).done(function
// Lorsque le fichier est crit, il faut dire Windows de ne plus le bloquer // Nous utilisons donc completeUpdatesAsync() qui le dbloque de manire asynchrone et qui retourne son nouveau statut Windows.Storage.CachedFileManager.completeUpdatesAsync(fichier).done(function (nouveauStatus) { // Si le nouveau statut correspond bien un tat termin, on affiche dans la console que le fichier est bien enregistr if (nouveauStatus === Windows.Storage.Provider.FileUpdateStatus.complete) { console.log("Fichier " + fichier.name + " enregistr."); } else { console.log("Fichier " + fichier.name + " non enregistr."); } }); });
} }, function echec(erreur) {
www.siteduzero.com
130/240
V ous pouvez maintenant excuter votre application et tester les deux boutons l'un aprs l'autre. V ous aurez alors un fichier rempli comme la figure suivante.
Utiliser FolderPicker
Windows.Storage.Pickers.FolderPicker() est une classe tout aussi simple que Windows.Storage.Pickers.OpenFilePicker(), mais qui va cette fois-ci ouvrir un simple rpertoire. Permettre l'ouverture d'un rpertoire par un utilisateur donne le droit pour l'application d'y lire et crire des fichiers. Continuons toujours avec notre exemple en ajoutant un bouton dans notre code HTML : Code : HTML <p> <button id="boutonPourOuvrir">Ouvrir une image</button> <button id="boutonPourEnregistrer">Enregistrer les informations de l'image</button> <button id="boutonPourRepertoire">Ouvrir un rpertoire</button> </p> <p> <img id="notreImage" alt="Notre image" style="width: 400px;" /> </p>
www.siteduzero.com
131/240
document.getElementById('boutonPourEnregistrer').onclick = function () { enregistrerImage(); } // Ajout de l'action avec notre bouton vers la fonction ouvrirRepertoire() document.getElementById('boutonPourRepertoire').onclick = function () { ouvrirRepertoire(); } }));
Maintenant, dtaillons notre fonction ouvrirRepertoire() : Code : JavaScript function ouvrirRepertoire() { var vueActuelle = Windows.UI.ViewManagement.ApplicationView.value; if (vueActuelle === Windows.UI.ViewManagement.ApplicationViewState.snapped && !Windows.UI.ViewManagement.ApplicationView.tryUnsnap()) { return; } // Nous crons notre nouveau slecteur via FolderPicker() var selecteur = new Windows.Storage.Pickers.FolderPicker(); // Nous dfinissons le rpertoire par dfaut du slecteur sur le Bureau de l'utilisateur selecteur.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.desktop; // Il est important de dfinir une vue filtre des fichiers que peut voir l'utilisateur dans la fentre de slection // Cela doit correspondre au scnario de notre application selecteur.fileTypeFilter.replaceAll([".docx", ".xlsx", ".pptx"]); // Puis nous excutons la fentre selecteur.pickSingleFolderAsync().then( function succes(repertoire) { if (repertoire) { // Enfin nous affichons dans la console le nom du rpertoire choisi console.log("Rpertoire slectionn : " + repertoire.name); } }, function echec(erreur) { ); }
www.siteduzero.com
132/240
V ous pouvez maintenant traiter les fichiers de vos utilisateurs ou en crer de nouveaux en utilisant ces trois slecteurs. vous de les faire correspondre avec les scnarios de vos applications pour avoir une bonne exprience utilisateur.
Ouverture d'un fichier image partir d'une autre application Il est alors possible de sauvegarder par exemple une image dans une application de photos, ou d'ouvrir un document texte d'une application de partage de contenu. Nous allons apprendre comment rendre notre application accessible aux autres applications pour enregistrer ou ouvrir des fichiers.
www.siteduzero.com
133/240
fileOpenPicker.html : la vue de la page qui sera affiche lorsqu'une autre application voudra ouvrir un fichier provenant de notre application. fileOpenPicker.js : le contrleur JavaScript li la page. fileOpenPicker.css : le style li la page. Le simple fait d'avoir insr ce contrat nous permet dj d'utiliser notre application pour ouvrir des fichiers partir d'autres applications. Tout ce que nous avons faire maintenant est de : Grer les donnes affiches ; Grer la slection/dslection d'un lment ; Grer la suppression d'un lment. Pour grer les donnes affiches, il suffit de modifier la source de donnes (binding) renvoye par la fonction getPickerDataSource() de notre fichier fileOpenPicker.js : Code : JavaScript function getPickerDataSource() { // Par dfaut, c'est nous de dfinir des donnes afficher, suivant le scnario de notre application if (window.Data) { // Nous pouvons donc crer cette source comme nous le faisons avec les bindings return Data.items.dataSource; } else { // Dans le cas contraire, c'est une liste vide qui est renvoye } return new WinJS.Binding.List().dataSource;
Cette source de donnes est utilise par un contrle WinJS.UI.ListView au sein de la vue du fichier fileOpenPicker.html. V ous pouvez modifier le template associ juste au-dessus pour styliser les donnes affiches. Ensuite, pour modifier un lment lorsqu'il est slectionn ou dslectionn, remplissez simplement la fonction updatePickerUI() qui contient l'lment en question en paramtre. Enfin, lorsque l'utilisateur demande la suppression d'un des lments, c'est la fonction fileRemovedFromPickerUI() qu'il faut remplir. V ous pouvez ensuite dfinir tout ce que vous souhaitez dans le JavaScript de la page, elle reste une page comme les autres. Gardez bien en revanche l'esprit que sa disposition de vue ne doit pas changer ; sans cela, vous pourriez tre rejets du Windows Store.
Les dclarations
Notre application utilise un contrat, elle ajoute une fonctionnalit au systme. Il faut donc que le systme soit mis au courant. Et comment communique-t-on avec le systme pour lui annoncer qu'on utilise une fonctionnalit spcifique ? Par le Manifest, bien sr ! Rendez-vous dans la partie Dclarations de votre Manifest (pour rappel, Explorateur de solutions > package.appxmanifest). V ous remarquez quelque chose ? V ous avez une dclaration dj prise en charge sur votre gauche, le Slecteur d'ouverture de fichier. Lorsque nous avons ajout notre contrat, il a pris la peine d'ajouter automatiquement une dclaration pour nous. Dtaillons-la : Premirement, la case cocher Prend en charge tout type de fichier est active, ce qui est presque
www.siteduzero.com
134/240
improbable. Il nous faut dfinir les types de fichier correspondants au scnario de notre application. Dcochons cette case et cliquons sur Ajouter nouveau. Il nous suffit maintenant d'ajouter un des types que nous souhaitons, au format d'extension de fichier comme par exemple .jpg. Ajoutez-en autant que vous le souhaitez en cliquant de nouveau sur Ajouter nouveau. Ensuite, il nous faut dfinir ce que fait l'application lorsqu'elle est ouverte par ce biais. Par chance, la bonne valeur y est dj spcifie. On lance simplement la page de dmarrage fileOpenPicker.html. Pour qu'une application puisse enregistrer un fichier dans la ntre, il suffit d'ajouter une nouvelle dclaration : Slecteur d'enregistrement de fichier. Dans ses paramtres, nous pouvons spcifier les mmes types d'informations que pour l'ouverture de fichiers : les types de fichier et la page de dmarrage. V os applications peuvent maintenant s'ouvrir d'autres en partageant ou sauvegardant des contenus. Cela ouvre de nouvelles perspectives trs intressantes dans nos dveloppements, car tout est intgr au systme, et donc l'utilisation habituelle des utilisateurs.
La base de donnes
Dans les dernires versions des navigateurs, il existe la possibilit de crer des bases de donnes internes. IndexedDB est une fonctionnalit JavaScript qui permet de gnrer des bases de donnes et de les garder en mmoire, mme lorsque le navigateur est ferm. Ces donnes sont tout simplement des objets JavaScript, et il est donc trs facile de les manipuler. Internet Explorer 10 contient maintenant cette fonctionnalit et nos applications pour Windows 8 en profitent donc bien videmment. Pour de toutes petites donnes, il existe galement la possibilit de les stocker dans un objet spcifique de l'application qui garde ses proprits en mmoire lorsque l'application est ferme. Nous allons voir comment utiliser ces deux fonctionnalits dans nos applications.
Ensuite, plaons notre code JavaScript qui va crire et lire notre fichier interne la suite des changements de notre champ. Ce code est placer, comme d'habitude pour nos tests, dans le then() de WinJS.UI.processAll() : Code : JavaScript args.setPromise(WinJS.UI.processAll().then(function () { // Lorsque la page est entirement rendue et affiche, nous recherchons le contenu du fichier monTexte avec la Promise readtext() // Dans son second paramtre, nous mettons le contenu par dfaut retourner si le fichier n'existe pas WinJS.Application.local.readText('monTexte', '').done( function (valeur) { // Lorsque la valeur est trouve, nous l'insrons dans notre
www.siteduzero.com
135/240
);
// Nous coutons l'vnement change de notre champ texte en rcuprant sa valeur lorsque l'utilisateur y crit quelque chose { document.getElementById('champTexte').onchange = function (event)
// Lorsque nous trouvons une valeur, nous l'insrons dans notre fichier monTexte WinJS.Application.local.writeText('monTexte', event.target.value); } }));
Excutez votre application et inscrivez du code dans votre champ texte. Prenez bien soin de sortir du contrle, en cliquant ailleurs dans votre fentre ou avec la touche Tabulation pour que l'vnement soit appel. V otre texte est ainsi mmoris. Quittez l'application, puis relancez-la, vous devriez retrouver votre texte. Ceci est la mthode la plus simple pour stocker quelques donnes. Mais lorsqu'il s'agit de bien plus de donnes, il nous faut alors passer une vraie gestion de bases de donnes.
Utiliser indexedDB
IndexedDB est une fonctionnalit propre aux navigateurs et JavaScript. Je pense mme qu'on pourrait en faire un cours part entire tellement il y aurait crire. Cependant, n'tant pas encore intgre dans tous les navigateurs et tant galement trs rcente, peu de dveloppeurs l'utilisent pour le moment. C'est pourquoi je vais reprendre ses bases et vous les expliquer ici. C'est une fonctionnalit indispensable dans la cration d'une application Windows 8.
www.siteduzero.com
136/240
Le problme avec l'asynchronisme de la connexion la base, c'est que nous ne pouvons pas faire d'appel tant que la base n'est pas instancie. Cela veut dire qu'il vous faudra presque toujours faire une classe complte de surcharge pour accder vos bases de donnes, sinon vous devrez tout coder l'intrieur de onsuccess().
www.siteduzero.com
137/240
Nous avons maintenant une base de donnes contenant une table utilisateurs.
};
baseUtilisateurs.onsuccess = function () { var baseActive = baseUtilisateurs.result; // Nous dmarrons une transaction avec la base sur la table utilisateurs en lecture-criture var transaction = baseActive.transaction('utilisateurs', 'readwrite'); // Puis nous insrons notre valeur avec add() sur l'ObjectStore, en ajoutant en second argument la cl de notre valeur
www.siteduzero.com
138/240
Pour rcuprer maintenant notre valeur en bouclant sur notre table des utilisateurs, nous utilisons la mthode openCursor(), qui nous permet d'ouvrir un pointeur dans la table pour pouvoir l'itrer, valeur aprs valeur. Remplacez le code prcdent par celui-ci, toujours dans onsuccess() de l'ajout :
www.siteduzero.com
139/240
};
Enfin, nous pouvons utiliser un index bas sur une des proprits des valeurs ajoutes dans notre table. Pour ce faire, il nous faut le dfinir dans la cration de la table. Modifions l'vnement onupgradeneeded() prcdemment utilis dans notre exemple : Code : JavaScript baseUtilisateurs.onupgradeneeded = function (event) { var baseAMettreAjour = event.target.result; var ancienneVersion = event.oldVersion; var nouvelleVersion = event.newVersion;
www.siteduzero.com
140/240
};
Maintenant que nous avons notre index, nous pouvons l'utiliser simplement comme avec la rcupration du nom de la cl. Remplacez une fois encore le code de ajout.onsuccess() par celui-ci : Code : JavaScript ajout.onsuccess = function() { var transactionLecture = baseActive.transaction('utilisateurs', 'readonly'); // Nous rcuprons l'index que nous avions nomm indexPrenom sur notre table utilisateurs // Il nous permet de naviguer rapidement dans la table var index = transactionLecture.objectStore('utilisateurs').index('indexPrenom'); // Puis on utilise get() de la mme manire qu'avec la rcupration d'une valeur avec sa cl var lecture = index.get('Xavier'); // On attend bien videmment la rcupration des donnes de manire asynchrone lecture.onsuccess = function(event) { // Et nous rcuprons notre valeur var notreValeur = event.target.result; }; };
www.siteduzero.com
141/240
V ous savez maintenant comment utiliser des bases de donnes internes votre application. N'hsitez vraiment pas crer des classes pour organiser le tout. Utiliser indexedDB est vraiment ncessaire dans une application Windows 8, aussi cette mise au point est trs importante pour la suite du cours.
Les paramtres
Nous allons maintenant parler des paramtres de notre application. Nous venons de voir comment accder des fichiers, comment crer des bases de donnes et comment stocker des contenus d'autres applications. Nous pouvons donc dfinir des paramtres dans notre application, et les enregistrer de manire durable. V ous vous souvenez du contrle WinJS.UI.SettingsFlyout ? C'est celui qui nous permet de faire apparatre un panneau de configuration sur la droite de l'cran, comme la figure suivante.
Un panneau
de configuration sur l'application Ce panneau est trs simple utiliser lorsqu'il s'agit de l'ajouter dans une page. Mais il faut bien le diffrencier des paramtres systme de l'application. Lorsque l'utilisateur ouvre les paramtres contenus dans une application Windows 8, en faisant glisser la barre du menu Dmarrer droite de son cran, il ne tombera pas sur notre panneau. Il faut donc pouvoir y ajouter des boutons pour le lancer.
www.siteduzero.com
142/240
Il est possible de placer autant de panneaux qu'on souhaite dans une page. Ils peuvent correspondre plusieurs types de paramtres suivant les scnarios.
www.siteduzero.com
143/240
}; }
V oil pour nos boutons. Les boutons contenus dans les paramtres systme d'une application ne sont censs contenir que des URL. Nous allons donc dans un premier temps ajouter ceux qui contiennent des URL, puis lancer la cration des paramtres : Code : JavaScript WinJS.Application.onsettings = function(event) { var boutons = { "aPropos": { title: " propos", href: "/apropos.html" }, "parametres": { title: "Paramtres de l'application", action: function () { document.getElementById('mesParametres').winControl.show(); } } }; // Dans les dtails de l'vnement, ce sont les donnes de l'objet applicationcommands qui seront utilises pour crer les boutons event.detail.applicationcommands = {}; // Nous bouclons sur notre liste de boutons for (var nomBouton in boutons) { var bouton = boutons[nomBouton]; // Si le bouton contient une adresse, nous l'ajoutons dans applicationcommands
www.siteduzero.com
144/240
// Puis nous lanons la gnration de l'affichage des boutons sur les paramtres systme de l'application } WinJS.UI.SettingsFlyout.populateSettings(event);
Enfin, nous pouvons ajouter maintenant nos boutons contenant nos actions la suite de la gnration de l'affichage. C'est seulement ainsi que nous pourrons les utiliser. Code : JavaScript WinJS.Application.onsettings = function(event) { var boutons = { "aPropos": { title: " propos", href: "/apropos.html" }, "parametres": { title: "Paramtres de l'application", action: function () { document.getElementById('mesParametres').winControl.show(); } } }; event.detail.applicationcommands = {}; for (var nomBouton in boutons) { var bouton = boutons[nomBouton]; if (bouton.href) { event.detail.applicationcommands[nomBouton] = bouton; } } WinJS.UI.SettingsFlyout.populateSettings(event); // Nous bouclons une nouvelle fois sur nos boutons for (var nomBouton in boutons) { var bouton = boutons[nomBouton]; // Mais cette fois-ci, nous regardons ceux qui contiennent des actions if (bouton.action) { // Nous fabriquons ensuite une vritable commande placer dans la liste via la classe SettingsCommand() var commande = new Windows.UI.ApplicationSettings.SettingsCommand(nomBouton, bouton.title, bouton.action); // Puis nous ajoutons notre commande dans la liste des boutons affichs } event.detail.e.request.applicationCommands.append(commande);
www.siteduzero.com
145/240
V ous pouvez maintenant excuter votre application et tester ses paramtres. V ous aurez alors un joli panneau utilisable pour grer les paramtres de vos utilisateurs. Couplez-le avec ce que vous avez appris sur les bases de donnes pour mmoriser tous les paramtres. Assurez-vous tout de mme d'avoir cr une page apropos.html pour ne pas faire planter votre application. Il est possible de laisser l'utilisateur choisir d'ouvrir un fichier ou un rpertoire et d'enregistrer un fichier dans un rpertoire grce aux classes contenues dans Windows.Storage.Pickers. Il faut dfinir des permissions dans le Manifest de l'application pour avoir le droit d'utiliser des rpertoires. Une application peut partager des fichiers avec d'autres applications en utilisant le contrat Slecteur de fichier ouvert. WinJS.Application.local est un objet qui garde en mmoire sur disque dur tous ses enfants. indexedDB est la fonctionnalit qui permet de grer des bases de donnes directement dans le navigateur Internet Explorer, et donc disponible pour une application Windows 8. Le panneau SettingsFlyout met disposition une vue qui permet de manager les paramtres des utilisateurs.
www.siteduzero.com
146/240
Les prrequis
Pour ces travaux, il faudra quelques connaissances essentielles pour arriver au bout, c'est--dire savoir : Utiliser la structuration spcifique WinJS (namespaces, classes) ; Utiliser des rpertoires de l'utilisateur ; Utiliser les contrles FlipView et SettingsFlyout ; Enregistrer des donnes de manire persistante ; Utiliser des bindings ; Utiliser des templates ; Ajouter des boutons aux paramtres systme d'une application ; Adapter le contenu d'une page dans ses trois modes de vue : plein cran, filled et snapped.
Votre objectif
L'objectif principal de ces travaux est la cration d'une application de cadre photo numrique comme il en existe en magasin. Comme Windows 8 est principalement dvelopp pour tablettes, une application de ce genre a entirement sa place sur le Windows Store. V oici le scnario de l'application : L'utilisateur entre sur l'application. L'application charge directement une image en plein cran provenant de la bibliothque Images de l'utilisateur. Toutes les 5 secondes, l'application passe une prochaine image, le tout est de tourner sur toutes les images de la bibliothque de manire infinie. Mais l'utilisateur peut galement passer d'une image une autre en faisant glisser l'image sur la gauche ou la droite. Sur chaque image doit apparatre un titre correspondant au nom du fichier de l'image. Il vous faut ajouter des paramtres l'application, qui permettent l'utilisateur de choisir : S'il veut afficher le titre d'une image ; S'il veut changer l'intervalle entre les images 5, 10, 15, 20, 30 ou 35 secondes. Les paramtres doivent rester ceux choisis par l'utilisateur au redmarrage de l'application. Le scnario de l'application n'est pas ax sur la navigation entre pages. V ous ne devez donc en faire qu'une seule. V ous devez bien videmment utiliser les bindings et templates pour vos vues, le code JavaScript ne doit en aucun cas toucher la disposition ou au style des lments HTML.
www.siteduzero.com
147/240
vous de jouer !
Mme si vous avez quelques contraintes techniques, ce projet n'est pas compliqu mettre en place. V ous avez toutes les connaissances ncessaires pour pouvoir le raliser correctement. Ma correction n'aura peut-tre pas la mme tte que ce que vous aurez fait, mais ce n'est pas grave. Le but est d'avoir une application claire au niveau du code et de vous faire pratiquer. Je vous laisse votre code et vous revois dans la correction. C'est vous de jouer !
Correction
C'est l'heure de la correction. Normalement, si vous tes ici, c'est que vous avez dvelopp une superbe petite application de cadre photo numrique. Si ce n'est pas le cas et que vous tes bloqus sur un point, vous pouvez bien sr regarder un peu les codes suivants. Pour cette application, la cration d'un projet Application vide dans Visual Studio suffisait amplement. Pas besoin de grer plus d'une seule page, donc pas besoin de navigation. La premire chose qu'il fallait faire dans notre projet tait de dclarer l'utilisation de la bibliothque d'images. Comme nous devons l'utiliser pour y afficher les images, il fallait explicitement l'ajouter dans le Manifest de l'application. Dans le cas contraire, une erreur surviendra dans l'application finale des utilisateurs.
Organiser sa vue
Dans notre vue, nous avons besoin de trois choses : D'un contrle FlipView qui va contenir nos images ; D'un template pour notre contrle ; D'un contrle SettingsFlyout pour les paramtres. V oici donc le code de la correction du fichier default.html qui gre la vue de la page. Il est trs comment pour vous aider mieux le comprendre. Code : HTML <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"
www.siteduzero.com
148/240
<link href="//Microsoft.WinJS.1.0/css/ui-dark.css" rel="stylesheet" /> <script src="//Microsoft.WinJS.1.0/js/base.js"></script> <script src="//Microsoft.WinJS.1.0/js/ui.js"></script> <link href="/css/default.css" rel="stylesheet" /> <!-- Nous ajoutons notre fichier CadrePhotoNumerique.js avant le default.js pour pouvoir dfinir nos objets en premier --> <script src="/js/CadrePhotoNumerique.js"></script> <script src="/js/default.js"></script> </head> <body> <!-Nous dfinissons le template qu'utilise le FlipView pour les lments de sa vue, c'est--dire les images Nous utilisons des classes que nous dfinirons dans la feuille de style pour chaque lment Ce template ne contient qu'une image et un titre qui sera affich en bas de l'cran --> <div id="diaporamaTemplateElement" data-wincontrol="WinJS.Binding.Template" style="display: none"> <div class="diaporama-element"> <img class="diaporama-element-image" src="#" data-winbind="src: image; alt: titre" /> <div class="diaporama-element-titre"> <h2 data-win-bind="innerText: titre"></h2> </div> </div> </div> <!-Nous dfinissons notre contrle FlipView Il utilise dans ses options le template prcdemment ajout ainsi que sa source de donnes intgre dans notre namespace --> <div id="diaporama" class="diaporama" data-wincontrol="WinJS.UI.FlipView" data-win-options="{ itemDataSource: CadrePhotoNumerique.Images.binding.dataSource, itemTemplate: select('#diaporamaTemplateElement') }"> </div> <!-Nous dfinissons notre contrle SettingsFlyout Il contient un <select> simple pour choisir l'intervalle de temps entre chaque image et un contrle ToggleSwitch pour activer/dsactiver l'affichage du titre des images --> <div id="parametres" data-win-control="WinJS.UI.SettingsFlyout"> <div class="win-ui-dark win-header" style="background-color: #00aedf"> <button type="button" onclick="WinJS.UI.SettingsFlyout.show()" class="win-backbutton"></button> <div class="win-label">Cadre photos</div> </div> <div class="win-content">
www.siteduzero.com
149/240
Maintenant, nous allons dfinir les classes CSS qui vont avec notre vue. C'est en fait trs simple de grer toutes les tailles d'cran en mme temps. Comme cet exercice n'tait pas bas sur la gestion des images, nous n'avons pas vraiment nous proccuper de les redimensionner ou les rogner dans tous les sens. Nous souhaitons simplement les afficher le mieux possible. V oici notre fichier default.css : Code : CSS body { } /* Notre FlipView prend toute la taille de l'cran */ .diaporama { width: 100%; height: 100%; } /* Chaque lment du FlipView prend galement toute la taille de l'cran et positionne ses images au centre */ .diaporama-element { width: 100%; height: 100%; text-align: center; position: relative; } /* Avec IE 10, nous pouvons facilement faire du CSS3. C'est plus facile de grer les images ainsi */ .diaporama-element-image { max-width: 100%; max-height: 100%; } /* Nous plaons notre titre tout en bas de l'cran avec un fond transparent noir pour plus de visibilit */ .diaporama-element-titre { position: absolute;
www.siteduzero.com
150/240
.diaporama-element-titre h2 { padding: 20px; color: white; font-size: 20px; } @media screen and (-ms-view-state: fullscreen-landscape) { } @media screen and (-ms-view-state: filled) { } @media screen and (-ms-view-state: snapped) { } @media screen and (-ms-view-state: fullscreen-portrait) { }
V ous remarquez que toutes nos valeurs sont en pourcentage. Le diaporama prend donc toute la taille de l'cran, peu importe qu'il soit dans un mode plein cran, filled ou snapped. Pas besoin, donc, de grer chaque vue sparment.
www.siteduzero.com
151/240
};
app.oncheckpoint = function (args) { }; // Nous coutons l'vnement qui fabrique les boutons des paramtres systme de l'application WinJS.Application.onsettings = function (event) { // Nous dfinissons notre unique bouton qui fait apparatre notre contrle SettingsFlyout // Tout le reste du code est bien expliqu dans le chapitre Donnes et paramtres d'une application var boutons = { "parametres": { title: "Paramtres de l'application", action: function () { document.getElementById('parametres').winControl.show(); } } }; event.detail.applicationcommands = {}; for (var nomBouton in boutons) { var bouton = boutons[nomBouton]; if (bouton.href) { event.detail.applicationcommands[nomBouton] = bouton; } } WinJS.UI.SettingsFlyout.populateSettings(event); for (var nomBouton in boutons) { var bouton = boutons[nomBouton]; if (bouton.action) { var commande = new Windows.UI.ApplicationSettings.SettingsCommand(nomBouton, bouton.title, bouton.action); event.detail.e.request.applicationCommands.append(commande); } } } app.start(); })();
www.siteduzero.com
152/240
www.siteduzero.com
153/240
);
WinJS.Application.local.readText(this._idFlipView + '_titres', 'true').done( function (valeur) { // Nous rcuprons en mmoire la valeur prcdemment configure de l'affichage des titres // Puis nous mettons jour avec la valeur du contrle ToogleSwitch des paramtres classeDiaporama._titresAffiches = valeur == 'true'; parametreTitres.winControl.checked = classeDiaporama._titresAffiches; // Nous appelons une mthode qui se charge d'afficher ou de masquer les titres en fonction de la valeur de la configuration } classeDiaporama.affichageTitres();
);
// Nous coutons les changements du ToggleSwitch parametreTitres.addEventListener('change', function () { // Si la valeur a chang, nous mettons jour notre valeur en mmoire, la configuration sauvegarde dans WinJS.Application.local // Puis nous rafrachissons les titres var affichage = parametreTitres.winControl.checked; classeDiaporama._titresAffiches = affichage; affichage = affichage ? 'true' : 'false'; WinJS.Application.local.writeText(classeDiaporama._idFlipView + '_titres', affichage); classeDiaporama.affichageTitres(); }); // Nous coutons les changements du <select> { parametreIntervalle.addEventListener('change', function ()
// Si la valeur a chang, nous mettons jour notre valeur en mmoire, puis la configuration sauvegarde dans WinJS.Application.local // C'est la valeur incluse en mmoire dans la classe qui est utilise pour chaque attente entre les images var intervalle = parseInt(parametreIntervalle.value); classeDiaporama.intervalle = intervalle;
www.siteduzero.com
154/240
// Nous relanons une nouvelle fois la boucle pour le passage la prochaine image classeDiaporama.lancer(); }); }, }, classeDiaporama._intervalle);
// Cette mthode affiche ou masque tous les titres suivant la configuration en vigueur affichageTitres: function () { var classeDiaporama = this; // Nous rcuprons tous les titres grce une requte dans la page sur leur classe CSS titre'); var titres = WinJS.Utilities.query('.diaporama-elementif (classeDiaporama._titresAffiches) { titres.setStyle('display', 'block'); } else { titres.setStyle('display', 'none'); }
www.siteduzero.com
155/240
// Maintenant que notre classe est prte, nous dfinissons notre namespace en y ajoutant une instance de la classe du diaporama // Pour la gestion du binding des images, nous ajoutons galement un objet Image qui contient la source du binding WinJS.Namespace.define("CadrePhotoNumerique", { Diaporama: new _diaporama(), Images: { binding: new WinJS.Binding.List() } }); // Nous rcuprons la source de donnes du binding // Nous allons ajouter les images directement dedans // Comme cette source est utilise par le contrle FlipView, chaque ajout d'lments, le contrle ajoutera son tour un lment dans sa vue var sourceImages = CadrePhotoNumerique.Images.binding.dataSource; // Pour rcuprer tous les fichiers de la bibliothque des images de l'utilisateur, il faut utiliser la mthode suivante // Si jamais vous n'avez pas dclar cette bibliothque dans le Manifest de l'application, attendez-vous une erreur Windows.Storage.KnownFolders.picturesLibrary.getFilesAsync().then( function (fichiers) { // Pour chaque fichier trouv, nous fabriquons un objet ajout la source de donnes du binding de la FlipView // Les proprits sont utilises directement dans la vue pour l'affichage de l'image et du titre fichiers.forEach(function (fichier) { var imageObj = { image: URL.createObjectURL(fichier), titre: fichier.name }; binding // Nous insrons notre objet dans la source de donnes du
sourceImages.insertAtEnd('', imageObj); }); // Lorsque nous avons toutes les images dans notre FlipView, nous pouvons lancer la boucle du diaporama } CadrePhotoNumerique.Diaporama.lancer();
); })();
Tlcharger le TP
V oil, c'est la fin de ce TP qui, j'espre, vous aura plu. Ce code n'est videmment pas parfait, mais rentre dans les contraintes qu'on s'tait fixes. partir de l, vous pouvez y ajouter tout un tas de fonctionnalits, comme une meilleure gestion des images, la gestion des sous-rpertoires, le choix pour l'utilisateur d'un autre rpertoire, etc. Ce ne sont pas les ides qui manquent. Ces travaux closent cette grande partie du big tuto. Si vous les avez russis, vous avez toutes les bases ncessaires pour dvelopper une application stable. Nous venons de voir principalement de grands points importants comme :
www.siteduzero.com
156/240
Comme l'exercice ne comprenait pas tous les chapitres vus prcdemment, je vous conseille de bien tout revoir pour passer la prochaine tape. Cette deuxime partie est termine. Entre les travaux pratiques et les nombreux chapitres, vous avez atteint un bon niveau dans le dveloppement d'applications pour Windows 8. Mme si tout n'est pas forcment compltement acquis, l'important est d'avoir les bases pour rechercher ensuite les lments dont vous avez besoin. La prochaine partie va venir complter vos connaissances en ajoutant de nombreuses nouvelles fonctionnalits vos applications. V ous y dcouvrirez : L'utilisation de tous les contrats pour s'interfacer avec le systme ; La gestion des tuiles dynamiques sur l'cran de dmarrage de Windows 8 ; Les connexions rseau et avec des services web ; La traduction de vos applications dans plusieurs langues ; La gestion de la scurit au sein de vos applications ; Et, bien videmment, comment dployer vos applications sur le Windows Store. Je vous donne donc rendez-vous dans la prochaine partie pour de nouveaux chapitres.
www.siteduzero.com
157/240
Les contrats
Il existe sur ce nouveau Windows quatre contrats utilisables pour s'interfacer avec certaines fonctionnalits du systme. Ces quatre contrats sont reprsents par les quatre boutons accessibles dans la barre systme qui apparat sur la droite de l'cran. Nous avons dj vu un de ces contrats, les paramtres, dans la prcdente partie du cours, il nous en reste donc trois dcouvrir : La recherche ; Le partage ; La diffusion multimdia sur d'autres priphriques.
Lorsque vous cliquez dessus, une fonctionnalit de recherche se dclenche et s'interface avec certaines fonctionnalits de Windows, comme : La liste de vos applications ; Les paramtres systme ; La liste de vos fichiers. Mais elle va plus loin en s'interfaant galement avec toutes les applications utilisant ce fameux contrat de recherche. Nous allons apprendre comment l'utiliser et ajouter la possibilit de faire des recherches au sein de nos applications.
www.siteduzero.com
158/240
Pour que le contrat fonctionne compltement, il nous faut galement ajouter sa dclaration dans le Manifest. Ouvrons-le et regardons le nouvel lment qui a t ajout dans l'onglet Dclarations. Une nouvelle dclaration Rechercher a t automatiquement insre lorsque nous avons ajout le contrat. C'est trs bien, mais il nous faut maintenant spcifier la page sur laquelle la recherche doit renvoyer. Nous ajoutons alors searchResults.html dans Page de dmarrage pour excuter cette page lorsque la recherche aura lieu. Nous pouvons ds maintenant tester notre fonctionnalit, elle est vraiment simple mettre en place. Lancez l'application pour la dployer sur votre systme, puis quittez-la. Lancez maintenant une recherche par la barre de droite, vous devriez pouvoir rechercher dans votre application, comme le montre la figure suivante.
www.siteduzero.com
159/240
partager du contenu, comme du texte ou une adresse internet par exemple. Lorsque vous faites glisser la barre de dmarrage de votre cran sur votre droite, Windows 8 propose le bouton de partage du systme, visible la figure suivante.
Lorsque cette fonctionnalit est employe, une liste d'applications pouvant rceptionner ce contenu apparat sur la droite, laissant l'utilisateur choisir avec qui il veut le partager, comme le montre la figure suivante.
Affichage de la barre de partage L'application qui rceptionne ce contenu peut ensuite l'utiliser comme elle le souhaite. Il est possible dans nos applications d'utiliser les deux types de fonctionnalit de partage, savoir envoyer du contenu et le rceptionner.
www.siteduzero.com
160/240
Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView(); // Nous coutons ensuite le moment o il lancera une nouvelle requte de partage envoiContenu.addEventListener("datarequested", function (e) { // Lorsqu'une requte est lance, nous souhaitons y passer du contenu // Nous modifions donc l'objet de la requte // Nous lui spcifions un titre, une description // Puis, comme nous souhaitons envoyer une URL, nous la spcifions avec setUri() var request = e.request; request.data.properties.title = "Partage d'une adresse internet"; request.data.properties.description = "Mon Application partage une adresse url simple"; request.data.setUri(new Windows.Foundation.Uri('http://siteduzero.com')); }); // Nous pouvons maintenant excuter l'envoi de cette requte en demandant l'affichage de la barre de partage // Nous pouvons le faire dans un bouton par exemple document.getElementById('partager').onclick = function () { // Affichage de la barre de partage Windows.ApplicationModel.DataTransfer.DataTransferManager.showShareUI(); };
Il existe plusieurs types de partage. Je vous les livre ici, vous de voir ce que vous souhaitez partager comme contenu suivant les scnarios de vos applications : url : spcifier une adresse internet en utilisant la mthode setUri(). texte : spcifier un simple texte en utilisant la mthode setText(). html : spcifier du contenu HTML en utilisant la mthode setHtmlFormat(). bitmap : spcifier une image en utilisant la mthode setBitmap(). rtf : spcifier un contenu RTF en utilisant la mthode setRtf(). fichiers : spcifier un fichier complet ou une liste de fichiers en utilisant la mthode setStorageItems().
Faites bien attention l'vnement datarequested. Quoi qu'il arrive, toutes les requtes passeront par lui, il faut donc arriver redfinir les lments partager chaque fois qu'il est appel.
www.siteduzero.com
161/240
shareTarget.html, qui correspond la vue sur laquelle tomberont nos utilisateurs lorsqu'ils demanderont le partage. Cette vue apparat dans une barre droite de leur cran par-dessus l'application source du partage. shareTarget.css, qui correspond la feuille de style de la vue. shareTarget.js, qui correspond au contrleur JavaScript de la page. Notre application est, comme toujours avec ces contrats, dj disponible pour le partage. N'hsitez d'ailleurs pas l'excuter pour en faire le test. Si nous regardons dans les dclarations du Manifest, nous voyons que la dclaration Cible du partage a t ajoute. Pour dfinir les types de donnes que notre application peut rcuprer, vous pouvez ajouter un format de donnes par type. V oici la liste des types possibles : text : pour rcuprer un simple texte. uri : pour rcuprer une adresse internet. bitmap : pour rcuprer une image. html : pour rcuprer du contenu HTML. rtf : pour rcuprer du contenu RTF. storageitems : pour rcuprer un fichier ou une liste de fichiers. La Page de dmarrage a automatiquement t dfinie comme tant shareTarget.html lorsqu'on a ajout le contrat.
Utilisation du partage
Par dfaut, dans la vue du fichier shareTarget.html, il y a l'ajout d'un <input> qui permet l'utilisateur d'ajouter un commentaire. C'est un code d'exemple que nous pouvons bien videmment supprimer ou modifier. Il permet de montrer que vous pouvez ajouter des interactions avec vos utilisateurs lors du partage. Dans le fichier shareTarget.js, nous rcuprons les donnes dans la fonction onShareSubmit(). Une fois encore, tout t fait pour nous faciliter la tche. L'objet share.data contient tous les lments de la requte du partage. Nous pouvons donc rcuprer ses donnes et les grer comme bon nous semble. Pour clore ensuite ce partage et rendre la main l'application source, nous appelons share.reportCompleted(). Nous perdons alors l'instance de notre application. Pour grer les donnes, voici la liste des proprits et mthodes que nous pouvons utiliser dans share.data : properties.Application : nom de l'application source. properties.Description : description du partage. properties.Title : titre du partage. availableFormats : contient une liste des types de donnes envoyes. Nous pouvons utiliser cette liste pour tester les types de donnes avant de les rcuprer. contains() : permet de tester si le format de donnes spcifi est utilis. getBitmapAsync() : mthode asynchrone de rcupration d'une image. getHtmlFormatAsync() : mthode asynchrone de rcupration d'un contenu HTML. getRtfFormatAsync() : mthode asynchrone de rcupration d'un contenu RTF. getStorageItemsAsync() : mthode asynchrone de rcupration d'un ou plusieurs fichiers. getTextAsync() : mthode asynchrone de rcupration d'un texte simple. getUriAsync() : mthode asynchrone de rcupration d'une adresse internet. Enfin pour finir, pour interagir avec les lments que nous avons ajouts dans notre vue, n'oubliez pas que nous sommes dans son contrleur JavaScript. Nous pouvons donc, dans la fonction onShareSubmit(), continuer d'interagir avec elle tant que nous n'appelons pas share.reportCompleted(). Du coup, pour rcuprer notre commentaire ajout par l'utilisateur, il suffit simplement de faire : Code : JavaScript var commentaire = document.querySelector(".commentbox").value;
Ce contrat est l'unique possibilit de communication entre deux applications sur Windows 8. C'est une fonctionnalit trs intressante pour les applications bases sur des services web l'usage des communauts.
www.siteduzero.com
162/240
directement sur leur tlvision via leur XBox. Lorsque vous faites glisser la barre de dmarrage de votre cran sur votre droite, Windows 8 propose le bouton des priphriques qui permet d'accder cette fonctionnalit, visible la figure suivante.
Pour nous autres dveloppeurs, il est possible d'incorporer cette fonctionnalit dans nos contenus multimdia, comme la vido ou l'audio, grce un contrat. C'est d'ailleurs une fonctionnalit que Microsoft recommande d'utiliser chez les dveloppeurs d'applications lorsque ceux-ci utilisent des <video> ou des <audio>. Nous allons voir que son intgration dans nos applications est dj oprationnelle, mais que nous pouvons contrler nos sources de diffusion.
Pour dsactiver cette fonctionnalit sur toute la page, et priver ainsi l'utilisateur de toute diffusion possible, il faut utiliser Windows.Media.PlayTo.PlayToManager qui reprsente toute la fonctionnalit de diffusion ct JavaScript. Cet objet contient une proprit defaultSourceSelection que l'on peut dsactiver pour bloquer ainsi la diffusion des lments : Code : JavaScript // Nous rcuprons la fonctionnalit Lire sur de la page courante var lireSur = Windows.Media.PlayTo.PlayToManager.getForCurrentView(); // Puis nous bloquons la diffusion automatique des lments multimdia de la page lireSur.defaultSourceSelection = false;
Il est galement possible de dfinir une petite option en plus sur les lments multimdia de la page, qui permet de spcifier celui qui sera diffus en premier par la fonctionnalit Lire sur. Il suffit d'ajouter l'attribut x-ms-playToPrimary la balise HTML souhaite : Code : HTML <video src="maVideo.mp4" x-ms-playToPrimary />
www.siteduzero.com
163/240
Nous pouvons donc contrler quels lments nous souhaitons voir jous sur d'autres priphriques et slectionner ceux dont nous ne souhaitons pas la diffusion. Le contrat de recherche permet d'ajouter l'application dans la liste des recherches. Cette fonctionnalit utilise une page qui contient l'ensemble des lments de recherche pour les utilisateurs. Le contrat de partage permet de partager du contenu avec d'autres applications et de rcuprer du contenu provenant d'autres applications. La diffusion multimdia permet d'interfacer un objet multimdia avec un priphrique en rseau.
www.siteduzero.com
164/240
Affichage de quelques vignettes de l'cran d'accueil Comme nous l'avions vu dans le chapitre Les rgles de l'UI , il existe deux tailles de vignette : une carre et une rectangulaire, plus large. Chacune des deux tailles permet d'afficher du contenu, textes et images. Pour chaque vignette, on peut galement ajouter un badge. C'est un simple nombre ou glyphe affich en bas droite du cadre de la vignette pour avertir de notifications. En tant que dveloppeurs, nous allons pouvoir interagir avec nos vignettes d'applications. Nous pouvons le faire de deux manires, soit localement par le code de l'application, soit en utilisant le cloud par un service externe. Il nous est galement possible de gnrer des vignettes secondaires qui sont ajoutes sur l'cran d'accueil de Windows pour des parties spcifiques du contenu de nos applications. La seconde section du chapitre explique comment faire. Pour fabriquer une vignette, il existe une multitude de modles dj dfinis par Microsoft. Ils nous permettent d'y ajouter des images et du texte de diffrentes manires avec diffrentes dispositions. Il n'est malheureusement pas possible d'en fabriquer de nouveaux soi-mme. Comme le nombre de modles est trs grand, la troisime section du chapitre les dtaille un un. Lorsque nous saurons les utiliser, il suffira juste de s'y reporter pour les insrer. Nous allons voir maintenant comment prendre totalement la main sur nos vignettes.
www.siteduzero.com
165/240
Cependant, vous avez dj d voir des vignettes sur votre cran d'accueil, qui font tourner leurs contenus comme si elles avaient plusieurs pages. En spcifiant notre application par le code que nous souhaitons utiliser un cycle de vignettes, il est possible de mettre jusqu' cinq pages de contenus diffrents. Windows les fait alors tourner de manire alatoire. Lorsque nous ajoutons une page de contenu de plus, Windows remplace la plus vieille par la nouvelle. Pour plus de prcision dans notre affichage, chaque vignette peut contenir une balise spciale permettant de l'identifier. Avec cette balise, il est alors possible de mettre jour cette unique vignette sans devoir en ajouter une autre. Avec toutes ces fonctionnalits, nous pouvons crer plein de scnarios pour mettre en avant nos applications de manire trs dynamique.
Lorsque nous ajoutons l'image de vignette large optionnelle, cela active alors la possibilit pour l'utilisateur de passer la vignette en mode large avec le bouton Agrandir.
166/240
Avant de commencer, il faut savoir comment fonctionne le contenu d'une vignette. Comme nous en parlions prcdemment, une vignette peut tre compose jusqu' cinq pages de contenu. Chacun de ces contenus est appel notification de vignette et est structur par des balises XML. Il existe une foule de modles de notifications qui sont dtaills dans la troisime section du chapitre, aussi nous n'utiliserons que leurs noms ici en vous laissant vous y reporter. Il nous suffit alors : De choisir un modle pour notre notification. De spcifier ses paramtres, comme du texte et une image par exemple, ainsi que sa dure de vie. D'envoyer cette notification sur notre vignette pour qu'elle puisse l'afficher. Pour l'exemple suivant, nous allons choisir le modle TileSquarePeekImageAndText02, qui contient : Une image sur une face de la notification. Un titre et une description sur une autre face de la notification. Ces deux faces sont interverties alatoirement lorsque Windows le dcide. Dans notre application sous Visual Studio, nous pouvons gnrer cette notification n'importe quel moment dans l'excution du code. Nous utilisons Windows.UI.Notifications qui est le namespace qui contient toutes les fonctionnalits pour grer les vignettes et leurs notifications. Pour l'exemple, nous souhaitons crer une notification carre et l'envoyer sur la vignette. Nous devons alors extraire la source XML du modle utilis, ajouter notre texte et notre image en modifiant les attributs de la source XML, puis insrer ce contenu modifi dans une nouvelle notification. Nous ajouterons enfin une dure de vie de 10 min cette notification et l'enverrons dans notre vignette. Code : JavaScript // Pour gagner du temps, nous fabriquons un alias sur Windows.UI.Notifications var notifications = Windows.UI.Notifications; // Nous rcuprons notre modle var modele = notifications.TileTemplateType.tileSquarePeekImageAndText02; // Puis nous en extrayons la source XML var sourceXml = notifications.TileUpdateManager.getTemplateContent(modele);
// Voici le code XML que nous avons extrait. Nous voyons bien ses balises image et text que nous allons modifier //<tile> // <visual> // <binding template="TileSquarePeekImageAndText02"> // <image id="1" src="image1" alt=""/> // <text id="1"></text> // <text id="2"></text> // </binding> // </visual> //</tile> // Nous rcuprons tous les lments de type image var nosImages = sourceXml.getElementsByTagName("image");
// Nous n'avons qu'un seul lment dans notre tableau // Nous lui modifions ses attributs pour ajouter une source et un alt notre imag // Nous pouvons spcifier la source de l'image avec une URL web ou une URL locale d'application // En cas d'image locale, attention bien ajouter le protocole ms-appx:// nosImages[0].setAttribute("src", "ms-appx:///Nymphea_150x150.png"); nosImages[0].setAttribute("alt", "Mon logo");
// Nous modifions ensuite les deux balises <text> pour leur dfinir un titre et un tex descriptif var nosTextes = sourceXml.getElementsByTagName("text"); nosTextes[0].appendChild(sourceXml.createTextNode("Le titre")); nosTextes[1].appendChild(sourceXml.createTextNode("Le texte descriptif"));
www.siteduzero.com
167/240
// Lorsque notre source XML est remplie, nous fabriquons un nouvel objet notification var notreNotification = new notifications.TileNotification(sourceXml); // Nous ajoutons notre notification un temps de vie de 10 min par rapport l'heure actuelle var tempsActuel = new Date(); notreNotification.expirationTime = new Date(tempsActuel.getTime() + 600 * 1000);
// Enfin, nous envoyons notre nouvelle notification sur notre vignette notifications.TileUpdateManager.createTileUpdaterForApplication().update(notreNotifica
En lanant notre application, nous pouvons dcouvrir que notre vignette alterne son contenu entre notre image et le texte dfini, comme le montre la figure suivante.
www.siteduzero.com
168/240
// Nous commenons la construction d'une seconde source XML, avec cette fois-ci le mod TileWideImageAndText01 qui est propre une notification large var modeleLarge = notifications.TileTemplateType.tileWideImageAndText01; // Nous en extrayons la source XML var sourceXMLlarge = notifications.TileUpdateManager.getTemplateContent(modeleLarge // Notre nouveau modle XML : //<tile> // <visual> // <binding template="TileWideImageAndText01"> // <image id="1" src="" alt=""/> // <text id="1"></text> // </binding> // </visual> //</tile> // Nous lui ajoutons une image, large de 310 sur 150 pixels nosImages = sourceXMLlarge.getElementsByTagName("image"); nosImages[0].setAttribute("src", "ms-appx:///Nymphea_dynamic_310x150.png"); nosImages[0].setAttribute("alt", "Mon logo"); // Puis nous lui ajoutons son texte var nosTextes = sourceXMLlarge.getElementsByTagName("text"); nosTextes[0].appendChild(sourceXMLlarge.createTextNode("Le texte descriptif"));
// Jusqu'ici rien de compliqu, nous avons simplement fait pareil que pour l'exemple prcdent // Il nous faut maintenant jouer avec les lments du XML // Notre but est de rcuprer tout ce que contient la balise <binding> de notre nouvel source // Et de l'ajouter dans la balise <visual> de notre premire source // Nous aurons ainsi <visual> contenant deux <binding> // Nous rcuprons l'lment <binding> de notre nouvelle source var node = sourceXml.importNode(sourceXMLlarge.getElementsByTagName("binding").item true); // Puis nous l'ajoutons comme enfant dans la premire source sourceXml.getElementsByTagName("visual").item(0).appendChild(node); // Notre XML correspond maintenant : //<tile> // <visual> // <binding template="TileSquarePeekImageAndText02"> // <image id="1" src="ms-appx:///Nymphea_dynamic_150x150.png" alt="Mon logo"/> // <text id="1">Le titre</text> // <text id="2">Le texte descriptif</text> // </binding> // // <binding template="TileWideImageAndText01">
www.siteduzero.com
169/240
// <image id="1" src="ms-appx:///Nymphea_dynamic_310x150.png" alt="Mon logo"/> // <text id="1">Le texte descriptif</text> // </binding> // </visual> //</tile> // Nous fabriquons notre notification partir de notre source complte // Et continuons le code prcdemment utilis var notreNotification = new notifications.TileNotification(sourceXml); var tempsActuel = new Date(); notreNotification.expirationTime = new Date(tempsActuel.getTime() + 600 * 1000);
notifications.TileUpdateManager.createTileUpdaterForApplication().update(notreNotifica
Maintenant, en agrandissant notre vignette, nous obtenons une notification personnalise, comme la figure suivante.
Pour pouvoir ajouter jusqu' cinq notifications, il vous suffit tout simplement de continuer d'ajouter des sources XML de la mme manire que dans ces deux derniers exemples.
www.siteduzero.com
170/240
Elle videra instantanment la liste de notifications en attente dans la vignette et vous rendra votre vignette de dpart avec votre logo simple.
// Enfin, nous utilisons addToSchedule() au lieu de update() pour lancer notre notification
notifications.TileUpdateManager.createTileUpdaterForApplication().addToSchedule(notreN
En lanant notre application, nous retrouverons notre notification habituelle au bout d'un dlai de 10 secondes.
171/240
Pour avoir du contenu encore plus dynamique sur nos vignettes, il est possible d'utiliser une fonctionnalit qui ira appeler un service web pour en rcuprer des donnes de notifications sur plusieurs priodes de temps. Il est ainsi possible par exemple de crer une notification toutes les heures en chargeant le dernier produit d'un magasin en ligne. Il existe deux mthodes pour utiliser cette fonctionnalit : Soit en appelant une seule notification ajouter tous les X temps. Soit en appelant jusqu' cinq notifications en mme temps tous les X temps.
Pour activer cette fonctionnalit, il faut utiliser la mthode enableNotificationQueue() qui va permettre l'application de grer la file d'attente des notifications. Cette mthode n'est ajouter qu'une seule fois aprs l'installation de l'application. Sans cela, vous pourriez vous retrouver avec des notifications qui se chevaucheraient.
Pour ce faire, le code est encore plus simple que dans nos prcdents exemples. Regardons comment fonctionne la premire mthode pour ajouter une seule notification : Code : JavaScript // Petit alias sur la fonctionnalit des notifications var notifications = Windows.UI.Notifications; // Nous activons la file d'attente des notifications. // Attention ne placer cette ligne qu'une fois l'application installe. Plus jamais
notifications.TileUpdateManager.createTileUpdaterForApplication().enableNotificationQu
// Nous dterminons la frquence laquelle le service web sera appel pour gnrer un notification // Ici, toutes les demi-heures var recurrence = notifications.PeriodicUpdateRecurrence.halfHour; // Nous fabriquons notre objet URI avec l'adresse de notre modle de notification var url = new Windows.Foundation.Uri("http://notre_serveur/modele.xml");
// Puis nous lanons notre notification priodique avec les deux paramtres prcdemme notifications.TileUpdateManager.createTileUpdaterForApplication().startPeriodicUpdate recurrence);
Il nous faut ensuite fabriquer notre service web. Tout ce que nous avons faire, c'est afficher un des modles de notification (contenus dans la troisime section du chapitre) avec ses donnes directement renseignes. Pour notre exemple, nous utilisons un simple fichier XML contenant : Code : XML <tile> <visual> <binding template="TileSquarePeekImageAndText02"> <image id="1" src="http://mon_serveur/sandra.png" alt="Notre image"/> <text id="1">Titre</text> <text id="2">Notre texte descriptif</text> </binding> </visual> </tile>
www.siteduzero.com
172/240
En excutant notre application, une premire notification est appele automatiquement avec le modle inscrit sur notre serveur, comme le montre la figure suivante.
La seconde notification sera ensuite appele dans une demi-heure, la troisime, la demi-heure d'aprs, et ainsi de suite. Dans le cas de la deuxime mthode, en gnrant jusqu' cinq notifications, il nous faut crer tout simplement une liste d'URL qui seront appeles en mme temps : Code : JavaScript var notifications = Windows.UI.Notifications;
// Nous fabriquons notre tableau d'objets URI avec les adresses de nos modles de noti // Nous pouvons mettre jusqu' 5 URL var nosUrls = [ new Windows.Foundation.Uri("http://notre_serveur/modele.xml"), new Windows.Foundation.Uri("http://notre_serveur/modele2.xml"), new Windows.Foundation.Uri("http://notre_serveur/modele3.xml") ];
// Puis nous lanons notre notification priodique avec startPeriodicUpdateBatch() liste d'URL
notifications.TileUpdateManager.createTileUpdaterForApplication().startPeriodicUpdateB recurrence);
En excutant notre application, nous pouvons voir nos trois notifications apparatre sur notre vignette.
www.siteduzero.com
173/240
Comme pour les notifications de contenu, un badge utilise un modle XML, et c'est le namespace Windows.UI.Notifications qui contient les fonctionnalits pour le grer. Il n'existe cependant que deux modles utilisables pour un badge, soit celui des nombres, soit celui des glyphes. Dans le prochain exemple, nous allons voir comment ajouter un nombre ou un glyphe sur notre vignette : Code : JavaScript // Petit alias sur Windows.UI.Notifications var notifications = Windows.UI.Notifications; // Nous rcuprons la source XML du modle de nombre var modeleBadge = notifications.BadgeTemplateType.badgeNumber; // Pour utiliser le modle des glyphes, nous pouvons utiliser la place : // var modeleBadge = notifications.BadgeTemplateType.badgeGlyph; // Rcuprons ensuite la source XML de notre modle var sourceXml = notifications.BadgeUpdateManager.getTemplateContent(modeleBadge); // La source XML d'un badge se rsume : // <badge value="" /> // Nous modifions alors la valeur de la balise en y insrant notre nombre : 8 var badgeBalise = sourceXml.getElementsByTagName("badge"); badgeBalise[0].setAttribute("value", "8");
// Pour un badge de type glyphe, nous pourrions changer la valeur par le nom d'un glyp comme : // badgeBalise[0].setAttribute("value", "newMessage"); // Nous fabriquons ensuite notre notification avec la source XML var badgeNotification = new notifications.BadgeNotification(sourceXml); // Enfin, nous envoyons la notification du badge sur la vignette
notifications.BadgeUpdateManager.createBadgeUpdaterForApplication().update(badgeNotifi
V ous remarquerez que le code se rapproche beaucoup des notifications de contenus. En testant ce code, vous devriez avoir le nombre 8 qui apparat sur votre vignette, comme sur la figure suivante.
Pour vous aider avec les glyphes, en voici la liste complte utilisable sur nos badges. Il n'est malheureusement pas possible d'ajouter nos propres glyphes en plus de ceux-ci.
www.siteduzero.com
174/240
Pour effacer un badge, il suffit d'envoyer une nouvelle notification contenant la valeur none au badge.
Nous venons de voir comment grer une vignette avec ses notifications dans la section prcdente. Il est possible pour une application de pouvoir gnrer des vignettes en plus, lies des catgorisations de son contenu. Il est possible par exemple dans l'application Contacts de pouvoir ajouter des vignettes secondaires pour chacun de nos contacts sur l'cran d'accueil. Lorsque l'utilisateur lance une vignette secondaire, celle-ci lance en fait l'application principale avec des arguments spciaux dfinis dans la vignette. Une vignette secondaire tant facultative aussi bien pour une application que dans son utilisation, c'est toujours l'utilisateur qui doit pouvoir choisir de l'ajouter, il ne faut en aucun cas la lui forcer. Cela invaliderait coup sr l'application sur le Windows Store. Gnralement, on ajoute un bouton spcial dans l'AppBar de l'application. C'est un comportement standard auquel les utilisateurs sont habitus.
En testant ce code, nous pouvons afficher l'AppBar en bas de l'cran avec son bouton de punaise sur la droite.
175/240
Maintenant que nous avons notre bouton, nous pouvons lui donner l'action d'ajouter la vignette. Mais avant cela, il faut dfinir un identifiant unique pour notre vignette. C'est avec lui que nous pourrons l'identifier au cas o nous en ajouterions plusieurs autres. De plus, la requte de cration d'une vignette secondaire demande obligatoirement l'utilisateur de confirmer son choix via une petite popup qu'il va nous falloir afficher ct de notre bouton, comme le montre la figure suivante.
Nous paramtrons notre vignette principale dans le fichier Manifest de notre application. Pour notre vignette secondaire, nous pouvons ajouter les mmes genres de paramtres, mais il faut les spcifier directement par le code lors de sa cration pour qu'elle puisse tre totalement diffrente de la principale. Le code suivant utilise l'action de notre bouton pour crer une vignette. Il dcrit toutes les proprits appliquer et comment placer la popup de confirmation : Code : JavaScript // Rcupration de l'vnement click du bouton dans l'AppBar document.getElementById('epingleBouton').onclick = function () { // Nous rcuprons les coordonnes du bouton grce sa mthode getBoundingClientRect() // Puis nous les formatons pour le moment o nous aurons besoin d'afficher la popup var bouton = this; var rectangle = bouton.getBoundingClientRect(); var coordonnees = { x: rectangle.left, y: rectangle.top, width: rectangle.width, height: rectangle.height }; // Nous dfinissons l'id de notre nouvelle vignette secondaire var idVignetteSecondaire = 'vignette2'; // Nous dfinissons la liste de ses proprits // Cette chane sera utilise comme argument lors du lancement de l'application via cette vignette. // Nous pourrons alors faire un test dessus et grer l'accs direct la partie du contenu concern var argumentsVignette = 'vignetteCategorie2';
www.siteduzero.com
176/240
Lorsque notre vignette secondaire est dj sur l'cran d'accueil, il nous est possible de le savoir avec le code suivant : Code : JavaScript // Renvoie true si la vignette secondaire est active sur l'cran d'accueil var utilisee = Windows.UI.StartScreen.SecondaryTile.exists(idVignetteSecondaire)
Cela nous permet de grer le bouton de punaise pour changer son texte et son action en fonction de son activit existante : Code : JavaScript // On teste lexistence de notre vignette secondaire if (Windows.UI.StartScreen.SecondaryTile.exists(idVignetteSecondaire)) { // On affiche un bouton qui permet de supprimer la vignette document.getElementById("commandButton").winControl.label = "Enlever de l'cran d'accueil"; document.getElementById("commandButton").winControl.icon = WinJS.UI.AppBarIcon.unpin; } else { // On affiche un bouton qui permet d'ajouter la vignette
www.siteduzero.com
177/240
TileSquareBlock
Code : XML <tile> <visual> <binding template="TileSquareBlock"> <text id="1">Text Field 1</text> <text id="2">Text Field 2</text> </binding> </visual> </tile>
TileSquareText01
Le rendu se trouve la figure suivante.
TileSquareText01
www.siteduzero.com
178/240
TileSquareText02
Le rendu se trouve la figure suivante.
TileSquareText02
Code : XML <tile> <visual> <binding template="TileSquareText02"> <text id="1">Text Field 1</text> <text id="2">Text Field 2</text> </binding> </visual> </tile>
TileSquareText03
Le rendu se trouve la figure suivante.
TileSquareText03
Code : XML <tile> <visual> <binding template="TileSquareText03"> <text id="1">Text Field 1</text> <text id="2">Text Field 2</text> <text id="3">Text Field 3</text> <text id="4">Text Field 4</text>
www.siteduzero.com
179/240
TileSquareText04
Le rendu se trouve la figure suivante.
TileSquareText04
Code : XML <tile> <visual> <binding template="TileSquareText04"> <text id="1">Text Field 1</text> </binding> </visual> </tile>
TileSquareImage
Le rendu se trouve la figure suivante.
TileSquareImage
Code : XML <tile> <visual> <binding template="TileSquareImage"> <image id="1" src="image1" alt="alt text"/> </binding> </visual> </tile>
TileSquarePeekImageAndText01
www.siteduzero.com
180/240
TileSquarePeekImageAndText01
Code : XML <tile> <visual> <binding template="TileSquarePeekImageAndText01"> <image id="1" src="image1" alt="alt text"/> <text id="1">Text Header Field 1</text> <text id="2">Text Field 2</text> <text id="3">Text Field 3</text> <text id="4">Text Field 4</text> </binding> </visual> </tile>
TileSquarePeekImageAndText02
Le rendu se trouve la figure suivante.
TileSquarePeekImageAndText02
www.siteduzero.com
181/240
TileSquarePeekImageAndText03
Le rendu se trouve la figure suivante.
TileSquarePeekImageAndText03
Code : XML <tile> <visual> <binding template="TileSquarePeekImageAndText03"> <image id="1" src="image1" alt="alt text"/> <text id="1">Text Field 1</text> <text id="2">Text Field 2</text> <text id="3">Text Field 3</text> <text id="4">Text Field 4</text> </binding> </visual> </tile>
TileSquarePeekImageAndText04
Le rendu se trouve la figure suivante.
www.siteduzero.com
182/240
TileSquarePeekImageAndText04
Code : XML <tile> <visual> <binding template="TileSquarePeekImageAndText04"> <image id="1" src="image1" alt="alt text"/> <text id="1">Text Field 1</text> </binding> </visual> </tile>
TileWideText01
Code : XML <tile> <visual> <binding template="TileWideText01"> <text id="1">Text Header Field 1</text> <text id="2">Text Field 2</text> <text id="3">Text Field 3</text> <text id="4">Text Field 4</text> <text id="5">Text Field 5</text>
www.siteduzero.com
183/240
TileWideText02
Le rendu se trouve la figure suivante.
TileWideText02
Code : XML <tile> <visual> <binding template="TileWideText02"> <text id="1">Text Header Field 1</text> <text id="2">Text Field 2</text> <text id="3">Text Field 3</text> <text id="4">Text Field 4</text> <text id="5">Text Field 5</text> <text id="6">Text Field 6</text> <text id="7">Text Field 7</text> <text id="8">Text Field 8</text> <text id="9">Text Field 9</text> </binding> </visual> </tile>
TileWideText03
Le rendu se trouve la figure suivante.
TileWideText03
Code : XML <tile> <visual> <binding template="TileWideText03"> <text id="1">Text Header Field 1</text> </binding>
www.siteduzero.com
184/240
TileWideText04
Le rendu se trouve la figure suivante.
TileWideText04
Code : XML <tile> <visual> <binding template="TileWideText04"> <text id="1">Text Field 1</text> </binding> </visual> </tile>
TileWideText05
Le rendu se trouve la figure suivante.
TileWideText05
Code : XML <tile> <visual> <binding template="TileWideText05"> <text id="1">Text Field 1</text> <text id="2">Text Field 2</text> <text id="3">Text Field 3</text> <text id="4">Text Field 4</text> <text id="5">Text Field 5</text> </binding> </visual> </tile>
www.siteduzero.com
185/240
TileWideText06
Le rendu se trouve la figure suivante.
TileWideText06
Code : XML <tile> <visual> <binding template="TileWideText06"> <text id="1">Text Field 1</text> <text id="2">Text Field 2</text> <text id="3">Text Field 3</text> <text id="4">Text Field 4</text> <text id="5">Text Field 5</text> <text id="6">Text Field 6</text> <text id="7">Text Field 7</text> <text id="8">Text Field 8</text> <text id="9">Text Field 9</text> <text id="10">Text Field 10</text> </binding> </visual> </tile>
TileWideText07
Le rendu se trouve la figure suivante.
TileWideText07
Code : XML <tile> <visual> <binding template="TileWideText07"> <text id="1">Text Field 1</text> <text id="2">Text2</text> <text id="3">Text Field 3</text> <text id="4">Text4</text> <text id="5">Text Field 5</text> <text id="6">Text6</text>
www.siteduzero.com
186/240
TileWideText08
Le rendu se trouve la figure suivante.
TileWideText08
Code : XML <tile> <visual> <binding template="TileWideText08"> <text id="1">Text1</text> <text id="2">Text Field 2</text> <text id="3">Text3</text> <text id="4">Text Field 4</text> <text id="5">Text5</text> <text id="6">Text Field 6</text> <text id="7">Text7</text> <text id="8">Text Field 8</text> <text id="9">Text9</text> <text id="10">Text Field 10</text> </binding> </visual> </tile>
TileWideText09
Le rendu se trouve la figure suivante.
TileWideText09
www.siteduzero.com
187/240
TileWideText10
Le rendu se trouve la figure suivante.
TileWideText10
Code : XML <tile> <visual> <binding template="TileWideText10"> <text id="1">Text Header Field 1</text> <text id="2">Txt2</text> <text id="3">Text Field 3</text> <text id="4">Txt4</text> <text id="5">Text Field 5</text> <text id="6">Txt6</text> <text id="7">Text Field 7</text> <text id="8">Txt8</text> <text id="9">Text Field 9</text> </binding> </visual> </tile>
TileWideText11
Le rendu se trouve la figure suivante.
TileWideText11
www.siteduzero.com
188/240
TileWideImage
Le rendu se trouve la figure suivante.
TileWideImage
Code : XML <tile> <visual> <binding template="TileWideImage"> <image id="1" src="image1.png" alt="alt text"/> </binding> </visual> </tile>
TileWideImageCollection
Le rendu se trouve la figure suivante.
TileWideImageCollection
www.siteduzero.com
189/240
TileWideImageAndText01
Le rendu se trouve la figure suivante.
TileWideImageAndText01
Code : XML <tile> <visual> <binding template="TileWideImageAndText01"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Field 1</text> </binding> </visual> </tile>
TileWideImageAndText02
Le rendu se trouve la figure suivante.
TileWideImageAndText02
Code : XML <tile> <visual> <binding template="TileWideImageAndText02"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Field 1</text>
www.siteduzero.com
190/240
TileWideBlockAndText01
Le rendu se trouve la figure suivante.
TileWideBlockAndText01
Code : XML <tile> <visual> <binding template="TileWideBlockAndText01"> <text id="1">Text Field 1</text> <text id="2">Text Field 2</text> <text id="3">Text Field 3</text> <text id="4">Text Field 4</text> <text id="5">T5</text> <text id="6">Text Field 6</text> </binding> </visual> </tile>
TileWideBlockAndText02
Le rendu se trouve la figure suivante.
TileWideBlockAndText02
Code : XML <tile> <visual> <binding template="TileWideBlockAndText02"> <text id="1">Text Field 1</text> <text id="2">T2</text> <text id="3">Text Field 3</text> </binding>
www.siteduzero.com
191/240
TileWideSmallImageAndText01
Le rendu se trouve la figure suivante.
TileWideSmallImageAndText01
Code : XML <tile> <visual> <binding template="TileWideSmallImageAndText01"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Header Field 1</text> </binding> </visual> </tile>
TileWideSmallImageAndText02
Le rendu se trouve la figure suivante.
TileWideSmallImageAndText02
Code : XML <tile> <visual> <binding template="TileWideSmallImageAndText02"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Header Field 1</text> <text id="2">Text Field 2</text> <text id="3">Text Field 3</text> <text id="4">Text Field 4</text> <text id="5">Text Field 5</text> </binding> </visual> </tile>
www.siteduzero.com
192/240
TileWideSmallImageAndText03
Le rendu se trouve la figure suivante.
TileWideSmallImageAndText03
Code : XML <tile> <visual> <binding template="TileWideSmallImageAndText03"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Field 1</text> </binding> </visual> </tile>
TileWideSmallImageAndText04
Le rendu se trouve la figure suivante.
TileWideSmallImageAndText04
Code : XML <tile> <visual> <binding template="TileWideSmallImageAndText04"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Header Field 1</text> <text id="2">Text Field 2</text> </binding> </visual> </tile>
TileWideSmallImageAndText05
Le rendu se trouve la figure suivante.
www.siteduzero.com
193/240
TileWideSmallImageAndText05
Code : XML <tile> <visual> <binding template="TileWideSmallImageAndText05"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Header Field</text> <text id="2">Text Field</text> </binding> </visual> </tile>
TileWidePeekImageCollection01
Le rendu se trouve la figure suivante.
TileWidePeekImageCollection01
Code : XML <tile> <visual> <binding template="TileWidePeekImageCollection01"> <image id="1" src="image1.png" alt="alt text"/> <image id="2" src="image2.png" alt="alt text"/> <image id="3" src="image3.png" alt="alt text"/> <image id="4" src="image4.png" alt="alt text"/> <image id="5" src="image5.png" alt="alt text"/> <text id="1">Text Header Field 1</text> <text id="2">Text Field 2</text>
www.siteduzero.com
194/240
TileWidePeekImageCollection02
Le rendu se trouve la figure suivante.
TileWidePeekImageCollection02
Code : XML <tile> <visual> <binding template="TileWidePeekImageCollection02"> <image id="1" src="image1.png" alt="alt text"/> <image id="2" src="image2.png" alt="alt text"/> <image id="3" src="image3.png" alt="alt text"/> <image id="4" src="image4.png" alt="alt text"/> <image id="5" src="image5.png" alt="alt text"/> <text id="1">Text Header Field 1</text> <text id="2">Text Field 2</text> <text id="3">Text Field 3</text> <text id="4">Text Field 4</text> <text id="5">Text Field 5</text> </binding> </visual> </tile>
TileWidePeekImageCollection03
Le rendu se trouve la figure suivante.
www.siteduzero.com
195/240
TileWidePeekImageCollection03
Code : XML <tile> <visual> <binding template="TileWidePeekImageCollection03"> <image id="1" src="image1.png" alt="alt text"/> <image id="2" src="image2.png" alt="alt text"/> <image id="3" src="image3.png" alt="alt text"/> <image id="4" src="image4.png" alt="alt text"/> <image id="5" src="image5.png" alt="alt text"/> <text id="1">Text Header Field 1</text> </binding> </visual> </tile>
TileWidePeekImageCollection04
Le rendu se trouve la figure suivante.
TileWidePeekImageCollection04
www.siteduzero.com
196/240
TileWidePeekImageCollection05
Le rendu se trouve la figure suivante.
TileWidePeekImageCollection05
Code : XML <tile> <visual> <binding template="TileWidePeekImageCollection05"> <image id="1" src="image1.png" alt="alt text"/> <image id="2" src="image2.png" alt="alt text"/> <image id="3" src="image3.png" alt="alt text"/> <image id="4" src="image4.png" alt="alt text"/> <image id="5" src="image5.png" alt="alt text"/> <image id="6" src="image6.png" alt="alt text"/> <text id="1">Text Header Field 1</text> <text id="2">Text Field 2</text> </binding> </visual> </tile>
TileWidePeekImageCollection06
Le rendu se trouve la figure suivante.
www.siteduzero.com
197/240
TileWidePeekImageCollection06
Code : XML <tile> <visual> <binding template="TileWidePeekImageCollection06"> <image id="1" src="image1.png" alt="alt text"/> <image id="2" src="image2.png" alt="alt text"/> <image id="3" src="image3.png" alt="alt text"/> <image id="4" src="image4.png" alt="alt text"/> <image id="5" src="image5.png" alt="alt text"/> <image id="6" src="image6.png" alt="alt text"/> <text id="1">Text Header Field 1</text> </binding> </visual> </tile>
TileWidePeekImageAndText01
Le rendu se trouve la figure suivante.
TileWidePeekImageAndText01
www.siteduzero.com
198/240
Code : XML <tile> <visual> <binding template="TileWidePeekImageAndText01"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Field 1</text> </binding> </visual> </tile>
TileWidePeekImageAndText02
Le rendu se trouve la figure suivante.
TileWidePeekImageAndText02
Code : XML <tile> <visual> <binding template="TileWidePeekImageAndText02"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Field 1</text> <text id="2">Text Field 2</text> <text id="3">Text Field 3</text> <text id="4">Text Field 4</text> <text id="5">Text Field 5</text> </binding> </visual> </tile>
TileWidePeekImage01
Le rendu se trouve la figure suivante.
www.siteduzero.com
199/240
TileWidePeekImage01
Code : XML <tile> <visual> <binding template="TileWidePeekImage01"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Header Field 1</text> <text id="2">Text Field 2</text> </binding> </visual> </tile>
TileWidePeekImage02
Le rendu se trouve la figure suivante.
TileWidePeekImage02
Code : XML
www.siteduzero.com
200/240
TileWidePeekImage03
Le rendu se trouve la figure suivante.
TileWidePeekImage03
Code : XML <tile> <visual> <binding template="TileWidePeekImage03"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Header Field 1</text> </binding> </visual> </tile>
TileWidePeekImage04
Le rendu se trouve la figure suivante.
www.siteduzero.com
201/240
TileWidePeekImage04
Code : XML <tile> <visual> <binding template="TileWidePeekImage04"> <image id="1" src="image1.png" alt="alt text"/> <text id="1">Text Field 1</text> </binding> </visual> </tile>
TileWidePeekImage05
Le rendu se trouve la figure suivante.
TileWidePeekImage05
www.siteduzero.com
202/240
TileWidePeekImage06
Le rendu se trouve la figure suivante.
TileWidePeekImage06
Code : XML <tile> <visual> <binding template="TileWidePeekImage06"> <image id="1" src="image1.png" alt="alt text"/> <image id="2" src="image2.png" alt="alt text"/> <text id="1">Text Header Field 1</text> </binding> </visual> </tile>
www.siteduzero.com
203/240
Affichage d'une notification toast Une notification est provisoire, elle disparat au bout de quelques secondes. En cliquant dessus, l'utilisateur entre dans l'application qui en est la propritaire avec des proprits spcifiques. Le but est d'inciter un utilisateur revenir dans nos applications lorsque nous avons du contenu intressant lui proposer.
www.siteduzero.com
204/240
Enfin, nous pouvons ajouter des paramtres qui seront utiliss lorsque l'utilisateur cliquera sur la notification. Dans ce cas, notre application s'ouvrira avec ces paramtres en mmoire. Nous pouvons ainsi les utiliser pour naviguer directement l'endroit cible de notre scnario. Nous allons maintenant regarder comment mettre tout cela en place avec l'exemple suivant. Ce code est ajouter n'importe o dans notre application. Code : JavaScript // Nous ajoutons un petit alias sur Windows.UI.Notifications var notifications = Windows.UI.Notifications; // Nous rcuprons l'identifiant du modle choisi : toastImageAndText01 var modele = notifications.ToastTemplateType.toastImageAndText01; // Nous rcuprons ensuite la source XML du modle var sourceXml = notifications.ToastNotificationManager.getTemplateContent(modele); // // // // // // // // // La source XML correspond : <toast> <visual> <binding template="ToastImageAndText01"> <image id="1" src=""/> <text id="1"></text> </binding> </visual> </toast>
// De mme qu'avec les notifications de vignette, nous modifions directement le DOM du XML // Ici, nous personnalisons le texte principal de la notification var textes = sourceXml.getElementsByTagName("text"); textes[0].appendChild(sourceXml.createTextNode("Notre information pour l'utilisateur.")); // Nous personnalisons galement son image // Pour rappel, nous pouvons utiliser une image internet avec http:// var images = sourceXml.getElementsByTagName("image"); images[0].setAttribute("src", "ms-appx:///Nymphea_150x150.png"); // Nous rcuprons le DOM XML de l'lment principal toast // Cela va nous permettre de lui ajouter des attributs pour spcifier des options var toastXML = sourceXml.selectSingleNode("/toast"); // OPTIONNEL : Si nous souhaitons activer la dure longue de 25 secondes // nous pouvons ajouter la ligne suivante toastXML.setAttribute("duration", "long"); // OPTIONNEL : Si nous souhaitons ajouter un son audio // nous pouvons ajouter les lignes suivantes // Nous fabriquons un lment DOM audio
www.siteduzero.com
205/240
// Puis nous ajoutons l'lment audio dans la source XML de la notification toastXML.appendChild(audio); // Pour ajouter des paramtres lors de l'activation de l'application par le // clic de l'utilisateur sur l'icne, nous spcifions l'attribut launch toastXML.setAttribute("launch", '{"type":"toast","parametre1":"blablabla","parametre2":"etc etc"}'); // Enfin, nous fabriquons notre objet notification var notification = new notifications.ToastNotification(sourceXml); // Puis nous envoyons cet objet directement dans le manager de notifications notifications.ToastNotificationManager.createToastNotifier().show(notification);
En excutant notre application, nous devrions voir immdiatement notre notification apparatre. Nous pouvons ajouter un setTimeout() qui appellera dans quelques secondes notre notification, et naviguer dans l'cran d'accueil pour bien voir l'impact de notre notification.
var textes = sourceXml.getElementsByTagName("text"); textes[0].appendChild(sourceXml.createTextNode("Notre information pour l'utilisateur." var images = sourceXml.getElementsByTagName("image"); images[0].setAttribute("src", "ms-appx:///Nymphea_150x150.png"); var toastXML = sourceXml.selectSingleNode("/toast"); var audio = sourceXml.createElement("audio"); audio.setAttribute("src", "ms-winsoundevent:Notification.IM"); toastXML.appendChild(audio);
toastXML.setAttribute("launch", '{"type":"toast","parametre1":"blablabla","parametre2" // C'est partir d'ici que notre code change // Nous dfinissons la date laquelle lancer la notification // Ici, nous utilisons la date courante en y ajoutant 3 secondes
www.siteduzero.com
206/240
// Nous fabriquons notre notification ScheduledToastNotification() qui prend en co // la date d'envoi en plus de la source XML var notification = new Windows.UI.Notifications.ScheduledToastNotification(sourceXml // Enfin nous ajoutons notre notification la minuterie qui envoie les notifications Windows.UI.Notifications.ToastNotificationManager.createToastNotifier().addToSchedule
Nous pouvons excuter notre application. Elle devrait apparatre 5 fois dans les prochaines minutes.
toastText01
www.siteduzero.com
207/240
toastText02
Le rendu se trouve la figure suivante.
toastText02
Code : XML <toast> <visual> <binding template="ToastText02"> <text id="1">headlineText</text> <text id="2">bodyText</text> </binding> </visual> </toast>
toastText03
Le rendu se trouve la figure suivante.
toastText03
Code : XML <toast> <visual> <binding template="ToastText03"> <text id="1">headlineText</text> <text id="2">bodyText</text> </binding> </visual> </toast>
toastText04
Le rendu se trouve la figure suivante.
toastText04
www.siteduzero.com
208/240
Code : XML <toast> <visual> <binding template="ToastText04"> <text id="1">headlineText</text> <text id="2">bodyText1</text> <text id="3">bodyText2</text> </binding> </visual> </toast>
ToastImageAndText01
Code : XML <toast> <visual> <binding template="ToastImageAndText01"> <image id="1" src="image1" alt="image1"/> <text id="1">bodyText</text> </binding> </visual> </toast>
ToastImageAndText02
Le rendu se trouve la figure suivante.
ToastImageAndText02
Code : XML <toast> <visual> <binding template="ToastImageAndText02"> <image id="1" src="image1" alt="image1"/> <text id="1">headlineText</text> <text id="2">bodyText</text> </binding> </visual>
www.siteduzero.com
209/240
ToastImageAndText03
Le rendu se trouve la figure suivante.
ToastImageAndText03
Code : XML <toast> <visual> <binding template="ToastImageAndText03"> <image id="1" src="image1" alt="image1"/> <text id="1">headlineText</text> <text id="2">bodyText</text> </binding> </visual> </toast>
ToastImageAndText04
Le rendu se trouve la figure suivante.
ToastImageAndText04
Code : XML <toast> <visual> <binding template="ToastImageAndText04"> <image id="1" src="image1" alt="image1"/> <text id="1">headlineText</text> <text id="2">bodyText1</text> <text id="3">bodyText2</text> </binding> </visual> </toast>
Une vignette est le rectangle appartenant une application affiche sur l'cran d'accueil de Windows 8. On peut crer jusqu' cinq notifications de contenu sur une vignette. On peut crer autant de vignettes secondaires que l'on souhaite tant qu'elles restent cohrentes avec le scnario de notre application. On peut envoyer des notifications directement sur l'cran de l'utilisateur n'importe quel moment. Il existe une foule de modles pour les notifications de vignettes et les notifications toast.
www.siteduzero.com
210/240
Utiliser AJAX
Avec une page internet, pour envoyer et recevoir des informations avec un serveur sans changer de page il faut utiliser AJAX. Par souci de scurit, les navigateurs ne permettent pas d'utiliser AJAX pour changer des informations avec d'autres noms de domaine que celui qui a charg la page courante. Avec les applications Windows 8, cela n'aurait aucun sens d'activer cette contrainte puisque qu'il n'y a aucun serveur qui fabrique la page. Microsoft a donc ouvert la possibilit aux dveloppeurs d'envoyer des requtes sur n'importe quelle adresse web. Nous allons voir comment crer des requtes AJAX pour changer des informations avec des serveurs via internet.
www.siteduzero.com
211/240
}, function erreur(resultat) { // Nous rcuprons une erreur console.log('Erreur : ' + resultat.statusText); }, function progression(resultat) { // Nous regardons quel est l'tat de la requte } ); console.log('ReadyState : ' + resultat.readyState);
En excutant notre application, nous retrouvons dans la console le code complet de la page d'accueil du Site du Zro.
Format text
Le format texte est le plus simple, la rponse est une chane de caractres que renvoie le serveur disant. Code : JavaScript WinJS.xhr({ url: 'http://site_internet.com', responseType: 'text' }).done( function succes(resultat) { // resultat.response est de type string . // Dans cet exemple, il retourne le code html de la page appele dans la requte } ); console.log(resultat.response);
Format ArrayBuffer
www.siteduzero.com
212/240
Le format ArrayBuffer est un binaire renvoy par le serveur sous forme de tableau d'Int8, Int64 ou tout autre type entier ou flottant. Code : JavaScript WinJS.xhr({ url: 'http://site_internet.com/fichier', responseType: 'arraybuffer' }).done( function succes(resultat) { // resultat.response est de type ArrayBuffer . // Dans cet exemple, nous regardons la taille du binaire renvoy var retourArray = resultat.response; var ints = new Uint32Array(retourArray.byteLength / 4); } ); console.log('Le binaire est long de ' + ints.length + ' uints');
Format Blob
Le format Blob est galement un binaire, mais sous forme d'unique variable, sans tableau. Code : JavaScript WinJS.xhr({ url: 'http://site_internet.com/fichier', responseType: 'blob' }).done( function succes(resultat) { // resultat.response est de type Blob . // Dans cet exemple, nous fabriquons une nouvelle image dans laquelle nous convertissons // notre binaire pour le placer dans la source de l'image var imageSource = URL.createObjectURL(resultat.response); var image = document.body.appendChild(document.createElement("image")); image.src = imageSource; } );
Format document
Le format document est un objet de type DOM XML. Code : JavaScript WinJS.xhr({ url: 'http://site_internet.com/fichier.xml', responseType: 'document'
www.siteduzero.com
213/240
XML
} );
Format json
Le format json est une chane de caractres qu'il faut ensuite parser avec JSON.parse() pour en faire un vritable objet JSON. Code : JavaScript WinJS.xhr({ url: 'http://site_internet.com/fichier.json', responseType: 'json' }).done( function succes(resultat) { // resultat.response est de type string . // Dans cet exemple, nous rcuprons un objet JSON en parsant le retour de la requte } ); var objetJSON = JSON.parse(resultat.response);
Format ms-stream
Le format ms-stream est un format spcial conu par Microsoft (non standard) pour transfrer plus facilement des formats de donnes. Code : JavaScript WinJS.xhr({ url: 'http://site_internet.com/fichier.json', responseType: 'ms-stream' }).done( function succes(resultat) { // resultat.response est au format ms-stream . // Dans cet exemple, nous rcuprons le stream d'une vido, puis l'ajoutons dans la source d'une balise <video> var video = document.getElementById("baliseVideo"); video.src = URL.createObjectURL(resultat.reponse);
} );
www.siteduzero.com
214/240
Maintenant, ajoutons le code suivant comme d'habitude aprs la cration des contrles de la vue, soit dans le then() de WinJS.UI.processAll() de notre fichier contrleur JavaScript : Code : JavaScript args.setPromise(WinJS.UI.processAll().then(function () { // Nous coutons le clic sur le bouton ajout la vue document.getElementById('boutonEnvoyer').onclick = function () { // Nous fabriquons notre FileOpenPicker comme nous savons dj le faire var selecteur = new Windows.Storage.Pickers.FileOpenPicker(); // Nous lui permettons de choisir n'importe quel type de fichier selecteur.fileTypeFilter.replaceAll(["*"]); // Nous lanons la fentre de choix de fichier selecteur.pickSingleFileAsync().then(function (fichier) { // Lorsque l'utilisateur a choisi un fichier if (!fichier) { console.log("Aucun fichier slectionn"); return; } // Nous dfinissons l'URL sur laquelle on envoie le fichier
www.siteduzero.com
215/240
resultat;
// La fonction de progression affiche dans la <div> de rsultat la progression en cours function progression(resultat) { // Nous calculons le pourcentage en cours par rapport // aux bytes dj envoys compars au nombre total de bytes envoyer var pourcentage = Math.round(resultat.progress.bytesSent * 100 / resultat.progress.totalBytesToSend); document.getElementById('resultat').textContent = pourcentage + ' %'; } ); } catch (erreur) { console.log(erreur); } });
} }));
Nous pouvons maintenant excuter l'application, cliquer sur le bouton d'envoi de fichier et slectionner un fichier. Nous verrons alors la progression du chargement se faire en dessous du bouton jusqu' l'envoi total du fichier. WinJS permet de lancer des requtes AJAX simplement avec la fonction WinJS.xhr().
www.siteduzero.com
216/240
www.siteduzero.com
217/240
Les prrequis
Pour ces travaux, il faudra quelques connaissances essentielles pour arriver au bout, c'est--dire savoir : Utiliser la structuration spcifique WinJS (namespaces, classes) ; Utiliser les notifications de vignettes ; Utiliser les requtes AJAX ; Utiliser le DOM XML.
Votre objectif
L'objectif principal de ces travaux est la cration d'une application trs simple qui va mettre jour sa vignette au lancement. Cette application n'a pas sa place sur le Windows Store, car trop pauvre en fonctionnalits. Son interface ne servant rien. V oici le scnario de l'application : L'utilisateur entre sur l'application qui ne contient rien de plus dans son interface qu'une phrase de bienvenue. L'application rcupre directement d'un flux RSS les derniers cours du Site du Zro. Elle gnre alors une notification de vignette contenant le tout dernier cours. La vignette est mise jour avec la notification dans les deux tailles de vignette. Le scnario de l'application n'est pas ax sur la navigation entre pages. V ous ne devez donc en faire qu'une seule.
Les indices
Le vrai dfi de ces TP est la recherche personnelle. Mme si nous avons vu tout ce que vous devez savoir pour terminer votre projet rapidement, vous devriez rencontrer quelques problmes intressants rsoudre. Les bonnes questions se poser sont : Comment utiliser ce format de donnes ? Comment fabriquer des notifications qui auront beaucoup de qualits ?
www.siteduzero.com
218/240
vous de jouer !
V ous avez toutes les connaissances ncessaires pour pouvoir raliser ces TP correctement. Pensez bien structurer votre code sous forme de module comme nous l'avions dj fait dans les prcdents TP. Je vous laisse votre code et vous revois dans la correction. C'est vous de jouer !
Correction
C'est l'heure de la correction. Normalement, si vous tes ici, c'est que vous avez russi intgrer dans votre vignette le dernier cours du Site du Zro avec son titre, une courte description et son icne. Si ce n'est pas le cas et que vous tes bloqus sur un point, vous pouvez bien sr regarder un peu les codes suivants. Pour cette application, la cration d'un projet Application vide dans Visual Studio suffisait amplement. Pas besoin de grer plus d'une seule page, donc pas besoin de navigation. La premire chose qu'il fallait faire dans notre projet tait de dfinir sa capacit utiliser internet. Il fallait donc cocher la case Internet (client) sous l'onglet Capacits du Manifest du projet. Ensuite, il fallait remplir les logos de notre application dans notre Manifest en y spcifiant le logo large de 310 pixels de largeur sur 150 pixels de hauteur. Cela activait ainsi la possibilit pour l'utilisateur d'utiliser la vignette large rectangulaire.
Organiser sa vue
Nous n'avons pas besoin de grand-chose dans notre vue. Nous allons juste afficher l'utilisateur les tapes de cration de la vignette. V oici donc le code de la correction du fichier default.html, qui gre la vue de la page, avec juste en dessous le code du fichier default.css pour les styles : Code : HTML <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta charset="utf-8" /> <title>FluxSDZ</title> <link href="//Microsoft.WinJS.1.0/css/ui-dark.css" rel="stylesheet" /> <script src="//Microsoft.WinJS.1.0/js/base.js"></script> <script src="//Microsoft.WinJS.1.0/js/ui.js"></script> <link href="/css/default.css" rel="stylesheet" /> <script src="/js/default.js"></script> <!-- Ajout du module FluxSDZ qui contient tout notre code contrleur --> <script src="/js/FluxSDZ.js"></script> </head> <body> <!-- Un simple <p> pour afficher l'utilisateur l'tat de la cration de la vignette --> <!-- Son style le place en plein milieu de l'cran sur un fond
www.siteduzero.com
219/240
Code : CSS body { background: #00adef; color: white; } p { text-align: center; padding-top: 300px; font-size: 200%;
@media screen and (-ms-view-state: fullscreen-landscape) { } @media screen and (-ms-view-state: filled) { } @media screen and (-ms-view-state: snapped) { } @media screen and (-ms-view-state: fullscreen-portrait) { }
Une fois le chemin en tte, il ne reste plus qu' rcuprer les lments. V oici le code de la correction du fichier default.js avec une seule ligne en plus permettant de lancer le module de cration de la notification : Code : JavaScript (function () { "use strict"; WinJS.Binding.optimizeBindingReferences = true;
www.siteduzero.com
220/240
// Nous utilisons la mthode notificationDuFlux() de la classe Vignette namespace FluxSDZ // pour crer une notification provenant d'un flux RSS // Nous y insrons l'URL du flux des cours du Site du Zro
FluxSDZ.Vignette.notificationDuFlux('http://www.siteduzero.com/Templates/xml/tutoriels } }));
};
www.siteduzero.com
221/240
Nous fabriquons notre requte AJAX Comme nous savons que nous rcuprons un fichier RSS, nous spcifions que le retour sera au format document pour rcuprer u objet DOM XML
WinJS.xhr({ url: url, responseType: 'document' }).done( // Lorsque la requte renvoie un rsultat function succes(resultat) { // Nous rcuprons notre objet DOM XML var sourceXML = resultat.response;
// Maintenant, nous souhaitons rcuprer le dernier cours ajout // Comme le flux est tri par date, de la plus rcente la plus ancienne // il nous suffit de prendre le NODE du premier lment var dernierCours = sourceXML.getElementsByTagName("item").item(0);
// Dans cet lment, nous rcuprons le contenu du titre. // Nous rcuprons donc toutes les balises <title> puis prenons la premi // puis son contenu
var titre = dernierCours.getElementsByTagName('title').item(0).textConten // Nous faisons pareil avec la description var description = dernierCours.getElementsByTagName('description').item(0).textContent;
sur internet
// Le problme avec la description, c'est qu'elle possde des balises HTM // Nous devons donc en faire le mnage avec une fonction de nettoyage tro description = description.replace(/<(?:.|\n)*?>/gm, '');
// Nous rcuprons une URL d'image pour pouvoir styliser un peu plus notr notification. // En effet, la balise <enclosure> contient un attribut url contenant logo du cours var image = dernierCours.getElementsByTagName('enclosure').item(0).getAttribute('url');
// Nous appelons enfin la mthode qui fabrique une notification en y pla notre contenu rcupr } }, ); vignetteClasse.notification(titre, description, image);
// Notre mthode permettant de fabriquer une notification notification: function (titre, description, image) {
// Une notification de vignette peut faire crasher l'application si l'un de s textes est trop long // Nous dcoupons alors notre description qui peut vraiment prendre beaucoup
www.siteduzero.com
222/240
caractres. // La description sera de toute manire trop longue. Windows la coupera alors ajoutant description = description.substr(0, 200); // Petit alias sur la foncionnalit des notifications var notifications = Windows.UI.Notifications; carre
// C'est exactement le mme que dans le chapitre Les vignettes et notificat var modele = notifications.TileTemplateType.tileSquarePeekImageAndText02 var sourceXml = notifications.TileUpdateManager.getTemplateContent(modele //<tile> // <visual> // <binding template="TileSquarePeekImageAndText02"> // <image id="1" src="" alt=""/> // <text id="1"></text> // <text id="2"></text> // </binding> // </visual> //</tile>
// Nous paramtrons la source de notre image en fonction de la valeur trouve le flux RSS var nosImages = sourceXml.getElementsByTagName("image"); nosImages[0].setAttribute("src", image); nosImages[0].setAttribute("alt", titre); // Nous faisons pareil avec le titre et la description var nosTextes = sourceXml.getElementsByTagName("text"); nosTextes[0].appendChild(sourceXml.createTextNode(titre)); nosTextes[1].appendChild(sourceXml.createTextNode(description)); // Nous ritrons avec un modle de notification rectangulaire large var modeleLarge = notifications.TileTemplateType.tileWideSmallImageAndText04 var sourceXMLlarge = notifications.TileUpdateManager.getTemplateContent(modeleLarge); //<tile> // <visual> // <binding template="TileWideSmallImageAndText04"> // <image id="1" src="image1.png" alt="alt text"/> // <text id="1">Text Header Field 1</text> // <text id="2">Text Field 2</text> // </binding> // </visual> //</tile> nosImages = sourceXMLlarge.getElementsByTagName("image"); nosImages[0].setAttribute("src", image); nosImages[0].setAttribute("alt", titre); var nosTextes = sourceXMLlarge.getElementsByTagName("text"); nosTextes[0].appendChild(sourceXMLlarge.createTextNode(titre)); nosTextes[1].appendChild(sourceXMLlarge.createTextNode(description)); // Nous assemblons nos deux modles var node = sourceXml.importNode(sourceXMLlarge.getElementsByTagName("binding").item(0), true sourceXml.getElementsByTagName("visual").item(0).appendChild(node);
www.siteduzero.com
223/240
var notreNotification = new notifications.TileNotification(sourceXml); // Et nous l'envoyons enfin sur notre vignette
notifications.TileUpdateManager.createTileUpdaterForApplication().update(notreNotific
// Pour finir, nous informons notre utilisateur que la vignette est jour av dernier cours du Site du Zro
// Nous dfinissons notre namespace avec une instance de notre classe de vignette p la rendre accessible globalement WinJS.Namespace.define('FluxSDZ', { Vignette: new _vignette() }); })(window);
Nous pouvons lancer notre application. La rcupration du flux et la cration de la notification sont tellement rapides que nous pouvons tout de suite voir notre vignette (voir figure suivante)
V oil, c'est la fin de ce TP qui, j'espre, vous aura plu. V ous pouvez tlcharger tous les fichiers grce au lien suivant.
Tlcharger le TP
Pour aller plus loin, il serait trs intressant de pouvoir mettre jour notre vignette tous les jours sans que l'utilisateur ne doive revenir sur l'application. Pour cela, il faudrait utiliser la mise jour priodique des notifications de vignette comme nous l'avons vu dans le chapitre Les vignettes et notifications . Nous pourrions ainsi ajouter les cinq derniers cours avec en plus une mise jour tous les jours. Malheureusement, il faut obligatoirement utiliser un serveur qui gnre des modles XML complets pour que cela fonctionne. Comme ce cours n'a pas la prtention de vous apprendre utiliser un serveur, c'est vous de vous fabriquer un service web capable de gnrer ce contenu dans votre langage prfr.
www.siteduzero.com
224/240
Cela relve plus d'une bonne pratique que d'une technique en soi.
www.siteduzero.com
225/240
Il existe cependant deux fonctions qui permettent d'outrepasser la scurisation des proprits innerHTML et outerHTML : WinJS.Utilities.setInnerHTMLUnsafe() et WinJS.Utilities.setOuterHTMLUnsafe(), qui prennent en arguments : L'lment DOM auquel ajouter du contenu. Le contenu au format string. Mme si ces fonctions sont viter absolument, au risque d'avoir de grands trous de scurit dans nos applications, elles se rvlent parfois bien utiles lorsque notre contenu est contrl.
www.siteduzero.com
226/240
// Nous dfinissons une cl pour notre application var applicationKey = 'MonApplication-confidentiel'; // Puis nous enregistrons dans le gestionnaire d'identification l'utilisateur xavier avec son mot de passe mdp enregistrerIdentifiants(applicationKey, 'xavier', 'mdp');
Les identifiants de notre utilisateur sont enregistrs et personne ne peut y avoir accs hormis notre application. Pour retrouver maintenant l'utilisateur au complet, il nous faut utiliser son identifiant. Il nous permet de rcuprer le mot de passe : Code : JavaScript // Notre fonction qui permet de rcuprer le mot de passe d'un utilisateur en utilisant son identifiant // Nous utilisons en paramtre la cl de l'application pour y faire rfrence function obtenirIdentifiants(cleApplication, identifiant) { // Nous rcuprons une instance du gestionnaire d'identification var vault = new Windows.Security.Credentials.PasswordVault(); // Nous demandons au gestionnaire d'identification de nous donner l'objet complet de l'utilisateur // en utilisant simplement son identifiant // Le gestionnaire dchiffrera au passage le mot de passe var identifiantsUtilisateur = vault.retrieve(applicationKey, identifiant); } return identifiantsUtilisateur;
// Nous dfinissons une cl pour notre application var applicationKey = 'MonApplication-confidentiel'; // Nous rcuprons l'objet complet de l'utilisateur avec son identifiant var utilisateur = obtenirIdentifiants(applicationKey, 'xavier'); // Nous rcuprons le mot de passe de l'utilisateur var motDePasse = utilisateur.password;
Il est possible maintenant pour l'utilisateur de regarder et grer tous ses identifiants pour toutes ses applications. Rendez-vous dans le Panneau de configuration de Windows 8, puis dans Comptes et protection des utilisateurs, et enfin dans Gestionnaire d'identification. Nous retrouvons ici tous nos identifiants stocks par les applications les utilisant. Nous y voyons notre exemple prcdent, comme le montre la figure suivante.
www.siteduzero.com
227/240
Gestionnaire
d'identification En tant qu'utilisateur, vous pouvez afficher votre mot de passe de n'importe quelle application en utilisant votre mot de passe de compte Windows 8.
www.siteduzero.com
228/240
En ouvrant ces fichiers ressources, vous remarquez facilement comment ils fonctionnent : Une cl reprsente le nom du texte. Une valeur contient le texte mme de traduction. Une seconde cl avec _ avant le nom et .comment juste aprs permet de donner une description au texte prcdent. Dans notre exemple, nous utilisons les valeurs suivantes :
Pour fr-FR
Code : JavaScript {
"bienvenu" "_bienvenu.comment"
"bienvenuDescription" : "Voici un message de bienvenue en franais.", "_bienvenuDescription.comment" : "Une description du message de bienvenue" }
Pour en-US
Code : JavaScript {
"bienvenu" "_bienvenu.comment"
V oil, c'est tout pour ces fichiers. Nous pouvons y ajouter autant de textes que nous le souhaitons. Par dfaut, WinJS utilise le fichier nomm resources.resjson. Mais si jamais nous voulons sparer nos textes dans diffrents fichiers, il nous faudra ensuite le spcifier lorsque nous aurons utiliser les traductions.
www.siteduzero.com
229/240
Par dfaut ce code ne fonctionne pas. Tout comme les contrles utilisateur, qui ne sont gnrs qu'avec WinJS.UI.processAll(), il nous faut excuter WinJS.Resources.processAll() qui ira appliquer tous les textes aux bons endroits. Dans le code de gnration de votre page, ajoutez le code suivant : Code : JavaScript // On attend que la page soit totalement charge WinJS.Application.onloaded = function () { // On applique les traductions } WinJS.Resources.processAll();
V ous pouvez maintenant excuter votre application et voir vos textes en franais. Pour modifier la valeur d'un attribut de balise HTML, il faut spcifier la proprit attributes de l'objet JSON de data-winres : Code : HTML <body style="padding: 150px"> <!-- Nous ajoutons des <span> qui spcifient les noms des traductions de leur contenu --> <h1><span data-win-res="{textContent: 'bienvenu'}"></span></h1> <p><span data-win-res="{textContent: 'bienvenuDescription', attributes: {'aria-label' : 'bienvenuDescription'}"></span></p> </body>
Si jamais nous utilisons plusieurs fichiers de traduction dans nos rpertoires de langue, nous devons les spcifier en utilisant leur nom avant le nom de la cl du texte. Par exemple, avec un fichier interface.resjson, nous aurons le code suivant : Code : HTML
www.siteduzero.com
230/240
Pour tester nos autres traductions, il nous faut changer simplement la Langue par dfaut sous l'onglet Interface utilisateur de l'application du Manifest de notre application.
Comme pour la vue HTML, si jamais nous utilisons plusieurs fichiers de traduction dans nos rpertoires de langue, nous devons les spcifier en utilisant leur nom avant le nom de la cl du texte. Par exemple, avec un fichier interface.resjson, nous aurons le code suivant : Code : JavaScript var texteBienvenu = WinJS.Resources.getString('interface/bienvenu').value;
On peut utiliser https en AJAX, et c'est mme fortement recommand. Il faut viter les proprits et fonctions innerHTML, outerHTML, WinJS.Utilities.setInnerHTMLUnsafe() et WinJS.Utilities.setOuterHTMLUnsafe() pour viter des injections XSS et de crasher l'application. On peut garder des identifiants d'un utilisateur dans un coffre-fort scuris avec Windows.Security.Credentials.PasswordVault(). On peut traduire son application dans autant de langues qu'on le souhaite en utilisant des fichiers de ressources JSON.
www.siteduzero.com
231/240
Une page internet se lance alors sur le site qui permet nous autres, dveloppeurs Windows 8, de grer nos applications. Si c'est la premire fois que vous venez et que vous n'avez pas de compte, on vous propose d'en crer un (voir figure suivante).
www.siteduzero.com
232/240
Crons notre compte dveloppeur Cliquez sur S'inscrire maintenant pour vous rendre sur le formulaire d'inscription. Si jamais vous n'tes pas connects avec votre compte Live, on vous proposera de le faire pour continuer. Dans la page qui s'affiche, on vous demande de choisir un type de compte dveloppeur. V ous avez le choix entre un compte Particulier et un compte Entreprise.
Choisissez bien
votre compte Le compte Particulier est ncessaire pour toute personne ne disposant pas de structure d'entreprise. Mais il est galement utile pour les petites entreprises, car il permet quand mme de recevoir des paiements en cas de vente d'applications. l'inverse, le compte Entreprise offre la possibilit de soumettre des applications pour le bureau ainsi que des applications qui ne seront dployables que dans l'entreprise mme. Une fois que vous avez fait votre choix, continuez avec la page suivante en y renseignant les informations personnelles demandes (voir figure suivante). Le formulaire n'est pas compliqu, mais possde un petit encart en bas trs important : il vous permet de choisir un nom d'diteur. Ce nom sera utilis et visible partout sur le Windows Store et dans les informations personnelles des applications que vous publierez. V os utilisateurs vous connatront sous ce nom.
Choisissez votre nom d'diteur la validation de ce formulaire, vous devez accepter les termes et conditions du contrat de dveloppeur qui vous lie Microsoft. Je ne peux que trop vous conseiller de le lire, au cas o vous ne seriez pas en accord avec certaines parties. Une fois
www.siteduzero.com
233/240
ce contrat pass, il est l'heure de mettre la main la poche (voir figure suivante). Pour chaque inscription de dveloppeur, Microsoft demande 37 (attention, ce montant est hors taxes). V otre compte est valable une anne et il est renouvel automatiquement tous les ans.
dveloppeur Continuez sur la prochaine page, puis entrez vos informations de paiement pour finaliser l'inscription. Une fois que vous avez pay votre compte, il vous est demand si vous souhaitez configurer un compte de dividende. C'est une configuration qui vous permettra d'encaisser de l'argent avec vos applications. Nous n'allons pas le configurer tout de suite, donc continuez avec Mise en route. Le site vous redirige alors sur le tableau de bord principal du Store, que nous allons utiliser pour soumettre nos applications. partir de maintenant, chaque fois que vous voudrez vous rendre sur le Windows Store pour y grer vos applications, il suffira de cliquer sur Ouvrir le compte de dveloppeur du menu WINDOWS STORE.
Le Manifest
Dans Visual Studio, cliquez de nouveau sur le menu WINDOWS STORE, puis sur Modifier le manifeste d'application. Un fichier s'ouvre dans notre diteur : package.appxmanifest. C'est en fait le fichier qui contient tous les paramtres et informations de votre application qui seront accessibles l'extrieur de cette dernire. Il est inclus automatiquement dans la gnration de votre package final et transmis ensuite au Store. Dans le premier onglet, Interface utilisateur de l'application, presque toutes les donnes sont dj spcifies : Renseignez une description complte dans le champ Description. C'est une case trs importante qui expliquera ce qu'est votre application. Plus vous donnerez envie de l'utiliser et plus vous attirerez de nouveaux utilisateurs. Cochez ensuite les cases des rotations prises en charge par votre application ou laissez vide si elle sait toutes les grer.
www.siteduzero.com
234/240
En dessous, vous devez fournir le logo de votre application sous trois tailles : 150 pixels de largeur sur 150 pixels de hauteur ; 310 pixels de largeur sur 150 pixels de hauteur ; 30 pixels de largeur sur 30 pixels de hauteur. Ces logos serviront aux divers affichages utiliss sur le Store, lors d'une recherche ou sur la fiche d'application par exemple. Donnez ensuite un nom court votre application, puis spcifiez quels logos contiennent le nom de votre application dans leurs images. Texte de premier plan spcifie la couleur qu'utilise le texte sur la tuile de votre application, tout comme Couleur d'arrire-plan. Dans la partie Notifications, dfinissez un logo de 24 pixels de largeur sur 24 pixels de hauteur qui sera affich en cas de notification toast ou pour le verrouillage d'cran. Gnralement, la compatibilit toast et Notifications de verrouillage d'cran doivent rester non dfinis si vous ne les avez pas dj changs lors du dveloppement de ces fonctionnalits. Pour la partie cran de dmarrage, il ne vous reste qu' spcifier la couleur d'arrire-plan si vous ne l'avez pas encore fait. Les onglets Capacits, Dclarations et URI de contenu sont des paramtres qui doivent tre dfinis pendant le dveloppement de certaines fonctionnalits. Ils devraient donc dj tre rgls. L'onglet Packages, quant lui, va tre rempli automatiquement lors de la soumission au Store. Nous allons voir comment cela fonctionne dans les prochaines parties. Pensez sauvegarder votre fichier aprs vos modifications.
Chaque image doit se prsenter sous la forme dun fichier PNG de la taille spcifie. Si vous ne pouvez faire qu'une seule image, utilisez la taille de 414 pixels par 180 pixels. Gardez-les bien sous le coude, nous les utiliserons trs bientt.
Compte de dividende
Cette tape ne vous concerne que si vous souhaitez vendre des applications. Nous allons ajouter un compte de dividende pour pouvoir encaisser l'argent rcolt. V ous aurez besoin d'un RIB pour renseigner le compte en banque qui recevra l'argent vers par Microsoft. Sur votre tableau de bord, cliquez sur Dividende, puis dans la page qui s'affiche sur Ajouter un compte de dividende. On vous demande alors un code de confirmation de votre carte de crdit pour protger votre compte. Renseignez-le puis continuez. Utilisez votre RIB dans le formulaire qui suit pour remplir les informations
www.siteduzero.com
235/240
V otre compte de dividende est ajout et vous tes prts recevoir des paiements pour vos applications. Cependant, il vous manque toute une partie sur la fiscalit pour pouvoir lgalement recevoir ces paiements. Je vous donne rendez-vous dans la prochaine section du chapitre pour comprendre comment cela marche et remplir correctement les formulaires lgaux.
Fonctionnalits avances
www.siteduzero.com
236/240
Les fonctionnalits avances permettent d'ajouter des services gratuits ou payants l'application. Cette partie est trs spcifique et n'est pas intgre dans notre cours. Cliquez simplement sur Enregistrer pour valider cette tape.
Chiffrement
V oici un formulaire qui vous permet de dire Microsoft que votre application utilise ou non du chiffrement. Tous les pays ont des lois en vigueur en rapport avec le chiffrement. Je vous conseille de bien vrifier les exemples donns sur la page par rapport votre application. Remplir une fausse information ce stade pourrait vous valoir des problmes judiciaires avec les pays concerns par la distribution de votre application. Se connecter des adresses en https:// est considr comme du chiffrement (SSL).
Packages
Une fois que toutes les prcdentes tapes sont valides, l'tape des packages devient disponible. Nous allons maintenant compiler et gnrer notre package final qui sera distribu sur le Store : Retournez sur Visual Studio, cliquez sur le menu WINDOWS STORE, puis Crer des packages d'application Cochez la case Oui pour pouvoir vous lier au Windows Store et ainsi rcuprer directement des informations du Store dans le package gnr. Slectionnez ensuite votre application, puis cliquez sur Suivant. Normalement, vous n'avez rien changer dans le formulaire qui s'affiche, hormis les architectures sur lesquelles votre application peut tourner si ce n'est toutes. Cliquez ensuite sur Crer pour lancer la compilation. Une fois la cration du package termine, on vous donne son emplacement sur votre disque dur. Cliquez sur le lien pour ouvrir son rpertoire, il nous sera utile pour la suite. On vous propose galement de tester la validit de votre application tout de suite sur votre ordinateur. Je vous conseille fortement de la lancer. La validation sur le Store peut durer plusieurs jours, si jamais vous avez une erreur, vous devrez recommencer le processus de validation aprs vos corrections. En testant ds maintenant sur votre ordinateur sa validit, vous gagnerez beaucoup de temps, mme si le processus est un peu long. terme, une page de rsultat vous informera du succs ou vous donnera la liste des erreurs. Lorsque la validation a t effectue, vous devez envoyer le package de votre application sur le Store : Sous Visual Studio, cliquez sur le menu WINDOWS STORE, puis sur Tlcharger des packages d'application Cliquez sur Packages. Glissez-dposez votre package (fichier .appxupload) du rpertoire que nous avons prcdemment ouvert dans le cadre propos. Une fois que le package a bien t tlcharg dans la page, vous pouvez cliquer sur Enregistrer.
Description
Dans cette nouvelle tape vous allez devoir donner quelques informations sur votre application : Nous l'avons dj fait dans le Manifest, donc n'hsitez pas copier-coller la description dj rdige dans le champ Description. Renseignez galement les grandes fonctionnalits que propose votre application. Soyez courts mais prcis.
www.siteduzero.com
237/240
Pour que votre application apparaisse dans les recherches, choisissez quelques mots-cls pertinents. Si ce n'est pas votre premire soumission, vous pouvez remplir la Description de la mise jour qui doit contenir les amliorations et corrections de cette nouvelle version. Ajoutez galement les Informations de Copyright et de marque comme Copyright 2012 MonApplication par exemple. En dessous, remplissez les termes spcifiques de votre contrat de licence si vous en possdez et qui seront ajouts au contrat de licence global lors de l'installation de l'application par les utilisateurs. V ous vous souvenez des captures d'cran que vous avez faites prcdemment ? Il est temps de les soumettre elles aussi grce aux cadres Ajouter une image. Ajoutez en plus une description pour chacune d'elle. L'ordre dans lequel vous ajoutez vos images sera l'ordre dans lequel elles apparatront sur le Store.
Ajoutez galement les images promotionnelles que vous aviez faites de la mme manire sur les cadres qui suivent. Enfin, il vous faut remplir les derniers champs : Le matriel recommand si jamais votre application demande une certaine puissance. Le site web officiel qui concerne votre application et o les utilisateurs pourront trouver plus d'informations. Les coordonnes du support technique sous forme d'e-mail ou de page web contenant un formulaire de contact. Et enfin, la politique de confidentialit qui explique ce que vous faites des donnes prives des utilisateurs si jamais vous en rcuprez. Cliquez sur Enregistrer pour valider ce formulaire et terminer cette tape.
Envoyer la soumission
Une fois que vous avez rempli toutes ces tapes, deux boutons deviennent accessibles tout en bas de la page. Je vous invite relire une bonne fois pour toutes les informations que vous avez entres en cliquant sur le bouton Vrifier les informations de version. Une fois que vous tes srs de vous, cliquez sur le bouton final Soumettre pour certification. V otre application entre maintenant dans son processus de validation par Microsoft. Ce processus est long, vous devrez faire preuve de patience pour arriver au bout. Si jamais vous avez des erreurs lors de la validation, les testeurs vous fourniront un texte descriptif trs complet expliquant comment reproduire ces erreurs. Si vous avez fourni une application payante, je vous conseille de passer la prochaine section pour remplir compltement les formulaires lgaux qui vous permettront de dclarer vos revenus.
www.siteduzero.com
238/240
certains pays un trait des taxes avec les tats-Unis, qui permet de faire sauter la taxe amricaine puisque nous en payons une chez nous. Nous allons voir comment mettre cela dans notre formulaire qui arrive.
Profil fiscal
Dans cet exemple, j'ai choisi la France comme pays. vous d'adapter en fonction du pays o vous vivez.
Tout d'abord, rendez-vous dans votre tableau de bord du Windows Store. Nous allons crer un profil fiscal en lien avec Microsoft. Cliquez sur Fiscalit dans le menu de gauche pour voir s'afficher la gestion de votre profil fiscal. Cliquez ensuite sur Continuer pour dmarrer la cration du profil. On vous demande dtablir votre dclaration d'impts. Cochez la seconde case qui indique que vous ne faites pas partie du systme amricain, puis choisissez votre pays, comme la figure suivante.
Slectionnez votre pays Cliquez sur Suivant pour vous rendre sur le prochain formulaire. Une fois encore, remplissez vos informations personnelles dans ce nouveau formulaire, puis cliquez sur Suivant pour vous rendre sur un service spcial de Microsoft. Slectionnez votre type de statut dans le formulaire pour renseigner si vous tes le propritaire rel des paiements ou non. C'est ici que commence la complication. On vous demande de choisir le type de formulaire que vous devez utiliser. Dans la plupart des cas, c'est le formulaire W-8BEN qu'il faut remplir. Cochez donc sa case et validez.
Formulaire W-
8BEN
www.siteduzero.com
239/240
Les champs remplir du formulaire W-8BEN Enfin, pour signer le formulaire, descendez tout en bas et renseignez votre nom complet ainsi qu'un code PIN que vous a envoy Microsoft par e-mail. Aprs l'avoir relu, cliquez sur Envoyer. Pour plus d'informations sur ce formulaire, vous pouvez rcuprer une documentation officielle (en anglais) qui explique comment le remplir. La validation du formulaire prend un peu moins d'une heure. partir de maintenant vous pouvez encaisser l'argent que vous rapportent vos applications ! Pour dployer une application sur le Windows Store, il faut avoir un compte payant dveloppeur. Il faut prparer son application avec le fichier Manifest et faire des captures d'crans et des images promotionnelles de son application. Il est possible de vendre une application sur Le Windows Store en utilisant un compte de dividende et en remplissant le formulaire administratif amricain W-8BEN. Et voil, notre big tuto se termine. Le dveloppement sur Windows 8 est trs intressant, surtout en JavaScript. V ous devriez avoir dj un trs bon niveau, mais sachez qu'il y a encore beaucoup de choses apprendre. N'oubliez pas que vous utilisez HTML en version 5. V ous pouvez donc combiner toute la puissance de ce que vous connaissez en HTML5 avec toute la puissance de la WinRT et de la WinJS, savoir les canevas, l'audio, la vido, etc. Jespre que, comme moi, vous avez apprci vous plonger dans ce monde trs rcent du dveloppement et que cela vous a donn envie de crer de belles applications.
www.siteduzero.com