<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Blog d'équipe Business &amp; Mission Critial - Microsoft Services</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/frmcs-dev/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/frmcs-dev/feed.xml</link>
    <description />
    <lastBuildDate>Wed, 17 Apr 2019 03:20:51 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Comment utiliser une identité d’entreprise avec Visual Studio Online?</title>
      <link>https://docs.microsoft.com/archive/blogs/frmcs-dev/comment-utiliser-une-identit-dentreprise-avec-visual-studio-online</link>
      <pubDate>Tue, 23 Sep 2014 03:49:49 GMT</pubDate>
      <dc:creator><![CDATA[Equipe Business and Mission Critical- MCS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/frmcs-dev/2014/09/23/comment-utiliser-une-identit-dentreprise-avec-visual-studio-online/</guid>
      <description><![CDATA[Un des gros manques fonctionnel de Visual Studio Online (anciennement Team Foundation Service)...]]></description>
      <content:encoded><![CDATA[<p align="justify">Un des gros manques fonctionnel de Visual Studio Online (anciennement Team Foundation Service) depuis sa mise en ligne est l’obligation d’utiliser des comptes Microsoft Id pour gérer les autorisations des utilisateurs sur TFS.</p>  <p align="justify">Cette limitation a un impact fort pour l’entreprise et pour l’utilisateur : il n’est pas possible d’avoir un scénario de SSO (Single Sign-On) entre la session Windows de l’utilisateur et celle utilisée pour VSO. De plus, l’entreprise doit gérer plusieurs identités pour ses utilisateurs avec d’un côté le compte Microsoft ID pour l’accès à VSO et de l’autre l’identité d’entreprise pour tout le reste. Cela est source d’erreur et de travail supplémentaire pour gérer par exemple les départs de collaborateurs.</p>  <p align="justify">Aujourd’hui, cette limitation est enfin levée : on peut utiliser un annuaire Azure Active Directory pour gérer les identités des utilisateurs d’un compte Visual Studio Online. On peut ensuite synchroniser cet annuaire dans le cloud avec l’annuaire local d’entreprise par l’intermédiaire de DirSync pour avoir une identité unique.</p>  <p align="justify">Dans le cadre de cet article je vais démontrer les différentes étapes nécessaires pour arriver à un compte Visual Studio Online basé sur un annuaire Azure Active Directory synchronisé avec un annuaire local. Pour la partie SSO, je me limiterais à la synchronisation des mots de passe entre l’AD on-premise et l’Azure AD, le scénario de fédération complète étant bien plus complexe.</p>  <h1 align="justify">Création et configuration du compte Visual Studio Online</h1>  <p align="justify">La première étape consiste donc à créer un compte Visual Studio Online lié à un compte Azure.</p>  <p align="justify">Pour ce faire, le plus simple est de se connecter au portail de gestion du compte Windows Azure en allant sur <a href="http://manage.windowsazure.com">http://manage.windowsazure.com</a>. Si vous n’en possédez pas encore un, vous pouvez en le créer en quelques clics en allant sur <a href="http://www.windowsazure.com">http://www.windowsazure.com</a> et en cliquant sur le lien “version d’évaluation gratuite” en haut à droite.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/1537.image_556B6226.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/1537.image_5F00_556B6226.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/2705.image_thumb_73FF6FC6.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/2705.image_5F00_thumb_5F00_73FF6FC6.png" width="594" height="250" /></a></p>  <p align="justify">Une fois sur le portail, cliquez sur nouveau&gt;service d’application &gt; Visual Studio &gt; Création rapide.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/6064.image_7DEC1344.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/6064.image_5F00_7DEC1344.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/6406.image_thumb_7426ABCC.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/6406.image_5F00_thumb_5F00_7426ABCC.png" width="680" height="314" /></a></p>  <p align="justify">Il suffit de choisir un nom pour le service et de le connecter à l’annuaire de la souscription Azure.</p>  <p align="justify">Si vous voulez utiliser un compte VSO existant, il faut choisir de lier à un élément existant.</p>  <p align="justify">Une fois le compte VSO lié au compte Azure et visible sur le portail, cliquez sur son nom pour accéder à la page de d’administration et aller sur l’onglet “configurer”.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/5367.image_55DBF4D6.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/5367.image_5F00_55DBF4D6.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/7357.image_thumb_2F106F47.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/7357.image_5F00_thumb_5F00_2F106F47.png" width="657" height="276" /></a></p>  <p align="justify">Sur cet écran, cliquer sur le bouton “connecter” pour choisir l’annuaire associé à la souscription Azure active.</p>  <p align="justify">A partir de ce moment, les utilisateurs de votre service VSO proviendront de votre annuaire Azure Active Directory qui peut contenir des utilisateurs d’entreprise comme des comptes Microsoft Id.</p>  <h1 align="justify">Configuration de l’annuaire Azure Active Directory</h1>  <p align="justify">Nous allons maintenant synchroniser notre annuaire Azure avec l’annuaire local de l’entreprise.</p>  <p align="justify">La première étape consiste à ajouter le domaine de notre annuaire local à l’annuaire Azure.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/3175.image_70AAAB93.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/3175.image_5F00_70AAAB93.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/0410.image_thumb_2DCE6719.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/0410.image_5F00_thumb_5F00_2DCE6719.png" width="365" height="251" /></a></p>  <p align="justify">Dans l’interface d’administration, dans l’onglet domaines, cliquer sur le bouton “ajouter un domaine personnalisé”</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/8764.image_44240C5E.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/8764.image_5F00_44240C5E.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/5460.image_thumb_41EA1453.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/5460.image_5F00_thumb_5F00_41EA1453.png" width="387" height="248" /></a></p>  <p align="justify">Dans le pop-up qui s’affiche, entrer le domaine que nous allons utiliser, puis cliquer sur ajouter.</p>  <p align="justify">Une fois l’ajout effectué, une seconde page devient disponible.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/3465.image_15CD1762.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/3465.image_5F00_15CD1762.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/2742.image_thumb_10ECF457.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/2742.image_5F00_thumb_5F00_10ECF457.png" width="482" height="339" /></a></p>  <p align="justify">Cette page indique des informations à utiliser pour créer un enregistrement de type TXT sur notre domaine avec comme valeur les informations du champ “destination ou points à l’adresse”. Cette vérification permet à Azure de s’assurer que nous sommes bien propriétaire du domaine. En fonction des capacités de votre registrar, vous pouvez également choisir de valider le domaine grâce à une entrée de type MX. Dans tous les cas, une fois l'entrée créée, on clique sur le bouton &quot;valider&quot; et en cas d'erreur on regarde le message pour corriger le souci.</p>  <p align="justify">Une fois la validation effectuée, il ne reste plus qu’à fermer le pop-up et voila! Vous pouvez créer des utilisateurs @votre-domaine.com sur votre annuaire.</p>  <p align="justify">A noter que si vous souhaitez que ce domaine soit le domaine “par défaut” lors de la création de nouveaux utilisateurs, il faut l’activer en tant que domaine par défaut de l’annuaire.</p>  <p align="justify">Nous allons tout de suite créer un utilisateur dans notre domaine qui servira de compte de synchronisation pour DirSync.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/5315.image_208F9019.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/5315.image_5F00_208F9019.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/2604.image_thumb_148D9FE5.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/2604.image_5F00_thumb_5F00_148D9FE5.png" width="391" height="220" /></a></p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/0243.image_4F74D2AE.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/0243.image_5F00_4F74D2AE.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/6787.image_thumb_461B9E2B.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/6787.image_5F00_thumb_5F00_461B9E2B.png" width="524" height="440" /></a></p>  <p align="justify">Ce compte de service doit posséder le droit “Administrateur général” pour permettre à DirSync de faire son travail. Pensez bien à récupérer le mot de passe sur l’écran suivant et à le modifier en vous connectant au portail azure avec ce couple login/mot de passe.</p>  <p align="justify">La dernière étape au niveau du portail consiste à activer la synchronisation d’annuaires.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/8546.image_3C5636B3.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/8546.image_5F00_3C5636B3.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/3122.image_thumb_3A1C3EA8.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/3122.image_5F00_thumb_5F00_3A1C3EA8.png" width="599" height="249" /></a></p>  <p align="justify">Nous allons donc dans l’onglet “intégration d’annuaire” de l’administration de l’annuaire et nous cliquons sur le bouton “activé” avant de sauvegarder la modification.</p>  <p align="justify">Nous allons maintenant passer à la configuration de l’outil DirSync sur l’annuaire local.</p>  <h1 align="justify">Installation de DirSync et mise en place de la synchronisation</h1>  <p align="justify">Nous allons maintenant passer à&#160; l’installation de l’outil DirSync on-premise pour synchroniser l’annuaire local et l’annuaire Azure.</p>  <p align="justify">Avant de débuter, il faut avoir un utilisateur qui servira de compte de service pour DirSync. Cet utilisateur doit faire partie du groupe Enterprise Admins pour permettre à DirSync de faire un certain nombre de modifications nécessaires à son bon fonctionnement.</p>  <p align="justify">Une fois cet utilisateur prêt, on va pouvoir récupérer le package de DirSync à l’adresse suivante (qui est également affichée sur le portail) : <a title="ici" href="https://go.microsoft.com/fwLink/?LinkID=278924&amp;clcid=0x40C">ici</a></p>  <p align="justify">L’installation est ensuite assez simple.</p>  <p align="justify"><a href="http://social.technet.microsoft.com/wiki/cfs-file.ashx/__key/communityserver-wikis-components-files/00-00-00-00-05/8551.1_2D00_unpack.jpg"><img style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt=" " src="http://social.technet.microsoft.com/wiki/resized-image.ashx/__size/250x0/__key/communityserver-wikis-components-files/00-00-00-00-05/8551.1_2D00_unpack.jpg" width="396" height="198" /></a></p>  <p align="justify">Les fichiers sont extraits…</p>  <p align="justify"><a href="http://social.technet.microsoft.com/wiki/cfs-file.ashx/__key/communityserver-wikis-components-files/00-00-00-00-05/6724.2_2D00_install_5F00_welcome.jpg"><img style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt=" " src="http://social.technet.microsoft.com/wiki/resized-image.ashx/__size/500x0/__key/communityserver-wikis-components-files/00-00-00-00-05/6724.2_2D00_install_5F00_welcome.jpg" /></a></p>  <p align="justify">Un écran de bienvenue nous accueille, on clique sur next…</p>  <p align="justify"><a href="http://social.technet.microsoft.com/wiki/cfs-file.ashx/__key/communityserver-wikis-components-files/00-00-00-00-05/8233.3_2D00_install_5F00_EULA.jpg"><img style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt=" " src="http://social.technet.microsoft.com/wiki/resized-image.ashx/__size/500x0/__key/communityserver-wikis-components-files/00-00-00-00-05/8233.3_2D00_install_5F00_EULA.jpg" /></a></p>  <p align="justify">Conditions légales classiques, next…</p>  <p align="justify"><a href="http://social.technet.microsoft.com/wiki/cfs-file.ashx/__key/communityserver-wikis-components-files/00-00-00-00-05/5852.4_2D00_install_5F00_path.jpg"><img style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt=" " src="http://social.technet.microsoft.com/wiki/resized-image.ashx/__size/500x0/__key/communityserver-wikis-components-files/00-00-00-00-05/5852.4_2D00_install_5F00_path.jpg" /></a></p>  <p align="justify">Choix du répertoire d’installation (dans mon cas j’ai gardé celui par défaut), next…</p>  <p align="justify"><a href="http://social.technet.microsoft.com/wiki/cfs-file.ashx/__key/communityserver-wikis-components-files/00-00-00-00-05/0804.5_2D00_install_5F00_progress.jpg"><img style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt=" " src="http://social.technet.microsoft.com/wiki/resized-image.ashx/__size/500x0/__key/communityserver-wikis-components-files/00-00-00-00-05/0804.5_2D00_install_5F00_progress.jpg" /></a></p>  <p align="justify">Installation des composants (cette étape peut être assez longue), puis next…</p>  <p align="justify"><a href="http://social.technet.microsoft.com/wiki/cfs-file.ashx/__key/communityserver-wikis-components-files/00-00-00-00-05/2313.6_2D00_install_5F00_complete.jpg"><img style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt=" " src="http://social.technet.microsoft.com/wiki/resized-image.ashx/__size/500x0/__key/communityserver-wikis-components-files/00-00-00-00-05/2313.6_2D00_install_5F00_complete.jpg" /></a></p>  <p align="justify">On va pouvoir passer à la configuration proprement dite !</p>  <p align="justify">Attention, si vous avez installé DirSync directement sur un contrôleur de domaine, vous devez vous déconnecter et reconnecter sur le serveur avant de poursuivre. Dans ce cas, décochez donc la case “start configuration wizard now” et lancez le manuellement après vous être reconnecté.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/0003.image_29A3CDAD.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/0003.image_5F00_29A3CDAD.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/0602.image_thumb_6B3E09F9.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/0602.image_5F00_thumb_5F00_6B3E09F9.png" width="514" height="372" /></a></p>  <p align="justify">L’assistant de configuration commence par un nouvel écran de bienvenue, next…</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/3365.image_5D0221BA.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/3365.image_5F00_5D0221BA.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/3312.image_thumb_1A25DD40.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/3312.image_5F00_thumb_5F00_1A25DD40.png" width="523" height="387" /></a></p>  <p align="justify">Sur cet écran, il faut saisir les informations du compte que l’on a créé sur l’annuaire Azure AD, puis cliquer sur next…</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/8535.image_20DB7774.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/8535.image_5F00_20DB7774.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/5282.image_thumb_10630679.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/5282.image_5F00_thumb_5F00_10630679.png" width="535" height="385" /></a></p>  <p align="justify">Ici c’est l’utilisateur Enterprise Admin que l’on a créé sur l’AD on-premise qu’on doit renseigner avant de cliquer sur next…</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/0842.image_6D359BC6.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/0842.image_5F00_6D359BC6.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/8814.image_thumb_317893C4.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/8814.image_5F00_thumb_5F00_317893C4.png" width="535" height="387" /></a></p>  <p align="justify">Cet écran permet d’activer le scénario de déploiement hybride utilisé par certains produits. Pour Visual Studio Online, il n’est pas nécessaire, on clique donc directement sur next.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/2475.image_2E6635CF.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/2475.image_5F00_2E6635CF.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/4812.image_thumb_32DF4747.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/4812.image_5F00_thumb_5F00_32DF4747.png" width="541" height="384" /></a></p>  <p align="justify">Cet écran permet d’activer la synchronisation des mots de passe entre l’annuaire local et celui dans le cloud. Grâce à cela, on implémente une stratégie de SSO simplifiée. On coche donc la case avant de passer à l’écran suivant…</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/1803.image_3275A503.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/1803.image_5F00_3275A503.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/3225.image_thumb_3445FACA.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/3225.image_5F00_thumb_5F00_3445FACA.png" width="531" height="382" /></a></p>  <p align="justify">DirSync met en place tous les éléments nécessaires à la synchronisation…</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/6567.image_7169B64F.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/6567.image_5F00_7169B64F.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/3716.image_thumb_2EF9A4CA.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/3716.image_5F00_thumb_5F00_2EF9A4CA.png" width="535" height="389" /></a></p>  <p align="justify">Nous sommes prêts à lancer la synchronisation dès que nous fermerons l’assistant.</p>  <p align="justify">Après quelques instants, nos utilisateurs et nos groupes locaux sont visibles dans l’annuaire Azure !</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/8358.image_42A91F0F.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/8358.image_5F00_42A91F0F.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/1452.image_thumb_64284E9E.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/1452.image_5F00_thumb_5F00_64284E9E.png" width="543" height="271" /></a></p>  <p align="justify">Pour information, l’agent DirSync synchronise régulièrement l’annuaire. Si on souhaite forcer cette synchro, il suffit de lancer une ligne de commande powershell et exécuter les deux commandes suivantes :</p>  <div align="justify">   <table cellspacing="0" cellpadding="2" width="400" border="1"><tbody>       <tr>         <td valign="top" width="400">           <p><font face="Courier New">import-module DirSync</font></p>            <p><font face="Courier New">Start-OnlineCoexistenceCheck</font></p>         </td>       </tr>     </tbody></table> </div>  <p align="justify">Une synchronisation sera immédiatement effectuée.</p>  <h1 align="justify">Utiliser son identité d’entreprise dans Visual Studio Online</h1>  <p align="justify">Une fois l’annuaire Azure prêt, il nous suffit de nous connecter au compte VSO avec un utilisateur possédant des droits suffisant (comme le compte Microsoft qui a servi à créer la souscription), puis ajouter nos utilisateurs Azure AD comme tout autre utilisateur, en passant par son mail.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/4201.image_6F546999.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/4201.image_5F00_6F546999.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/5224.image_thumb_113FCC1E.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/5224.image_5F00_thumb_5F00_113FCC1E.png" width="535" height="316" /></a></p>  <p align="justify">Détail important sur Visual Studio Online : tout utilisateur ajouté se retrouve dans la liste des utilisateurs sur la home page, et il faut lui associer une licence.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/5657.image_19C32B68.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/5657.image_5F00_19C32B68.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/0753.image_thumb_0DC3CBE5.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/0753.image_5F00_thumb_5F00_0DC3CBE5.png" width="691" height="210" /></a></p>  <p align="justify">Il peut s’agir de la <a href="http://blogs.msdn.com/b/gudavion/archive/2014/08/27/changement-sur-le-licensing-visual-studio-online.aspx" target="_blank">nouvelle licence stakeholder</a>, d’un compte basique ou d’un compte avancé, mais il peut aussi s’agir d’un compte MSDN, même pour un compte d’entreprise. Il faut par contre spécifier que votre compte entreprise partage les bénéfices de votre abonnement MSDN.</p>  <p align="justify">Cela se fait dans <a href="https://msdn.microsoft.com/subscriptions/manage" target="_blank">la page de gestion de l’abonnement MSDN</a> avec le lien “link to your organizational account”</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/7534.image_48AAFEAE.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/7534.image_5F00_48AAFEAE.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/4857.image_thumb_1F36BD6E.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/4857.image_5F00_thumb_5F00_1F36BD6E.png" width="648" height="313" /></a>&#160;</p>  <p align="justify">Grâce à cela, lors de la première connexion à VSO avec mon compte d’entreprise, mon abonnement MSDN est pris en compte et validé.</p>  <p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/5873.image_29F6A574.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/5873.image_5F00_29F6A574.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/60/63/metablogapi/1106.image_thumb_4BE207F8.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-60-63-metablogapi/1106.image_5F00_thumb_5F00_4BE207F8.png" width="656" height="216" /></a></p>  <h1 align="justify">What else?</h1>  <p align="justify">Comme nous l’avons vu, on peut facilement implémenter un annuaire Azure AD comme fournisseur d’identité pour notre service VSO puis mettre en place une synchronisation entre cet annuaire et l’annuaire d’entreprise on-premise.</p>  <p align="justify">Il est cependant important de faire attention dans la mise en œuvre de ce type de solution et il est indispensable de faire participer des experts en sécurité pour valider tous les aspects de la solution.</p>  <p align="justify">Il reste un dernier point qu’il est possible de faire sur TFS on-premise qui n’est pas (encore?) possible de faire sur Visual Studio Online, à savoir donner des droits sur TFS directement à un groupe AD. Malheureusement pour l’instant il est toujours nécessaire d’ajouter les utilisateurs un par un aux groupes TFS.</p>  <p align="justify">J’espère que cet article vous aura éclairé sur cette grosse nouveauté de Visual Studio Online et surtout n’hésitez pas à me poser vos questions!</p>  <p align="justify">&#160;</p>  <div align="justify">   <table cellspacing="0" cellpadding="2" width="605" border="0"><tbody>       <tr>         <td valign="top" width="92"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/6087.gudavion_microsoft_com_LThumb_29C3D94E.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/6087.gudavion_5F00_microsoft_5F00_com_5F00_LThumb_5F00_29C3D94E.jpg"><img title="gudavion_microsoft_com_LThumb" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="gudavion_microsoft_com_LThumb" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/2605.gudavion_microsoft_com_LThumb_thumb_6E730440.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/2605.gudavion_5F00_microsoft_5F00_com_5F00_LThumb_5F00_thumb_5F00_6E730440.jpg" width="86" height="88" /></a></td>          <td valign="top" width="511">           <p align="justify"><strong>Guillaume Davion</strong>, consultant Modern Apps chez Microsoft (MCS) depuis 2013, est tombé dans le Framework .NET quand il était petit en 2001 et a continué sans cesse à l’explorer depuis.               <br />Aujourd’hui, il s’est spécialisé dans l’Application Lifecycle Management (ALM) avec TFS et la gestion de projet agile avec Scrum (il est certifié Scrum Master par la Scrum Alliance). Il tient un blog sur le sujet : <a href="http://blogs.msdn.com/b/gudavion">http://blogs.msdn.com/b/gudavion</a></p>         </td>       </tr>     </tbody></table> </div>]]></content:encoded>
    </item>
    <item>
      <title>Windows Store Apps Sideloadée et mises à jours automatisées</title>
      <link>https://docs.microsoft.com/archive/blogs/frmcs-dev/windows-store-apps-sideloade-et-mises-jours-automatises</link>
      <pubDate>Sun, 27 Oct 2013 12:27:00 GMT</pubDate>
      <dc:creator><![CDATA[David Rozen]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/frmcs-dev/2013/10/27/windows-store-apps-sideloade-et-mises-jours-automatises/</guid>
      <description><![CDATA[&Ccedil;a y est, vous avez fini votre application d&rsquo;entreprise Windows Store. Elle est pas...]]></description>
      <content:encoded><![CDATA[<p>&Ccedil;a y est, vous avez fini votre application d&rsquo;entreprise Windows Store. Elle est pas encore parfaite mais cela s&rsquo;arrangera au prochaine mise &agrave; jour.</p>
<p>Les mises &agrave; jours ! Vous y avez pens&eacute; ? Mais comment &ecirc;tre s&ucirc;r que les utilisateurs utilisent bien la derni&egrave;re version de votre programme ?</p>
<p>Je vous propose ici une solution qui a comme seule contrainte d&rsquo;utiliser un service WCF, donc qui ne fonctionnera que pour une application connect&eacute;e, mais apr&egrave;s tout, comment v&eacute;rifier l&rsquo;existence d&rsquo;une mise &agrave; jour en mode d&eacute;connect&eacute; ?</p>
<h4><span style="color: #0000ff;">Les pr&eacute;requis</span></h4>
<p>Le fonctionnement de ce syst&egrave;me n&eacute;cessite d&rsquo;avoir un minimum la main sur le serveur h&eacute;bergeant le WCF, &agrave; savoir :</p>
<ul>
<li>Pouvoir y copier des fichiers dans un dossier sp&eacute;cifique et qui sera partag&eacute; en lecture seule.</li>
<ul>
<li>Ces fichiers seront : le package Appx en cours et un fichier Bat d&rsquo;installation</li>
</ul>
<li>Le service Web devra &eacute;galement avoir le droit de lire dans ce dossier.</li>
<li>Enfin, un autre site Web devra &ecirc;tre cr&eacute;&eacute; &ndash; sur ce serveur ou un autre, peut importe &ndash; afin d&rsquo;h&eacute;berger le script de lancement de la mise &agrave; jour.</li>
</ul>
<p>L&rsquo;autre pr&eacute;requis essentiel est que le package de l&rsquo;application doit imp&eacute;rativement &ecirc;tre sign&eacute;.</p>
<h4><span style="color: #0000ff;">L&rsquo;approche</span></h4>
<p>En partant sur une application bas&eacute;e sur un mod&egrave;le MVVM la logique de fonctionnement est la suivante :</p>
<p>J&rsquo;ai une Loading Page qui mimique le Splash Screen (assez classique comme principe) &agrave; laquelle est associ&eacute;e un ViewModel.</p>
<p>Lors de l&rsquo;initialisation de ce ViewModel, une requ&ecirc;te vers le service WCF va r&eacute;cup&eacute;rer la version en cours du package disponible &agrave; l&rsquo;installation et modifie une propri&eacute;t&eacute; bool&eacute;enne indiquant si une mise &agrave; jour est disponible (en comparant la version retourn&eacute;e avec celle du package en cours d&rsquo;ex&eacute;cution).</p>
<p>Le code behind de la vue v&eacute;rifie cette propri&eacute;t&eacute; avant toute autre action et, si une mise &agrave; jour est n&eacute;cessaire, invite l&rsquo;utilisateur &agrave; la faire avant de continuer l&rsquo;initialisation de l&rsquo;application.</p>
<p>Si l&rsquo;utilisateur d&eacute;cide de faire l&rsquo;update, une Uri est appel&eacute;e pour d&eacute;marrer le processus de mise &agrave; jour via un batch et l&rsquo;application est ferm&eacute;e.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/0184.3276.image_21B12474.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70/0184.3276.image_5F00_21B12474.png"><img style="display: block; margin-left: auto; margin-right: auto;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/0184.3276.image_21B12474.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70/0184.3276.image_5F00_21B12474.png" alt="" border="0" /></a></p>
<p>Lorsqu&rsquo;une mise &agrave; jour est disponible, un MessageDialog est affich&eacute; pour permettre &agrave; l&rsquo;utilisateur de faire la mise &agrave; jour</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/4628.2063.image_6E777BBB.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70/4628.2063.image_5F00_6E777BBB.png"><img style="display: block; margin-left: auto; margin-right: auto;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/4628.2063.image_6E777BBB.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70/4628.2063.image_5F00_6E777BBB.png" alt="" border="0" /></a></p>
<h4><span style="color: #0000ff;">La configuration du serveur</span></h4>
<p>Pour l&rsquo;exemple, nous imaginerons la configuration suivante :</p>
<ul>
<ul>
<li>un service WCF disponible &agrave; l&rsquo;adresse http://contoso/SuperApp/SuperWCF.svc</li>
<li>Sur ce m&ecirc;me serveur, un dossier D:\SuperApp\Package qui contiendra le package en cours (partag&eacute; en tant que \\contoso\SuperAppPackage\)</li>
<li>Un autre site web http://contoso/SuperAppUpdate qui contiendra un fichier Bat au contenu suivant</li>
</ul>
</ul>
<div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;">
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: #606060;"> 1:</span> start <span style="color: #006080;">"Updating SuperApp"</span> /WAIT /B \\contoso\SuperAppPackage\add-ModernApplication.bat</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum2" style="color: #606060;"> 2:</span> exit</pre>
<!--CRLF--></div>
</div>
<blockquote>
<p>et le fichier Web.config</p>
<div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;">
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: #0000ff;">&lt;?</span><span style="color: #800000;">xml</span> <span style="color: #ff0000;">version</span><span style="color: #0000ff;">="1.0"</span> <span style="color: #ff0000;">encoding</span><span style="color: #0000ff;">="UTF-8"</span>?<span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum2" style="color: #606060;"> 2:</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">configuration</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum3" style="color: #606060;"> 3:</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">system.webServer</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum4" style="color: #606060;"> 4:</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">staticContent</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum5" style="color: #606060;"> 5:</span>             <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mimeMap</span> <span style="color: #ff0000;">fileExtension</span><span style="color: #0000ff;">=".bat"</span> <span style="color: #ff0000;">mimeType</span><span style="color: #0000ff;">="application/octet-stream"</span> <span style="color: #0000ff;">/&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum6" style="color: #606060;"> 6:</span>         <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">staticContent</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum7" style="color: #606060;"> 7:</span>     <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">system.webServer</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum8" style="color: #606060;"> 8:</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">configuration</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF--></div>
</div>
</blockquote>
<h4><span style="color: #0000ff;">Le code de l&rsquo;application</span></h4>
<p><em><span style="color: #333333;">LoadingPage.Xaml.cs</span></em></p>
<div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;">
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">sealed</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> LoadingPage : LayoutAwarePage</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum2" style="color: #606060;"> 2:</span> {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum3" style="color: #606060;"> 3:</span>     <span style="color: #0000ff;">public</span> LoadingPageViewModel ViewModel</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum4" style="color: #606060;"> 4:</span>     {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum5" style="color: #606060;"> 5:</span>         get { <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.DataContext <span style="color: #0000ff;">as</span> LoadingPageViewModel; }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum6" style="color: #606060;"> 6:</span>         set { <span style="color: #0000ff;">this</span>.DataContext = <span style="color: #0000ff;">value</span>; }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum7" style="color: #606060;"> 7:</span>     }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum8" style="color: #606060;"> 8:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum9" style="color: #606060;"> 9:</span>     <span style="color: #0000ff;">public</span> LoadingPage()</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum10" style="color: #606060;"> 10:</span>     {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum11" style="color: #606060;"> 11:</span>         <span style="color: #0000ff;">this</span>.InitializeComponent();</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum12" style="color: #606060;"> 12:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum13" style="color: #606060;"> 13:</span>         <span style="color: #008000;">//Initialisation du ViewModel</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum14" style="color: #606060;"> 14:</span>         var viewModel = <span style="color: #0000ff;">new</span> LoadingPageViewModel(ViewService.Service);</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum15" style="color: #606060;"> 15:</span>         <span style="color: #0000ff;">this</span>.ViewModel = viewModel;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum16" style="color: #606060;"> 16:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum17" style="color: #606060;"> 17:</span>         <span style="color: #008000;">//Verification de la disponibilit&eacute; d'une mise &agrave; jour</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum18" style="color: #606060;"> 18:</span>         var isOutDatedTask = CheckOutdatedVersion();</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum19" style="color: #606060;"> 19:</span>         isOutDatedTask.Wait();</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum20" style="color: #606060;"> 20:</span>         var isOutDated = isOutDatedTask.Result;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum21" style="color: #606060;"> 21:</span>     }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum22" style="color: #606060;"> 22:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum23" style="color: #606060;"> 23:</span>     <span style="color: #0000ff;">private</span> async Task&lt;<span style="color: #0000ff;">bool</span>&gt; CheckOutdatedVersion()</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum24" style="color: #606060;"> 24:</span>     {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum25" style="color: #606060;"> 25:</span>         <span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">this</span>.ViewModel.IsOutdated)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum26" style="color: #606060;"> 26:</span>         {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum27" style="color: #606060;"> 27:</span>             <span style="color: #0000ff;">bool</span>? requestUpdate = <span style="color: #0000ff;">null</span>;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum28" style="color: #606060;"> 28:</span>             var message = <span style="color: #0000ff;">new</span> MessageDialog(<span style="color: #006080;">@"Super App n'est pas &agrave; jour. Voulez-vous effectuer la mise &agrave; jour ?"</span>, <span style="color: #006080;">"Super App"</span>)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum29" style="color: #606060;"> 29:</span>                 {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum30" style="color: #606060;"> 30:</span>                     Commands =</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum31" style="color: #606060;"> 31:</span>                 {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum32" style="color: #606060;"> 32:</span>                     <span style="color: #0000ff;">new</span> UICommand(<span style="color: #006080;">@"Mettre &agrave; jour"</span>, cmd =&gt; requestUpdate = <span style="color: #0000ff;">true</span>),</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum33" style="color: #606060;"> 33:</span>                     <span style="color: #0000ff;">new</span> UICommand(<span style="color: #006080;">@"Quitter Super App"</span>, cmd =&gt; requestUpdate = <span style="color: #0000ff;">false</span>)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum34" style="color: #606060;"> 34:</span>                 },</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum35" style="color: #606060;"> 35:</span>                     DefaultCommandIndex = 0,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum36" style="color: #606060;"> 36:</span>                     CancelCommandIndex = 1</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum37" style="color: #606060;"> 37:</span>                 };</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum38" style="color: #606060;"> 38:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum39" style="color: #606060;"> 39:</span>             await message.ShowAsync();</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum40" style="color: #606060;"> 40:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum41" style="color: #606060;"> 41:</span>             <span style="color: #0000ff;">if</span> (!requestUpdate.HasValue || !requestUpdate.Value)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum42" style="color: #606060;"> 42:</span>                 Application.Current.Exit();</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum43" style="color: #606060;"> 43:</span>             <span style="color: #0000ff;">else</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum44" style="color: #606060;"> 44:</span>             {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum45" style="color: #606060;"> 45:</span>                 await Windows.System.Launcher.LaunchUriAsync(<span style="color: #0000ff;">new</span> Uri(<span style="color: #0000ff;">new</span> Uri(<span style="color: #006080;">@"http://contoso/SuperAppUpdate/"</span>), <span style="color: #006080;">"Update.bat"</span>));</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum46" style="color: #606060;"> 46:</span>                 Application.Current.Exit();</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum47" style="color: #606060;"> 47:</span>             }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum48" style="color: #606060;"> 48:</span>             <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span>;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum49" style="color: #606060;"> 49:</span>         }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum50" style="color: #606060;"> 50:</span>         <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span>;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum51" style="color: #606060;"> 51:</span>     }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum52" style="color: #606060;"> 52:</span> }</pre>
<!--CRLF--></div>
</div>
<p><em><span style="color: #333333;">LoadingPaveViewModel.cs</span></em></p>
<div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;">
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> LoadingPageViewModel : BindableBase</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum2" style="color: #606060;"> 2:</span> {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum3" style="color: #606060;"> 3:</span>     <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">bool</span> _isOutdated;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum4" style="color: #606060;"> 4:</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span> IsOutdated</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum5" style="color: #606060;"> 5:</span>     {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum6" style="color: #606060;"> 6:</span>         get { <span style="color: #0000ff;">return</span> _isOutdated; }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum7" style="color: #606060;"> 7:</span>         set { SetProperty(<span style="color: #0000ff;">ref</span> _isOutdated, <span style="color: #0000ff;">value</span>); }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum8" style="color: #606060;"> 8:</span>     }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum9" style="color: #606060;"> 9:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum10" style="color: #606060;"> 10:</span>     <span style="color: #0000ff;">public</span> LoadingPageViewModel(IViewService viewService)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum11" style="color: #606060;"> 11:</span>         : <span style="color: #0000ff;">base</span>(viewService)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum12" style="color: #606060;"> 12:</span>     {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum13" style="color: #606060;"> 13:</span>         CheckVersion();</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum14" style="color: #606060;"> 14:</span>     </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum15" style="color: #606060;"> 15:</span>         <span style="color: #0000ff;">if</span> (IsOutdated)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum16" style="color: #606060;"> 16:</span>             <span style="color: #0000ff;">return</span>;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum17" style="color: #606060;"> 17:</span>     }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum18" style="color: #606060;"> 18:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum19" style="color: #606060;"> 19:</span>     <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> CheckVersion()</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum20" style="color: #606060;"> 20:</span>     {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum21" style="color: #606060;"> 21:</span>         <span style="color: #0000ff;">try</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum22" style="color: #606060;"> 22:</span>         {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum23" style="color: #606060;"> 23:</span>             <span style="color: #008000;">//Appel du WCF pour r&eacute;cup&eacute;rer la version du dernier package disponible</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum24" style="color: #606060;"> 24:</span>             var lastVersion = WCFProxy.SuperWCFClient.GetCurrentVersion();</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum25" style="color: #606060;"> 25:</span>             <span style="color: #008000;">//R&eacute;cup&eacute;ration de la version du package en cours d'&eacute;xecution</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum26" style="color: #606060;"> 26:</span>             var packageVersion = Windows.ApplicationModel.Package.Current.Id.Version;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum27" style="color: #606060;"> 27:</span>             <span style="color: #008000;">//Conversion du type PackageVersion en Version</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum28" style="color: #606060;"> 28:</span>             var currentVersion =</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum29" style="color: #606060;"> 29:</span>                 <span style="color: #0000ff;">new</span> Version(<span style="color: #0000ff;">string</span>.Format(<span style="color: #006080;">"{0}.{1}.{2}.{3}"</span>, packageVersion.Major, packageVersion.Minor,</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum30" style="color: #606060;"> 30:</span>                                           packageVersion.Build, packageVersion.Revision));</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum31" style="color: #606060;"> 31:</span>             <span style="color: #008000;">//Comparaison des versions</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum32" style="color: #606060;"> 32:</span>             IsOutdated = currentVersion.CompareTo(lastVersion) &lt; 0;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum33" style="color: #606060;"> 33:</span>         }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum34" style="color: #606060;"> 34:</span>         <span style="color: #0000ff;">catch</span> (Exception)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum35" style="color: #606060;"> 35:</span>         {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum36" style="color: #606060;"> 36:</span>             <span style="color: #008000;">//Si le WCF n'est pas accessible, on consid&egrave;re que la version est &agrave; jour</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum37" style="color: #606060;"> 37:</span>             IsOutdated = <span style="color: #0000ff;">false</span>;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum38" style="color: #606060;"> 38:</span>         }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum39" style="color: #606060;"> 39:</span>     }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum40" style="color: #606060;"> 40:</span> }</pre>
<!--CRLF--></div>
</div>
<p><em>SuperWCF.svc.cs</em></p>
<div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;">
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: #606060;"> 1:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> SuperWCF</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum2" style="color: #606060;"> 2:</span> {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum3" style="color: #606060;"> 3:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum4" style="color: #606060;"> 4:</span>     <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">string</span> SuperAppPackageFolder = <span style="color: #006080;">@"D:\SuperApp\Package\"</span>;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum5" style="color: #606060;"> 5:</span>     <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">string</span> SuperAppPackageNameRegEx = <span style="color: #006080;">@"SuperApp.*_(\d*[.]\d*[.]\d*[.]\d*).*"</span>;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum6" style="color: #606060;"> 6:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum7" style="color: #606060;"> 7:</span>     <span style="color: #008000;">/// &lt;summary&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum8" style="color: #606060;"> 8:</span>     <span style="color: #008000;">/// Gets the current SuperApp package version.</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum9" style="color: #606060;"> 9:</span>     <span style="color: #008000;">/// &lt;/summary&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum10" style="color: #606060;"> 10:</span>     <span style="color: #008000;">/// &lt;returns&gt;&lt;/returns&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum11" style="color: #606060;"> 11:</span>     <span style="color: #008000;">/// &lt;exception cref="System.IO.FileNotFoundException"&gt;SuperApp Package not found&lt;/exception&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum12" style="color: #606060;"> 12:</span>     <span style="color: #0000ff;">public</span> Version GetCurrentVersion()</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum13" style="color: #606060;"> 13:</span>     {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum14" style="color: #606060;"> 14:</span>         Version returnVersion;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum15" style="color: #606060;"> 15:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum16" style="color: #606060;"> 16:</span>         <span style="color: #0000ff;">try</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum17" style="color: #606060;"> 17:</span>         {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum18" style="color: #606060;"> 18:</span>             var folder = <span style="color: #0000ff;">new</span> DirectoryInfo(SuperAppPackageFolder);</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum19" style="color: #606060;"> 19:</span>             var files = <span style="color: #0000ff;">new</span> List&lt;FileInfo&gt;(folder.GetFiles(<span style="color: #006080;">"*.appx"</span>));</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum20" style="color: #606060;"> 20:</span>             <span style="color: #0000ff;">if</span> (files.Count &lt;= 0)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum21" style="color: #606060;"> 21:</span>                 <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> FileNotFoundException(<span style="color: #006080;">"Kymu Package not found"</span>);</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum22" style="color: #606060;"> 22:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum23" style="color: #606060;"> 23:</span>             var packageFile = files.OrderByDescending(f =&gt; f.Name).First();</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum24" style="color: #606060;"> 24:</span>             returnVersion = ExtractVersionNumberFromPackageName(packageFile.Name);</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum25" style="color: #606060;"> 25:</span>         }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum26" style="color: #606060;"> 26:</span>         <span style="color: #0000ff;">catch</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum27" style="color: #606060;"> 27:</span>         {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum28" style="color: #606060;"> 28:</span>             returnVersion = <span style="color: #0000ff;">new</span> Version(1, 0, 0, 0);</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum29" style="color: #606060;"> 29:</span>         }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum30" style="color: #606060;"> 30:</span>         <span style="color: #0000ff;">return</span> returnVersion;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum31" style="color: #606060;"> 31:</span>     }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum32" style="color: #606060;"> 32:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum33" style="color: #606060;"> 33:</span>     <span style="color: #008000;">/// &lt;summary&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum34" style="color: #606060;"> 34:</span>     <span style="color: #008000;">/// Extracts the version number from the name of the SuperApp package.</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum35" style="color: #606060;"> 35:</span>     <span style="color: #008000;">/// &lt;/summary&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum36" style="color: #606060;"> 36:</span>     <span style="color: #008000;">/// &lt;param name="packageName"&gt;Name of the package.&lt;/param&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum37" style="color: #606060;"> 37:</span>     <span style="color: #008000;">/// &lt;returns&gt;&lt;/returns&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum38" style="color: #606060;"> 38:</span>     <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> Version ExtractVersionNumberFromPackageName(<span style="color: #0000ff;">string</span> packageName)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum39" style="color: #606060;"> 39:</span>     {</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum40" style="color: #606060;"> 40:</span>         var match = Regex.Match(packageName, SuperAppPackageNameRegEx, RegexOptions.IgnoreCase);</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum41" style="color: #606060;"> 41:</span>         Version returnValue;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum42" style="color: #606060;"> 42:</span>         <span style="color: #0000ff;">if</span> (!match.Success || match.Groups.Count &lt; 2 || !Version.TryParse(match.Groups[1].Value, <span style="color: #0000ff;">out</span> returnValue))</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum43" style="color: #606060;"> 43:</span>             returnValue = <span style="color: #0000ff;">new</span> Version(1, 0, 0, 0);</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum44" style="color: #606060;"> 44:</span>         <span style="color: #0000ff;">return</span> returnValue;</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum45" style="color: #606060;"> 45:</span>     }</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum46" style="color: #606060;"> 46:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum47" style="color: #606060;"> 47:</span> }</pre>
<!--CRLF--></div>
</div>
<h4><span style="color: #0000ff;">Le Batch d&rsquo;installation</span></h4>
<p>Voici le fichier batch qui r&eacute;alise au l&rsquo;installation et qui peut fonctionner depuis un partage r&eacute;seau</p>
<p><em><span style="color: #333333;">Add-ModernApplication.bat</span></em></p>
<div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;">
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: #606060;"> 1:</span> @ECHO OFF</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum2" style="color: #606060;"> 2:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum3" style="color: #606060;"> 3:</span> <span style="color: #008000;">REM #######################################################################</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum4" style="color: #606060;"> 4:</span> <span style="color: #008000;">REM # Add-ModernApplication.bat</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum5" style="color: #606060;"> 5:</span> <span style="color: #008000;">REM # &lt;summary&gt;</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum6" style="color: #606060;"> 6:</span> <span style="color: #008000;">REM # Add-ModernApplication.bat is a powershell.exe script designed to install</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum7" style="color: #606060;"> 7:</span> <span style="color: #008000;">REM # the Microsoft Corporate Appx packages created by Visual Studio. </span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum8" style="color: #606060;"> 8:</span> <span style="color: #008000;">REM #</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum9" style="color: #606060;"> 9:</span> <span style="color: #008000;">REM # The target folder will contain the .appx application file,</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum10" style="color: #606060;"> 10:</span> <span style="color: #008000;">REM # the Add-ModernApplication.bat script, plus a .\Dependencies\ folder </span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum11" style="color: #606060;"> 11:</span> <span style="color: #008000;">REM # containing all the framework packages used by the application, if needed</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum12" style="color: #606060;"> 12:</span> <span style="color: #008000;">REM # When executed from a local directory, the Add-ModernApplication.bat script</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum13" style="color: #606060;"> 13:</span> <span style="color: #008000;">REM # simplifies installing the AppX package on a new computer by</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum14" style="color: #606060;"> 14:</span> <span style="color: #008000;">REM # automating the following functions.</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum15" style="color: #606060;"> 15:</span> <span style="color: #008000;">REM #</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum16" style="color: #606060;"> 16:</span> <span style="color: #008000;">REM #</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum17" style="color: #606060;"> 17:</span> <span style="color: #008000;">REM # 1. Checks for the Win8 or Win8.1 OS client.</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum18" style="color: #606060;"> 18:</span> <span style="color: #008000;">REM # 2. Checks for the client to be volume licensed</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum19" style="color: #606060;"> 19:</span> <span style="color: #008000;">REM # 3. Checks for the build to be at the minimum level</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum20" style="color: #606060;"> 20:</span> <span style="color: #008000;">REM # 4. If a server SKU, checks for the Desktop Experience Feature</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum21" style="color: #606060;"> 21:</span> <span style="color: #008000;">REM #</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum22" style="color: #606060;"> 22:</span> <span style="color: #008000;">REM # 4. Installs all the framework packages contained in</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum23" style="color: #606060;"> 23:</span> <span style="color: #008000;">REM # .\Dependencies</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum24" style="color: #606060;"> 24:</span> <span style="color: #008000;">REM #</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum25" style="color: #606060;"> 25:</span> <span style="color: #008000;">REM # 5. Installs the application package .appx file.</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum26" style="color: #606060;"> 26:</span> <span style="color: #008000;">REM # </span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum27" style="color: #606060;"> 27:</span> <span style="color: #008000;">REM # The Assumption is made that the client satisfies all the requirements </span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum28" style="color: #606060;"> 28:</span> <span style="color: #008000;">REM # for Enterprise side-loading of AppX packages and that the Package is signed</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum29" style="color: #606060;"> 29:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum30" style="color: #606060;"> 30:</span> <span style="color: #008000;">REM #######################################################################</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum31" style="color: #606060;"> 31:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum32" style="color: #606060;"> 32:</span> <span style="color: #0000ff;">set</span> W8RTM=9200</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum33" style="color: #606060;"> 33:</span> <span style="color: #0000ff;">set</span> W81RTM=9600</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum34" style="color: #606060;"> 34:</span> <span style="color: #0000ff;">set</span> RP=8400</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum35" style="color: #606060;"> 35:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum36" style="color: #606060;"> 36:</span> <span style="color: #008000;">REM Check for Windows 8 OS and build</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum37" style="color: #606060;"> 37:</span> <span style="color: #0000ff;">for</span> /f <span style="color: #006080;">"delims=[] tokens=2"</span> %%i <span style="color: #0000ff;">in</span> (<span style="color: #008000;">'ver') do set MyVer=%%i</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum38" style="color: #606060;"> 38:</span> <span style="color: #0000ff;">for</span> /f <span style="color: #006080;">"tokens=2"</span> %%i <span style="color: #0000ff;">in</span> (<span style="color: #008000;">'echo %MyVer%') do set MyVer=%%i</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum39" style="color: #606060;"> 39:</span> <span style="color: #0000ff;">for</span> /f <span style="color: #006080;">"tokens=1,2,3 delims=."</span> %%i <span style="color: #0000ff;">in</span> (<span style="color: #008000;">'echo %MyVer%') do (</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum40" style="color: #606060;"> 40:</span>     <span style="color: #0000ff;">set</span> OSMajorVer=%%i</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum41" style="color: #606060;"> 41:</span>     <span style="color: #0000ff;">set</span> OSMinorVer=%%j</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum42" style="color: #606060;"> 42:</span>     <span style="color: #0000ff;">set</span> OSBuild=%%k</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum43" style="color: #606060;"> 43:</span> )</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum44" style="color: #606060;"> 44:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum45" style="color: #606060;"> 45:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"`n`nThe Script identified this machine as Windows Version "</span>%OSMajorVer%<span style="color: #006080;">"."</span>%OSMinorVer%<span style="color: #006080;">", Build Number "</span> %OSBuild%<span style="color: #006080;">"`n"</span> -foregroundcolor <span style="color: #006080;">"green"</span> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum46" style="color: #606060;"> 46:</span> <span style="color: #008000;">REM echo The Script identified this machines as %OSMajorVer%.%OSMinorVer%, Build Number %OSBuild%</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum47" style="color: #606060;"> 47:</span> <span style="color: #008000;">REM # echo Found OS Minor Version: %OSMinorVer%</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum48" style="color: #606060;"> 48:</span> <span style="color: #008000;">REM # Found OS Build number: %OSBuild%</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum49" style="color: #606060;"> 49:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum50" style="color: #606060;"> 50:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum51" style="color: #606060;"> 51:</span> <span style="color: #008000;">REM Get SKU of client to test for Volume licensing</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum52" style="color: #606060;"> 52:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum53" style="color: #606060;"> 53:</span> <span style="color: #008000;">REM for /f "delims= tokens=1" %%i in ('%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command "(get-wmiobject win32_operatingsystem).OperatingSystemSKU"') do set MySku=%%i</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum54" style="color: #606060;"> 54:</span> <span style="color: #0000ff;">for</span> /f <span style="color: #006080;">"delims= tokens=1"</span> %%i <span style="color: #0000ff;">in</span> (<span style="color: #008000;">'%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command "(get-wmiobject win32_operatingsystem).OperatingSystemSKU"') do set MySku=%%i</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum55" style="color: #606060;"> 55:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum56" style="color: #606060;"> 56:</span> <span style="color: #0000ff;">If</span> %OSMajorVer% EQU 6 <span style="color: #0000ff;">if</span> %OSMinorVer% EQU 2 <span style="color: #0000ff;">goto</span> Win8VLtest</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum57" style="color: #606060;"> 57:</span> <span style="color: #0000ff;">If</span> %OSMajorVer% EQU 6 <span style="color: #0000ff;">if</span> %OSMinorVer% EQU 3 <span style="color: #0000ff;">goto</span> Win8VLtest</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum58" style="color: #606060;"> 58:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum59" style="color: #606060;"> 59:</span> <span style="color: #008000;">REM Version failed, not Windows8</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum60" style="color: #606060;"> 60:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"ERROR: Windows 8 Modern Applications are only supported on Windows 8."</span> -foregroundcolor <span style="color: #006080;">"red"</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum61" style="color: #606060;"> 61:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"Ending Program `n"</span> -foregroundcolor <span style="color: #006080;">"red"</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum62" style="color: #606060;"> 62:</span> <span style="color: #0000ff;">goto</span> <span style="color: #0000ff;">end</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum63" style="color: #606060;"> 63:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum64" style="color: #606060;"> 64:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum65" style="color: #606060;"> 65:</span> :Win8VLtest</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum66" style="color: #606060;"> 66:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum67" style="color: #606060;"> 67:</span> <span style="color: #008000;">REM Checking for volume licensed media </span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum68" style="color: #606060;"> 68:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum69" style="color: #606060;"> 69:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum70" style="color: #606060;"> 70:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"`n`nThe SKU "</span>%MySku%<span style="color: #006080;">""</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum71" style="color: #606060;"> 71:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum72" style="color: #606060;"> 72:</span> <span style="color: #0000ff;">if</span> %MySku% EQU 4 <span style="color: #0000ff;">goto</span> Win8RTMtest</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum73" style="color: #606060;"> 73:</span> <span style="color: #0000ff;">if</span> %MySku% EQU 27 <span style="color: #0000ff;">goto</span> Win8RTMtest</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum74" style="color: #606060;"> 74:</span> <span style="color: #0000ff;">if</span> %MySku% EQU 48 <span style="color: #0000ff;">goto</span> Win8RTMtest</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum75" style="color: #606060;"> 75:</span> <span style="color: #0000ff;">if</span> %MySku% EQU 77 <span style="color: #0000ff;">goto</span> Win8RTMtest</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum76" style="color: #606060;"> 76:</span> <span style="color: #0000ff;">if</span> %MySku% EQU 80 <span style="color: #0000ff;">goto</span> Win8RTMtest</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum77" style="color: #606060;"> 77:</span> <span style="color: #0000ff;">if</span> %MySku% EQU 97 <span style="color: #0000ff;">goto</span> Win8RTMtest</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum78" style="color: #606060;"> 78:</span> <span style="color: #0000ff;">if</span> %MySku% EQU 8 <span style="color: #0000ff;">goto</span> Win8BuildServer</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum79" style="color: #606060;"> 79:</span> <span style="color: #0000ff;">if</span> %MySku% EQU 10 <span style="color: #0000ff;">goto</span> Win8BuildServer</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum80" style="color: #606060;"> 80:</span> <span style="color: #0000ff;">if</span> %MySku% EQU 42 <span style="color: #0000ff;">goto</span> Win8BuildServer</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum81" style="color: #606060;"> 81:</span> <span style="color: #0000ff;">if</span> %MySku% EQU 38 <span style="color: #0000ff;">goto</span> Win8BuildServer</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum82" style="color: #606060;"> 82:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum83" style="color: #606060;"> 83:</span> <span style="color: #008000;">REM not VL media, Failure</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum84" style="color: #606060;"> 84:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"ERROR: Sideloaded Windows 8 Modern applications may only be installed on Volume Licensed OS SKUs of Windows 8."</span> -foregroundcolor <span style="color: #006080;">"red"</span> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum85" style="color: #606060;"> 85:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"Ending Program"</span> -foregroundcolor <span style="color: #006080;">"red"</span> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum86" style="color: #606060;"> 86:</span> <span style="color: #0000ff;">goto</span> <span style="color: #0000ff;">end</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum87" style="color: #606060;"> 87:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum88" style="color: #606060;"> 88:</span> :Win8BuildServer</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum89" style="color: #606060;"> 89:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum90" style="color: #606060;"> 90:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"This machine has been identifed as a Server OS."</span>  -foregroundcolor <span style="color: #006080;">"green"</span> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum91" style="color: #606060;"> 91:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum92" style="color: #606060;"> 92:</span> <span style="color: #0000ff;">for</span> /f <span style="color: #006080;">"delims= tokens=1"</span> %%i <span style="color: #0000ff;">in</span>  (<span style="color: #008000;">'%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command "(Get-WindowsFeature desktop-experience).Installstate"') do Set DesktopEx=%%i</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum93" style="color: #606060;"> 93:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum94" style="color: #606060;"> 94:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"This Server sku appears to have the Desktop Experience "</span>%DesktopEx%<span style="color: #006080;">", which is a requirement for side-loading of Modern Apps"</span>  -foregroundcolor <span style="color: #006080;">"green"</span> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum95" style="color: #606060;"> 95:</span> <span style="color: #0000ff;">If</span> %DesktopEx% EQU Installed <span style="color: #0000ff;">goto</span> Win8RTMtest</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum96" style="color: #606060;"> 96:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum97" style="color: #606060;"> 97:</span> <span style="color: #008000;">REM Server does not have Desktop-Experience implemented, Failure</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum98" style="color: #606060;"> 98:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"ERROR: This machine appears to be a valid server SKU, but you need to implement the Desktop-Experience feature, first."</span> -foregroundcolor <span style="color: #006080;">"red"</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum99" style="color: #606060;"> 99:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"Ending Program"</span> -foregroundcolor <span style="color: #006080;">"red"</span> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum100" style="color: #606060;"> 100:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"Open up elevated Powershell and run"</span> -foregroundcolor <span style="color: #006080;">"red"</span> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum101" style="color: #606060;"> 101:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"Import-Module ServerManager , then , Install-WindowsFeature Desktop-Experience"</span> -foregroundcolor <span style="color: #006080;">"red"</span> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum102" style="color: #606060;"> 102:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"You will then need to reboot your system"</span> -foregroundcolor <span style="color: #006080;">"red"</span> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum103" style="color: #606060;"> 103:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"Ending Program"</span> -foregroundcolor <span style="color: #006080;">"red"</span> </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum104" style="color: #606060;"> 104:</span> <span style="color: #0000ff;">goto</span> <span style="color: #0000ff;">end</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum105" style="color: #606060;"> 105:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum106" style="color: #606060;"> 106:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum107" style="color: #606060;"> 107:</span> :Win8RTMtest</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum108" style="color: #606060;"> 108:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum109" style="color: #606060;"> 109:</span> <span style="color: #0000ff;">if</span> %OSBuild% EQU %W8RTM% <span style="color: #0000ff;">goto</span>  Win8Pass</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum110" style="color: #606060;"> 110:</span> <span style="color: #0000ff;">if</span> %OSBuild% EQU %W81RTM% <span style="color: #0000ff;">goto</span>  Win8Pass</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum111" style="color: #606060;"> 111:</span> <span style="color: #008000;">REM if %OSBuild% EQU %RP% goto Win8Pass</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum112" style="color: #606060;"> 112:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum113" style="color: #606060;"> 113:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum114" style="color: #606060;"> 114:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"ERROR: This program is only intended on Windows 8 RTM (6.2.9200) or Windows 8.1 RTM (6.2.9600)."</span> -foregroundcolor <span style="color: #006080;">"red"</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum115" style="color: #606060;"> 115:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"Ending Program `n"</span> -foregroundcolor <span style="color: #006080;">"red"</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum116" style="color: #606060;"> 116:</span> <span style="color: #0000ff;">goto</span> <span style="color: #0000ff;">end</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum117" style="color: #606060;"> 117:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum118" style="color: #606060;"> 118:</span> :Win8Pass</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum119" style="color: #606060;"> 119:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum120" style="color: #606060;"> 120:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"This machine appears to satisfy the requirements needed to install this Modern application. `n Proceeding to install which may take a minute. Please wait... `n"</span> -foregroundcolor <span style="color: #006080;">"green"</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum121" style="color: #606060;"> 121:</span> pushd %~dp0</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum122" style="color: #606060;"> 122:</span> <span style="color: #0000ff;">SET</span> Test-Path=%~dp0</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum123" style="color: #606060;"> 123:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum124" style="color: #606060;"> 124:</span> <span style="color: #008000;">REM Proceed to add in the AppX package found in this same directory</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum125" style="color: #606060;"> 125:</span> <span style="color: #008000;">REM Only one AppX package should exist in this same directory</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum126" style="color: #606060;"> 126:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum127" style="color: #606060;"> 127:</span> ECHO Using %windir%\System32\WindowsPowerShell\v1.0\powershell.exe Cmdlets <span style="color: #0000ff;">to</span> Install Appx Files</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum128" style="color: #606060;"> 128:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum129" style="color: #606060;"> 129:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum130" style="color: #606060;"> 130:</span> ECHO  ^- Installing Dependency Packages...</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum131" style="color: #606060;"> 131:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Import-<span style="color: #0000ff;">Module</span> appx; <span style="color: #0000ff;">if</span>(Test-Path -Path .\Dependencies) { $DependencyFiles = <span style="color: #0000ff;">get</span>-childItem .\Dependencies ^| where{$_.extension -eq <span style="color: #008000;">'.appx'} ^| foreach-object -process{$_.FullName}; if(!$DependencyFiles) {exit 1}; foreach($Dependency in $DependencyFiles){ Write-Output " Installing: $Dependency"; Add-AppxPackage $Dependency; if(!$?){exit{5}}} } else {exit 1}</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum132" style="color: #606060;"> 132:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum133" style="color: #606060;"> 133:</span> <span style="color: #0000ff;">set</span> <span style="color: #0000ff;">RETURN</span>=%ERRORLEVEL%</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum134" style="color: #606060;"> 134:</span> <span style="color: #0000ff;">set</span> RETURNDependency = %<span style="color: #0000ff;">RETURN</span>%</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum135" style="color: #606060;"> 135:</span> <span style="color: #0000ff;">IF</span> <span style="color: #006080;">"%RETURN%"</span>==<span style="color: #006080;">"1"</span> ECHO      No Dependencies Found.</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum136" style="color: #606060;"> 136:</span> <span style="color: #0000ff;">IF</span> <span style="color: #006080;">"%RETURN%"</span>==<span style="color: #006080;">"5"</span> (</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum137" style="color: #606060;"> 137:</span>     %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">" ERROR: Dependent Package identified, but FAILED TO INSTALL!"</span> -foregroundcolor <span style="color: #006080;">"red"</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum138" style="color: #606060;"> 138:</span>     <span style="color: #0000ff;">goto</span> CLEANUP</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum139" style="color: #606060;"> 139:</span>     )</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum140" style="color: #606060;"> 140:</span>         </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum141" style="color: #606060;"> 141:</span>&nbsp; </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum142" style="color: #606060;"> 142:</span> ECHO  ^- Installing Windows 8 Modern Application...        </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum143" style="color: #606060;"> 143:</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Import-<span style="color: #0000ff;">Module</span> appx; $PackageFile = <span style="color: #0000ff;">get</span>-childItem .\ ^| where{$_.extension -eq <span style="color: #008000;">'.appx'} ^| foreach-object -process{$_.FullName}; if(!$PackageFile){exit 6}; if($PackageFile.Count -gt 1){exit 7}; Write-Output " Installing: $PackageFile"; Add-AppxPackage $PackageFile; if(!$?) {exit 8}</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum144" style="color: #606060;"> 144:</span> <span style="color: #0000ff;">set</span> <span style="color: #0000ff;">RETURN</span>=%ERRORLEVEL%</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum145" style="color: #606060;"> 145:</span> <span style="color: #0000ff;">IF</span> <span style="color: #006080;">"%RETURN%"</span>==<span style="color: #006080;">"0"</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">"`n SUCCESS! Find the tile for this application on the far right side of your Windows 8 Start Screen. `n"</span> -foregroundcolor <span style="color: #006080;">"green"</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum146" style="color: #606060;"> 146:</span> <span style="color: #0000ff;">IF</span> <span style="color: #006080;">"%RETURN%"</span>==<span style="color: #006080;">"6"</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">" ERROR: NO APPLICATION FOUND TO INSTALL! `n"</span> -foregroundcolor <span style="color: #006080;">"red"</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum147" style="color: #606060;"> 147:</span> <span style="color: #0000ff;">IF</span> <span style="color: #006080;">"%RETURN%"</span>==<span style="color: #006080;">"7"</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">" ERROR: MORE THAN ONE APPLICATION PACKAGE FOUND! 'n"</span> -foregroundcolor <span style="color: #006080;">"red"</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum148" style="color: #606060;"> 148:</span> <span style="color: #0000ff;">IF</span> <span style="color: #006080;">"%RETURN%"</span>==<span style="color: #006080;">"8"</span> %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command Write-Host <span style="color: #006080;">" ERROR: FAILED TO INSTALL WINDOWS 8 APPLICATION! 'n"</span> -foregroundcolor <span style="color: #006080;">"red"</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum149" style="color: #606060;"> 149:</span>    </pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum150" style="color: #606060;"> 150:</span> :CLEANUP</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum151" style="color: #606060;"> 151:</span> popd</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum152" style="color: #606060;"> 152:</span> :<span style="color: #0000ff;">end</span></pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum153" style="color: #606060;"> 153:</span> pause</pre>
<!--CRLF-->
<p><span id="lnum154" style="color: #606060;"> 154:</span> <span style="color: #0000ff;">exit</span> /b %<span style="color: #0000ff;">RETURN%</span></p>
<!--CRLF--></div>
</div>
<p>Voil&agrave; !</p>
<p>N&rsquo;h&eacute;sitez pas &agrave; me solliciter si vous avez la moindre question concernant ce mod&egrave;le de mise &agrave; jour automatis&eacute;e</p>]]></content:encoded>
    </item>
    <item>
      <title>Implémenter le binding two-way en WinJS</title>
      <link>https://docs.microsoft.com/archive/blogs/frmcs-dev/implmenter-le-binding-two-way-en-winjs</link>
      <pubDate>Sat, 01 Jun 2013 14:12:01 GMT</pubDate>
      <dc:creator><![CDATA[Equipe Business and Mission Critical- MCS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/frmcs-dev/2013/06/01/implmenter-le-binding-two-way-en-winjs/</guid>
      <description><![CDATA[Afin de simplifier le développement d’applications Windows 8 en JavaScript, WinJS comporte une...]]></description>
      <content:encoded><![CDATA[<p>Afin de simplifier le développement d’applications Windows 8 en JavaScript, WinJS comporte une fonctionnalité chère aux yeux des amateurs de XAML : le binding. Le principe est simple : mettre la vue d’un côté, les données de l’autre, et un mécanisme au centre qui notifie le premier que le second a changé.</p>  <p>En XAML, il existe trois modes de binding : OneTime, OneWay et TwoWay.</p>  <ul>   <li>Le binding OneTime fait la liaison entre données et interface une première fois, puis ne s’occupe plus de rien. </li>    <li>Le binding OneWay permet de changer l’interface à chaque fois que les objets métiers changent. </li>    <li>Le binding TwoWay fait en plus la liaison dans l’autre sens, c’est-à-dire que lorsqu’il est lié à un contrôle graphique qui permet de modifier la donnée (par exemple un champ texte, une check box, ou tout autre contrôle pouvant être utilisé de manière interactive), la modification de la donnée dans l’interface va entrainer automatiquement la modification de la donnée elle-même. </li> </ul>  <p>Seulement, le binding TwoWay n’existe pas dans la version actuelle de WinJS… ce qui ne veut pas dire qu’on ne peut pas le mettre en place. C’est d’ailleurs ce que nous allons faire dans cet article !</p>  <h3>Les <i>initializers</i></h3>  <p>En effet, le binding WinJS est facilement personnalisable via un mécanisme d’<i>initializer</i>. C’est une fonction qui s’exécutera lors de l’application du binding (au moment où on appelle la fonction WinJS.Binding.processAll).</p>  <p>Tout binding utilise un <i>initializer</i> et dans la syntaxe du binding WinJS c’est le troisième membre ; en revanche il peut être omis, et c’est dans ce cas defaultBind, l’<i>initializer</i> par défaut (c’est l’équivalent du binding OneWay de XAML) qui sera utilisé.</p>  <pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">data-win-bind</span><span class="kwrd">=&quot;dest.prop: source.prop [initializer]&quot;</span> <span class="kwrd">/&gt;</span></pre>


<p>Un <i>initializer</i> peut être n’importe quelle fonction, à condition qu’elle soit sûre : appeler WinJS.Utilities.markSupportedForProcessing ou WinJS.Binding.initializer (qui font strictement la même chose) suffit à WinJS pour faire confiance à la fonction et la rend utilisable en tant qu’<i>initializer</i> :</p>

<pre class="csharpcode">WinJS.Namespace.define(<span class="str">&quot;Ext.Binding&quot;</span>, {

    twoWay: WinJS.Binding.initializer(
        <span class="kwrd">function</span> (source, sourceProps, dest, destProps) {
            <span class="rem">//TODO: implémenter l'initializer</span>
        }
    )
});</pre>


<h3>Utilisation d’un <i>initializer</i> pour implémenter le binding two-way</h3>

<p>WinJS fournie à la fonction <i>initializer</i> quatre paramètres qui nous donnent les informations suivantes :</p>

<ul>
  <li>Source : Objet métier utilisé comme source du binding. </li>

  <li>SourceProps : Tableau des propriétés de l’objet métier. </li>

  <li>Dest : Elément HTML mis à jour quand la donnée change. </li>

  <li>DestProps : Tableau des propriétés de l’élément graphique. </li>
</ul>

<p>Par exemple :</p>

<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">data-win-bind</span><span class="kwrd">=&quot;prop: source.propA.propB&quot;</span> <span class="kwrd">/&gt;</span></pre>


<p>Dans cet exemple, on a :</p>

<ul>
  <li>Dans le tableau sourceProps : [propA, propB] </li>

  <li>Dans le tableau destProps : [prop] </li>
</ul>

<p>On peut s’abonner aux évènements de l’élément HTML (par exemple l’évènement <strong>onchange</strong> utilisable sur les éléments HTML et WinJS) et ainsi être notifié des changements initiées par l’utilisateur. Lorsque l’élément change, on peut alors mettre à jour l’objet métier, et on obtient un binding two way !</p>

<p>C’est ce que l’on fait dans le bout de code suivant :</p>

<ul>
  <li>On commence par appeler le defaultBind pour gérer le binding OneWay </li>

  <li>On utilise addEventListener pour s’enregistrer à l’évènement change </li>

  <li>On récupère l’objet source et on change sa propriété en lui donnant la nouvelle valeur </li>
</ul>

<pre class="csharpcode"><span class="kwrd">var</span> oldValue, newValue, destObject, sourceObject;

<span class="kwrd">var</span> destinationChanged = <span class="kwrd">function</span> () {
    newValue = getValue(dest, destProps);
    sourceObject = getObject(source, sourceProps);

    <span class="kwrd">if</span> (sourceObject) {
        oldValue = sourceObject[sourceProps[sourceProps.length - 1]];
        <span class="kwrd">if</span> (oldValue !== newValue) {
            <strong>sourceObject</strong>[<strong>sourceProps[sourceProps.length - 1]</strong>] = <strong>newValue</strong>;
        }
    }
};

WinJS.Binding.<strong>defaultBind</strong>(source, sourceProps, dest, destProps);
destObject = getObject(dest, destProps);

<span class="kwrd">if</span> (destObject !== undefined) {
    destObject.<strong>addEventListener</strong>(<span class="str"><strong>'change'</strong></span>, destinationChanged);
}</pre>


<p>Pour récupérer l’objet source et la valeur de destination, on utilise les deux petites fonctions suivantes :</p>

<ul>
  <li>getValue permet de récupérer la valeur de propriété spécifiée par le binding </li>

  <li>getObject permet de récupérer l’objet concret dont on veut modifier la propriété </li>
</ul>

<pre class="csharpcode"><span class="kwrd">function</span> getValue(obj, objProps) {
    <span class="kwrd">var</span> i,
        o = obj;

    <span class="kwrd">for</span> (i = 0; i &lt; objProps.length; ++i) {
        o = o[objProps[i]];
    }

    <span class="kwrd">return</span> o;
}

<span class="kwrd">function</span> getObject(obj, objProps) {
    <span class="kwrd">var</span> i,
        o = obj;

    <span class="kwrd">for</span> (i = 0; i &lt; objProps.length - 1; ++i) {
        o = o[objProps[i]];
    }

    <span class="kwrd">return</span> o;
}</pre>


<h3>Conclusion</h3>

<p>Bien que le framework WinJS soit jeune, et par conséquent qu’il ait quelques lacunes, certaines peuvent être comblés par son côté très personnalisable. C’est le cas du binding two way, qui peut être implémenté très facilement grâces à des mécanismes bien présents que sont les <i>initializers</i>.</p>

<p>- Sébastien Mornas -</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows 8 : GridView et ListView au contenu adapté</title>
      <link>https://docs.microsoft.com/archive/blogs/frmcs-dev/windows-8-gridview-et-listview-au-contenu-adapt</link>
      <pubDate>Mon, 01 Apr 2013 14:45:22 GMT</pubDate>
      <dc:creator><![CDATA[Equipe Business and Mission Critical- MCS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/frmcs-dev/2013/04/01/windows-8-gridview-et-listview-au-contenu-adapt/</guid>
      <description><![CDATA[&#160;  Lorsque l’on travaille sur une application Windows Store, il est courant d'avoir à afficher...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>Lorsque l’on travaille sur une application Windows Store, il est courant d'avoir à afficher des collections d'information.</p>  <h5><font color="#000080">Petit rappel sur les contrôles</font></h5>  <p>Un type de contrôle que l’on utilise alors hérite d’<strong>ItemsControl</strong>. A partir du moment où l’on veut se binder sur une collection, c’est la solution pour l’affichage des données.</p>  <p>Mais à l’heure des tablettes et des nouveaux devices qui arrivent tous les jours, qui ont des résolutions différente et surtout, car <i>c’est ce qui importe</i> pour les applications Windows Store, des <b>diagonales d’écran</b> variées, il est de bon ton de bien adapter ses designs à ces tailles distinctes.</p>  <p>Les contrôles permettant la sélection d’Item fréquemment utilisés sont la <strong>ListView</strong> et la <strong>GridView</strong> qui ont pour points communs :</p>  <ul>   <li>D’hériter de <strong>ItemsControl</strong> </li>    <li>De permettre de grouper les items </li>    <li>De supporter l’affichage des elements dans des VirtualizingPanel </li>    <li>D’autoriser différents mode de sélection </li> </ul>  <p>Du coté de leurs divergences :</p>  <ul>   <li>Par défaut, la ListView affiche ses éléments verticalement (et est souvent utilisée dans la snapped view) </li> </ul>  <p></p>  <div id="codeSnippetWrapper" style="overflow: auto; cursor: text; font-size: 8pt; border-top: silver 1px solid; font-family: &quot;Courier New&quot;, courier, monospace; border-right: silver 1px solid; border-bottom: silver 1px solid; padding-bottom: 4px; direction: ltr; text-align: left; padding-top: 4px; padding-left: 4px; margin: 20px 0px 10px; border-left: silver 1px solid; line-height: 12pt; padding-right: 4px; max-height: 200px; width: 97.5%; background-color: rgb(244,244,244)">   <div id="codeSnippet" style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)">     <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum1" style="color: rgb(96,96,96)">   1:</span> <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">ListView</span> <span style="color: rgb(255,0,0)">Background</span><span style="color: rgb(0,0,255)">=&quot;Red&quot;</span> <span style="color: rgb(255,0,0)">ItemsSource</span><span style="color: rgb(0,0,255)">=&quot;{Binding MyCollection}&quot;</span>  <span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum2" style="color: rgb(96,96,96)">   2:</span>     <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">ListView.ItemTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum3" style="color: rgb(96,96,96)">   3:</span>         <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">DataTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum4" style="color: rgb(96,96,96)">   4:</span>             <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">Button</span> <span style="color: rgb(255,0,0)">Content</span><span style="color: rgb(0,0,255)">=&quot;{Binding}&quot;</span> <span style="color: rgb(255,0,0)">Background</span><span style="color: rgb(0,0,255)">=&quot;Blue&quot;</span><span style="color: rgb(0,0,255)">/&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum5" style="color: rgb(96,96,96)">   5:</span>         <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">DataTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum6" style="color: rgb(96,96,96)">   6:</span>     <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">ListView.ItemTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum7" style="color: rgb(96,96,96)">   7:</span> <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">ListView</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF--></div>
</div>
<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/2626.1-ListView_2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/2626.1_2D00_ListView_5F00_2.png"><img title="1-ListView" style="background-image: none; display: inline" border="0" alt="1-ListView" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/8321.1-ListView_thumb.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/8321.1_2D00_ListView_5F00_thumb.png" width="244" height="78" /></a> 

<p></p>

<ul>
  <li>alors que la GridView les affichera de la même manière mais en gérant un « wrapping » qui une fois la hauteur de la GridView atteinte affiches les items suivants à la suite horizontalement. </li>
</ul>

<p></p>

<div id="codeSnippetWrapper" style="overflow: auto; cursor: text; font-size: 8pt; border-top: silver 1px solid; font-family: &quot;Courier New&quot;, courier, monospace; border-right: silver 1px solid; border-bottom: silver 1px solid; padding-bottom: 4px; direction: ltr; text-align: left; padding-top: 4px; padding-left: 4px; margin: 20px 0px 10px; border-left: silver 1px solid; line-height: 12pt; padding-right: 4px; max-height: 200px; width: 97.5%; background-color: rgb(244,244,244)">
  <div id="codeSnippet" style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)">
    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum1" style="color: rgb(96,96,96)">   1:</span> <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">GridView</span> <span style="color: rgb(255,0,0)">Background</span><span style="color: rgb(0,0,255)">=&quot;Red&quot;</span> <span style="color: rgb(255,0,0)">ItemsSource</span><span style="color: rgb(0,0,255)">=&quot;{Binding MyCollection}&quot;</span>  <span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum2" style="color: rgb(96,96,96)">   2:</span>     <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">GridView.ItemTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum3" style="color: rgb(96,96,96)">   3:</span>         <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">DataTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum4" style="color: rgb(96,96,96)">   4:</span>             <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">Button</span> <span style="color: rgb(255,0,0)">Content</span><span style="color: rgb(0,0,255)">=&quot;{Binding}&quot;</span> <span style="color: rgb(255,0,0)">Background</span><span style="color: rgb(0,0,255)">=&quot;Blue&quot;</span><span style="color: rgb(0,0,255)">/&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum5" style="color: rgb(96,96,96)">   5:</span>         <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">DataTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum6" style="color: rgb(96,96,96)">   6:</span>     <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">GridView.ItemTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum7" style="color: rgb(96,96,96)">   7:</span> <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">GridView</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF--></div>
</div>
<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/3122.2-GridView_2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/3122.2_2D00_GridView_5F00_2.png"><img title="2-GridView" style="background-image: none; display: inline" border="0" alt="2-GridView" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/6232.2-GridView_thumb.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/6232.2_2D00_GridView_5F00_thumb.png" width="244" height="78" /></a> 

<p></p>

<h5><font color="#000080">Les conteneurs d’items (ou ItemsPanel)</font></h5>

<p>Pour ces deux contrôles, il est bien sûr possible de changer les conteneurs (<strong>ItemsPanel</strong>) par défaut qui sont, pour la <strong>GridView</strong>, la <strong>WrapGrid</strong> et pour la <strong>ListView</strong>, le <strong>VirtualizingStackPanel</strong> par un contrôle héritant de Panel. Un cas souvent rencontré serait, par exemple, pour une <strong>GridView</strong>, de choisir un <strong>StackPanel</strong> (Virtualisable ou non) avec une orientation horizontale afin de n’avoir qu’un élément par colonnes. Malheureusement, un problème fréquent est que le contenu de l’élément ne prend alors pas tout l’espace vertical (dans ce cas) disponible. Et ce, même en précisant que le VerticalAlignment=&quot;Stretch&quot; sur le Button du DataTemplate.</p>

<h5><font color="#000080">
    <div id="codeSnippetWrapper" style="overflow: auto; cursor: text; font-size: 8pt; border-top: silver 1px solid; font-family: &quot;Courier New&quot;, courier, monospace; border-right: silver 1px solid; border-bottom: silver 1px solid; padding-bottom: 4px; direction: ltr; text-align: left; padding-top: 4px; padding-left: 4px; margin: 20px 0px 10px; border-left: silver 1px solid; line-height: 12pt; padding-right: 4px; max-height: 200px; width: 97.5%; background-color: rgb(244,244,244)">
      <div id="codeSnippet" style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)">
        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum1" style="color: rgb(96,96,96)">   1:</span> <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">GridView</span> <span style="color: rgb(255,0,0)">Grid</span>.<span style="color: rgb(255,0,0)">Row</span><span style="color: rgb(0,0,255)">=&quot;1&quot;</span> <span style="color: rgb(255,0,0)">Height</span><span style="color: rgb(0,0,255)">=&quot;120&quot;</span> <span style="color: rgb(255,0,0)">VerticalAlignment</span><span style="color: rgb(0,0,255)">=&quot;Top&quot;</span> <span style="color: rgb(255,0,0)">Grid</span>.<span style="color: rgb(255,0,0)">Column</span><span style="color: rgb(0,0,255)">=&quot;3&quot;</span> <span style="color: rgb(255,0,0)">Margin</span><span style="color: rgb(0,0,255)">=&quot;30,0,30,20&quot;</span> <span style="color: rgb(255,0,0)">Background</span><span style="color: rgb(0,0,255)">=&quot;Red&quot;</span> <span style="color: rgb(255,0,0)">ItemsSource</span><span style="color: rgb(0,0,255)">=&quot;{Binding MyCollection}&quot;</span>  <span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum2" style="color: rgb(96,96,96)">   2:</span>     <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">GridView.ItemsPanel</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum3" style="color: rgb(96,96,96)">   3:</span>         <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">ItemsPanelTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum4" style="color: rgb(96,96,96)">   4:</span>             <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">StackPanel</span> <span style="color: rgb(255,0,0)">Orientation</span><span style="color: rgb(0,0,255)">=&quot;Horizontal&quot;</span><span style="color: rgb(0,0,255)">/&gt;</span></pre>
<!--CRLF-->

        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum5" style="color: rgb(96,96,96)">   5:</span>         <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">ItemsPanelTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum6" style="color: rgb(96,96,96)">   6:</span>     <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">GridView.ItemsPanel</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum7" style="color: rgb(96,96,96)">   7:</span>     <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">GridView.ItemTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum8" style="color: rgb(96,96,96)">   8:</span>         <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">DataTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum9" style="color: rgb(96,96,96)">   9:</span>             <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">Button</span> <span style="color: rgb(255,0,0)">VerticalAlignment</span><span style="color: rgb(0,0,255)">=&quot;Stretch&quot;</span> <span style="color: rgb(255,0,0)">Content</span><span style="color: rgb(0,0,255)">=&quot;{Binding}&quot;</span> <span style="color: rgb(255,0,0)">Background</span><span style="color: rgb(0,0,255)">=&quot;Blue&quot;</span><span style="color: rgb(0,0,255)">/&gt;</span></pre>
<!--CRLF-->

        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum10" style="color: rgb(96,96,96)">  10:</span>         <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">DataTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum11" style="color: rgb(96,96,96)">  11:</span>     <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">GridView.ItemTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

        <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum12" style="color: rgb(96,96,96)">  12:</span> <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">GridView</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF--></div>
    </div>
    <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/7318.3-GridView%20with%20StackPanel%20Horizontal_2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/7318.3_2D00_GridView-with-StackPanel-Horizontal_5F00_2.png"><img title="3-GridView with StackPanel Horizontal" style="background-image: none; display: inline" border="0" alt="3-GridView with StackPanel Horizontal" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/8715.3-GridView%20with%20StackPanel%20Horizontal_thumb.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/8715.3_2D00_GridView-with-StackPanel-Horizontal_5F00_thumb.png" width="244" height="79" /></a></font></h5>

<h5><font color="#000080">Une solution</font></h5>

<p>Pour que notre contrôle prenne bien toute la hauteur, la solution est de ne pas oublier que notre <strong>StackPanel</strong> ne donnera à notre <strong>DataTemplate</strong> de notre <strong>ItemTemplate</strong> que la place qu’il nécessite. Mais ce fameux <strong>Button</strong> de notre <strong>DataTemplate</strong>, est lui-même contenu dans un <strong>ItemContainer</strong> qui est, dans le cas de la <strong>GridView</strong>, un <strong>GridViewItem</strong> et un <strong>ListViewItem</strong> pour la <strong>ListView</strong>. Et cet <strong>ItemContainer</strong> à comme valeur par défaut pour son <strong>VerticalContentAlignment</strong> : <em>Top</em> et pour son <strong>HorizontalContentAlignment</strong> : <em>Left</em>.</p>

<p>Donc il convient de modifier les ContentAlignment de l’<strong>ItemContainerStyle</strong> de notre contrôle en <em>Stretch</em> et comme par magie, notre Button s’agrandit comme recherché. <em><font color="#008000">A noter qu’il est préférable de bien vérifier que le contrôle contenu dans le DataTemplate est en Stretch sur la dimension qui nous intéresse.</font></em></p>

<p>Donc ici, la solution se résume à spécifier dans l’ItemContainerStyle de notre GridView ou de notre ListView un <strong>VerticalContentAlignment=&quot;Stretch&quot;</strong></p>

<p>Pour la ListView, voici le code XAML</p>

<div id="codeSnippetWrapper" style="overflow: auto; cursor: text; font-size: 8pt; border-top: silver 1px solid; font-family: &quot;Courier New&quot;, courier, monospace; border-right: silver 1px solid; border-bottom: silver 1px solid; padding-bottom: 4px; direction: ltr; text-align: left; padding-top: 4px; padding-left: 4px; margin: 20px 0px 10px; border-left: silver 1px solid; line-height: 12pt; padding-right: 4px; max-height: 200px; width: 97.5%; background-color: rgb(244,244,244)">
  <div id="codeSnippet" style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)">
    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum1" style="color: rgb(96,96,96)">   1:</span> <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">ListView</span>  <span style="color: rgb(255,0,0)">VerticalAlignment</span><span style="color: rgb(0,0,255)">=&quot;Top&quot;</span> <span style="color: rgb(255,0,0)">Background</span><span style="color: rgb(0,0,255)">=&quot;Red&quot;</span> <span style="color: rgb(255,0,0)">ItemsSource</span><span style="color: rgb(0,0,255)">=&quot;{Binding MyCollection}&quot;</span>  <span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum2" style="color: rgb(96,96,96)">   2:</span>     <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">ListView.ItemContainerStyle</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum3" style="color: rgb(96,96,96)">   3:</span>         <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">Style</span> <span style="color: rgb(255,0,0)">TargetType</span><span style="color: rgb(0,0,255)">=&quot;ListViewItem&quot;</span> <span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum4" style="color: rgb(96,96,96)">   4:</span>             <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">Setter</span> <span style="color: rgb(255,0,0)">Property</span><span style="color: rgb(0,0,255)">=&quot;HorizontalContentAlignment&quot;</span> <span style="color: rgb(255,0,0)">Value</span><span style="color: rgb(0,0,255)">=&quot;Stretch&quot;</span><span style="color: rgb(0,0,255)">/&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum5" style="color: rgb(96,96,96)">   5:</span>         <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">Style</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum6" style="color: rgb(96,96,96)">   6:</span>     <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">ListView.ItemContainerStyle</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum7" style="color: rgb(96,96,96)">   7:</span>     <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">ListView.ItemTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum8" style="color: rgb(96,96,96)">   8:</span>         <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">DataTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum9" style="color: rgb(96,96,96)">   9:</span>             <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">Button</span> <span style="color: rgb(255,0,0)">HorizontalAlignment</span><span style="color: rgb(0,0,255)">=&quot;Stretch&quot;</span> <span style="color: rgb(255,0,0)">Content</span><span style="color: rgb(0,0,255)">=&quot;{Binding}&quot;</span> <span style="color: rgb(255,0,0)">Background</span><span style="color: rgb(0,0,255)">=&quot;Blue&quot;</span><span style="color: rgb(0,0,255)">/&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum10" style="color: rgb(96,96,96)">  10:</span>         <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">DataTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum11" style="color: rgb(96,96,96)">  11:</span>     <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">ListView.ItemTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum12" style="color: rgb(96,96,96)">  12:</span> <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">ListView</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF--></div>
</div>

<p>et le rendu visuel </p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/0882.4-ListView%20Filled_2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/0882.4_2D00_ListView-Filled_5F00_2.png"><img title="4-ListView Filled" style="background-image: none; display: inline" border="0" alt="4-ListView Filled" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/6648.4-ListView%20Filled_thumb.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/6648.4_2D00_ListView-Filled_5F00_thumb.png" width="244" height="79" /></a></p>

<p>La même chose pour une GridView</p>

<div id="codeSnippetWrapper" style="overflow: auto; cursor: text; font-size: 8pt; border-top: silver 1px solid; font-family: &quot;Courier New&quot;, courier, monospace; border-right: silver 1px solid; border-bottom: silver 1px solid; padding-bottom: 4px; direction: ltr; text-align: left; padding-top: 4px; padding-left: 4px; margin: 20px 0px 10px; border-left: silver 1px solid; line-height: 12pt; padding-right: 4px; max-height: 200px; width: 97.5%; background-color: rgb(244,244,244)">
  <div id="codeSnippet" style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)">
    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum1" style="color: rgb(96,96,96)">   1:</span> <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">GridView</span>  <span style="color: rgb(255,0,0)">VerticalAlignment</span><span style="color: rgb(0,0,255)">=&quot;Top&quot;</span>  <span style="color: rgb(255,0,0)">Background</span><span style="color: rgb(0,0,255)">=&quot;Red&quot;</span> <span style="color: rgb(255,0,0)">ItemsSource</span><span style="color: rgb(0,0,255)">=&quot;{Binding MyCollection}&quot;</span>  <span style="color: rgb(0,0,255)">&gt;</span>    <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">GridView.ItemContainerStyle</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum2" style="color: rgb(96,96,96)">   2:</span>         <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">Style</span> <span style="color: rgb(255,0,0)">TargetType</span><span style="color: rgb(0,0,255)">=&quot;GridViewItem&quot;</span> <span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum3" style="color: rgb(96,96,96)">   3:</span>             <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">Setter</span> <span style="color: rgb(255,0,0)">Property</span><span style="color: rgb(0,0,255)">=&quot;VerticalContentAlignment&quot;</span> <span style="color: rgb(255,0,0)">Value</span><span style="color: rgb(0,0,255)">=&quot;Stretch&quot;</span><span style="color: rgb(0,0,255)">/&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum4" style="color: rgb(96,96,96)">   4:</span>         <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">Style</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum5" style="color: rgb(96,96,96)">   5:</span>     <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">GridView.ItemContainerStyle</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum6" style="color: rgb(96,96,96)">   6:</span>     <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">GridView.ItemsPanel</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum7" style="color: rgb(96,96,96)">   7:</span>         <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">ItemsPanelTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum8" style="color: rgb(96,96,96)">   8:</span>             <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">StackPanel</span> <span style="color: rgb(255,0,0)">Orientation</span><span style="color: rgb(0,0,255)">=&quot;Horizontal&quot;</span><span style="color: rgb(0,0,255)">/&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum9" style="color: rgb(96,96,96)">   9:</span>         <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">ItemsPanelTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum10" style="color: rgb(96,96,96)">  10:</span>     <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">GridView.ItemsPanel</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum11" style="color: rgb(96,96,96)">  11:</span>     <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">GridView.ItemTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum12" style="color: rgb(96,96,96)">  12:</span>         <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">DataTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum13" style="color: rgb(96,96,96)">  13:</span>             <span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">Button</span> <span style="color: rgb(255,0,0)">VerticalAlignment</span><span style="color: rgb(0,0,255)">=&quot;Stretch&quot;</span> <span style="color: rgb(255,0,0)">Content</span><span style="color: rgb(0,0,255)">=&quot;{Binding}&quot;</span> <span style="color: rgb(255,0,0)">Background</span><span style="color: rgb(0,0,255)">=&quot;Blue&quot;</span><span style="color: rgb(0,0,255)">/&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum14" style="color: rgb(96,96,96)">  14:</span>         <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">DataTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: white"><span id="lnum15" style="color: rgb(96,96,96)">  15:</span>     <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">GridView.ItemTemplate</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF-->

    <pre style="overflow: visible; font-size: 8pt; font-family: &quot;Courier New&quot;, courier, monospace; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; padding-left: 0px; margin: 0em; line-height: 12pt; padding-right: 0px; width: 100%; background-color: rgb(244,244,244)"><span id="lnum16" style="color: rgb(96,96,96)">  16:</span> <span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">GridView</span><span style="color: rgb(0,0,255)">&gt;</span></pre>
<!--CRLF--></div>
</div>
<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/1462.5-GridView%20with%20StackPanel%20Horizontal%20Filled_2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/1462.5_2D00_GridView-with-StackPanel-Horizontal-Filled_5F00_2.png"><img title="5-GridView with StackPanel Horizontal Filled" style="background-image: none; display: inline" border="0" alt="5-GridView with StackPanel Horizontal Filled" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/5353.5-GridView%20with%20StackPanel%20Horizontal%20Filled_thumb.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/5353.5_2D00_GridView-with-StackPanel-Horizontal-Filled_5F00_thumb.png" width="244" height="76" /></a> 

<h5><font color="#000080">Code Source</font></h5>

<p>Le code source de la démo se trouve <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/48/SourceCode/6646.TestStackPanel.zip" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-48-SourceCode/6646.TestStackPanel.zip">ici</a>.</p>

<p>&#160;</p>

<p>- David ROZEN -</p>]]></content:encoded>
    </item>
    <item>
      <title>Mettre en place la vue ancrée rapidement en JavaScript et CSS3 [Partie 2]</title>
      <link>https://docs.microsoft.com/archive/blogs/frmcs-dev/mettre-en-place-la-vue-ancre-rapidement-en-javascript-et-css3-partie-2</link>
      <pubDate>Fri, 08 Mar 2013 11:39:34 GMT</pubDate>
      <dc:creator><![CDATA[Equipe Business and Mission Critical- MCS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/frmcs-dev/2013/03/08/mettre-en-place-la-vue-ancre-rapidement-en-javascript-et-css3-partie-2/</guid>
      <description><![CDATA[Dans mon précédent article, j'abordais la possibilité de changer le style de l'application au moment...]]></description>
      <content:encoded><![CDATA[<p>Dans mon <a href="http://blogs.msdn.com/b/semornas/archive/2013/02/25/mettre-en-place-la-vue-ancr-233-e-rapidement-en-javascript-et-css3.aspx">précédent article</a>, j'abordais la possibilité de changer le style de l'application au moment du changement d'état – en particulier vers la vue ancrée – en utilisant les Media Queries de CSS3. Cependant, il y a des scénarii qui impliquent un changement de comportement de l'application dans un état ou un autre ; il faut alors écrire du code JavaScript qui réagit à l'évènement de changement d'état. Nous verrons dans cet article deux cas d'usages assez fréquents : la modification du layout de la ListView et la mise en place d'une navigation spécifique pour la vue ancrée.</p>  <h3>S'abonner au changement d'état</h3>  <p>Pour savoir quand l'application change d'état en JavaScript, rien de plus simple : il suffit de s'abonner à l'évènement <strong>onresize</strong> de la variable globale <strong>windows</strong> (qui est un peu le point d'entrée pour tout un tas de chose en JavaScript). Ce dernier se déclenche à chaque fois que la « fenêtre » de l'application change de taille, ce qui dans le cas d'une application Windows 8, n'arrive logiquement que lors du changement d'état ! On peut alors requêter l'état courant ; pour ça rien de plus simple :</p>  <pre><code>var viewState = Windows.UI.ViewManagement.ApplicationView.value;</code></pre>

<p>On aura tendance à vouloir stocker quelque part cet état, pour le comparer plus tard au nouvel état et ne déclencher de traitement que si l'état a changé … Bonne nouvelle, si vous êtes parti des templates de projet Visual Studio <em>Grid App</em>, <em>Split App</em> ou <em>Navigation App</em>, alors vous avez sans doute un fichier <strong>navigator.js</strong> dans votre projet qui définit une classe – au sens WinJS j'entends, tout le monde sait qu'il n'y a pas de classe en JavaScript – nommée <strong>PageControlNavigator</strong> qui est là pour simplifier la gestion de la navigation entre vos différentes pages ; et bien cette classe permet aussi de simplifier la gestion des viewstates. Dans vos pages vous n'avez qu'à utiliser la méthode <strong>updateLayout</strong> qui sera appelée par le <strong>PageControlNavigator </strong>pour gérer les changements d'états. Par exemple :</p>

<pre><code>updateLayout: function (element, viewState, lastViewState) {<br /> if (viewState === Windows.UI.ViewManagement.ApplicationViewState.snapped &amp;&amp;<br /> lastViewState !== Windows.UI.ViewManagement.ApplicationViewState.snapped) {<br /> //Passage de n'importe quel état vers la vue ancrée<br /> }<br /> else if (<br /> viewState !== Windows.UI.ViewManagement.ApplicationViewState.snapped &amp;&amp;<br /> lastViewState === Windows.UI.ViewManagement.ApplicationViewState.snapped) {<br /> //Passage de la vue ancrée à n'importe quel autre état<br /> }<br /> }</code></pre>

<p>Je ne peux que vous recommander de partir des templates précédemment cités pour tous vos projets, quitte à supprimer les fichiers qui ne vous sont pas utiles. Le fichier <strong>navigator.js</strong> est un <em>must have</em>, qui par ailleurs peut être modifié pour s'adapter à vos besoins. A noter par ailleurs que l'on peut aussi demander de sortir de la vue ancrée en JavaScript, en utilisant la fonction suivante :</p>

<pre><code>Windows.UI.ViewManagement.ApplicationView.tryUnsnap();</code></pre>

<h3>Le composant ListView et les layouts</h3>

<p>En HTML5/JavaScript, il n'y a pas la même distinction en GridView et ListView qu'en XAML/C# car il n'y a qu'un seule contrôle, ListView qui permet de représenter à la fois une grille et une liste. Le fonctionnement de la ListView WinJS est à la fois simple et très puissant et toutes ses possibilités méritent un article à part entière, aussi je ne m'attarderai pas sur son fonctionnement pour aujourd'hui.</p>

<p>Pour choisir si la disposition des éléments sera en forme de liste ou de grille on va utiliser une propriété supplémentaire nommée <strong>layout</strong>. Cette propriété peut être définie dans le HTML ou en code, ce qui sera très pratique si l'on veut changer le layout de la ListView en fonction du viewstate. Voilà comment définir le layout en HTML :</p>

<pre><code>&lt;div<br /> class=&quot;itemlist win-selectionstylefilled&quot;<br /> data-win-control=&quot;WinJS.UI.ListView&quot;<br /> data-win-options=&quot;{ <br /> layout:{type:WinJS.UI.GridLayout}}&gt; <br />&lt;/div&gt;</code></pre>

<p>Pour changer le layout lors du changement de viewstate il suffit de modifier <strong>updateLayout</strong> comme cela :</p>

<pre><code>updateLayout: function (element, viewState, lastViewState) {<br /> var listView = element.querySelector(&quot;.itemlist&quot;).winControl;<br /> if (viewState === Windows.UI.ViewManagement.ApplicationViewState.snapped &amp;&amp; <br /> lastViewState !== Windows.UI.ViewManagement.ApplicationViewState.snapped) {<br /> listView.layout = new WinJS.UI.ListLayout(); <br /> } <br /> else if ( <br /> viewState !== Windows.UI.ViewManagement.ApplicationViewState.snapped &amp;&amp; <br /> lastViewState === Windows.UI.ViewManagement.ApplicationViewState.snapped) {<br /> listView.layout = new WinJS.UI.GridLayout(); <br /> } <br /> }</code></pre>

<h3>Navigation spéciale pour la vue ancrée</h3>

<p>Il arrive que l'on souhaite afficher sur une page une liste d'éléments et un contenu dépendant de cette liste. C'est par exemple le cas de l'application Mail de Windows 8 : elle affiche vos mails à gauche et le détail du mail en cours de lecture à droite. Que se passe-t-il quand on passe à la vue ancrée ? Il n'y a alors clairement plus assez d'espace pour afficher la liste d'emails ET le contenu de l'email sélectionné… La solution est de casser virtuellement la page en deux pages uniquement pour la vue ancrée.</p>

<p>La solution est astucieuse et pas très complexe techniquement ; en vue ancrée, on n'affichera que l'élément sélectionné s'il y en a un, et uniquement la liste d'éléments si aucun élément n'a été sélectionné. Pour cela on utilisera les media queries décrite dans la <a href="http://blogs.msdn.com/b/semornas/archive/2013/02/25/mettre-en-place-la-vue-ancr-233-e-rapidement-en-javascript-et-css3.aspx">première partie de l'article</a>. Lorsque l'on sélectionne un élément dans la partie liste, on affiche alors la page de détails pour cet élément : pour cela on utilise la navigation afin de naviguer sur une nouvelle occurrence de cette même page. Cela permettra ensuite d'utiliser le bouton retour pour revenir sur la liste. La seule partie un peu plus complexe est le code de la fonction <strong>updateLayout</strong> qui doit gérer les différents cas de transitions décrits dans le schéma ci-dessous :</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/28/4667.Schema.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-28/4667.Schema.png"><img border="0" alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/28/4667.Schema.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-28/4667.Schema.png" /></a></p>

<p>Quand on est dans le cas des transitions en bleu, il faut manipuler l'historique de navigation en code pour pouvoir gérer le bouton retour qui nous renverra sur la liste, et non sur la page précédente !</p>

<pre><code>// On passe en vue ancrée : on ajoute la vue en mode liste dans la pile d'historique<br /> nav.history.current.state = { <br /> groupKey: this._group.key, <br /> selectedIndex: this._itemSelectionIndex <br /> }; <br /> nav.history.backStack.push({ <br /> location: &quot;/pages/split/split.html&quot;, <br /> state: { groupKey: this._group.key } <br /> });<br /> <br /> // On passe en mode paysage : on supprime la vue de la pile d'historique<br /> nav.history.backStack.pop();</code></pre>

<p>Bon, ce n'est pas très compliqué mais si vous ne voulez pas écrire tout le code à la main, j'ai une bonne nouvelle : le template Visual Studio <em>Split App</em> met en place exactement ce mécanisme pour vous. Je vous conseille donc d'y jeter un coup d'œil !</p>

<p>- Sébastien Mornas -</p>]]></content:encoded>
    </item>
    <item>
      <title>Mettre en place la vue ancrée rapidement en JavaScript et CSS3 [Partie 1]</title>
      <link>https://docs.microsoft.com/archive/blogs/frmcs-dev/mettre-en-place-la-vue-ancre-rapidement-en-javascript-et-css3-partie-1</link>
      <pubDate>Sun, 03 Mar 2013 23:58:14 GMT</pubDate>
      <dc:creator><![CDATA[Equipe Business and Mission Critical- MCS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/frmcs-dev/2013/03/03/mettre-en-place-la-vue-ancre-rapidement-en-javascript-et-css3-partie-1/</guid>
      <description><![CDATA[Dans Windows 8, les applications modernes (ou Windows Store Apps) se veulent plus immersives et sont...]]></description>
      <content:encoded><![CDATA[<p>Dans Windows 8, les applications modernes (ou <em>Windows Store Apps</em>) se veulent plus immersives et sont dans ce but optimisées pour le plein écran… mais pas seulement. La vue ancrée (désignation française pour la <em>Snapped View</em>) est une visualisation de votre application dont la résolution est en partie figée : elle mesure précisément 320 pixels de largeur, et peut être ancrée d'un côté ou de l'autre. Elle s'étend en verticale sur toute la hauteur disponible. Enfin elle offre la possibilité de cohabiter à l'écran avec une seconde application, qui sera dans un mode dit « remplie » (<em>Filled View</em> en anglais).</p>  <p>Ce que j'aime dans la vue ancrée, c'est que le contenu de l'application s'adapte aussitôt que l'on passe de la vue plein écran à la vue ancrée et inversement. On se retrouve alors devant une autre vue de son application où tout le contenu et la disposition de ce dernier a été pensée pour cette résolution bien particulière. On peut mettre en place une nouvelle mécanique toute différente ; le défilement se fait alors verticalement, les actions importantes restent et les autres disparaissent ; c'est comme si l'application se transformait en application mobile !</p>  <p>Vous pourriez vous dire « C'est beau, mais pour moi développeur, c'est aussi plus de travail ! ». Mais à cela, je vous réponds : rassurez-vous les outils et les langages sont là pour vous aider ! Comme nous le verrons, CSS et JavaScript permettent de réaliser la vue ancrée de votre application très facilement à partir de la vue plein-écran, et Blend sera l'outil indispensable pour tester le desing de votre application dans tous ces états !</p>  <h3>CSS3 et les <em>Media Queries </em></h3>  <h4>CSS for dummies</h4>  <p>Si vous connaissez bien le modèle de développement C# / XAML, que ça soit par le biais de WPF, de Silverlight ou des apps Windows 8, le layout d'une page en HTML/CSS peut vous paraître pour le moins étrange. Habituellement en XAML, on utilise différent contrôles&#160; &quot;conteneurs&quot; pour contenir les contrôles (ou d'autres conteneurs). Par exemple : Grid, StackPanel, WrapPanel, etc.</p>  <p>En HTML, on utilise des balises telles que div, section, article, etc. pour contenir les autres éléments. C'est ensuite dans la feuille de style CSS que l'on définit si le conteneur dispose les éléments enfants en les empilant horizontalement ou verticalement, ou en utilisant une grille, etc.</p>  <p>Une feuille CSS est donc un fichier contenant une liste de règles qui définissent les propriétés graphiques et de layout des éléments de la page HTML. Une <strong>règle</strong> peut cibler certains éléments à l'aide de <strong>sélecteurs</strong> :</p>  <ul>   <li>Un élément spécifique : on donne un identifiant unique au contrôle et on peut appliquer un style en passant cet identifiant. </li>    <li>Une classe CSS : on donne un nom de classe à plusieurs éléments pour leur appliquer des propriétés communes. </li>    <li>On peut également chainer les sélecteurs pour cibler certains éléments bien spécifiques (ex : le premier article de chaque section) </li> </ul>  <h4>Les Media Queries au service de la vue ancrée</h4>  <p>Cela devient intéressant lorsque l'on précise que certaines règles ne sont appliquées que dans certaines conditions. Ces conditions peuvent être un certain type de média (un écran, une télé, une imprimante, etc.) ou une certaine taille d'écran par exemple. Ce sont ces ensembles de règles qui se basent sur une condition pour s'appliquer ou non qui sont appelées <em>media queries</em>. Windows 8 ajoute l'état courant de la vue (snapped, fill, fullscreen-portrait, fullscreen-landscape) comme un nouveau critère utilisable dans une <em>media query</em>. Dans l'exemple suivant on change la couleur du fond de la vue selon qu'on est en vue ancrée ou en vue plein écran / remplie :</p>  <pre><code>@media screen and (-ms-view-state: filled), (-ms-view-state: fullscreen-landscape) { <br /> body { <br />&#160;&#160; background-color: red; <br /> } <br />} <br /> <br />@media screen and (-ms-view-state: snapped) { <br /> body { <br />&#160;&#160; background-color: green; <br /> } <br />}</code></pre>

<h4>Concevoir une vue ancrée pour une application existante</h4>

<p>Prenons un exemple plus concret : disons que je suis en train de concevoir une application pour gérer ma collection de jeux vidéo. J'ai d'abord développé une page qui affiche les différentes catégories de jeux, puis un écran pour détailler chaque catégorie et en afficher la liste des jeux. Les éléments qui me permettent d'ouvrir une catégorie sont des balises div que j'ai mis dans un autre div. J'ai ensuite créé la feuille de style de la page et ai défini que la balise parente utiliserai une <strong>flexbox</strong> à défilement horizontal pour afficher ses enfants.</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/28/8176.snapped_1_1.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-28/8176.snapped_5F00_1_5F00_1.jpg"><img border="0" alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/28/8176.snapped_1_1.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-28/8176.snapped_5F00_1_5F00_1.jpg" /></a></p>

<p>Le problème c'est je n'ai rien fait pour que cette page soit compatible avec la vue ancrée ; par conséquent, si on met mon application en mode <em>snapped</em>, on voit exactement la même chose, sauf que la fenêtre est coupée à 320 px.</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/28/2727.snapped_1_2.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-28/2727.snapped_5F00_1_5F00_2.jpg"><img border="0" alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/28/2727.snapped_1_2.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/152x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-28/2727.snapped_5F00_1_5F00_2.jpg" /></a></p>

<p>Pour remédier à ce problème, je vais copier les règles CSS qui s'appliquent à la balise parente, et aux enfants dans une <em>media query</em> qui s'exécutera dans le cas d'un mode <em>snapped </em>:</p>

<pre><code>@media screen and (-ms-view-state: snapped) {<br /> .itemspage .itemslist { <br />&#160;&#160; padding-left: 20px; <br />&#160;&#160; width: calc(100% - 20px); <br />&#160;&#160; -ms-flex-direction: column; <br />&#160;&#160; overflow-y: auto; <br />&#160;&#160; overflow-x: hidden; <br /> }<br /> <br /> .itemspage .gamecategory-item { <br />&#160;&#160; height: 200px; <br />&#160;&#160; margin-bottom: 10px; <br /> }<br /><br />.itemspage .gamecategory-item-title { <br />&#160;&#160; font-size: 32pt; <br /> }<br />}</code></pre>

<p>Comme j'utilise une flexbox pour afficher les éléments à l'intérieur du div parent, je peux changer dans le cas d'une vue ancrée la direction de la flexbox. En mettant <strong>column</strong> à la place de <strong>row</strong> et en changeant la taille des éléments enfants, on obtient déjà un résultat bien plus probant quand on est dans la vue ancrée !</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/28/8814.snapped_1_3.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-28/8814.snapped_5F00_1_5F00_3.jpg"><img border="0" alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/28/8814.snapped_1_3.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/152x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-28/8814.snapped_5F00_1_5F00_3.jpg" /></a></p>

<p>- Sébastien Mornas -</p>]]></content:encoded>
    </item>
    <item>
      <title>l’équipe développement de Microsoft Consulting Services aux TechDays!</title>
      <link>https://docs.microsoft.com/archive/blogs/frmcs-dev/lquipe-dveloppement-de-microsoft-consulting-services-aux-techdays</link>
      <pubDate>Tue, 12 Feb 2013 13:03:00 GMT</pubDate>
      <dc:creator><![CDATA[Equipe Business and Mission Critical- MCS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/frmcs-dev/2013/02/12/lquipe-dveloppement-de-microsoft-consulting-services-aux-techdays/</guid>
      <description><![CDATA[A partir du mardi 12 f&eacute;vrier 2013 se d&eacute;roule la nouvelle &eacute;dition des TechDays...]]></description>
      <content:encoded><![CDATA[<p>A partir du mardi 12 f&eacute;vrier 2013 se d&eacute;roule la nouvelle &eacute;dition des TechDays !</p>
<p>Si vous ne pouvez pas venir, voici la TechDays TV qui vous permettra d'en suivre l'essentiel avant de pouvoir visionner les webcasts en ligne !</p>
<p>La TechDays TV :</p>
<p><object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="576" height="365"><param name="source" value="http://live.mstechdays.fr/Live.xap" /><param name="onError" value="onSilverlightError" /><param name="background" value="white" /><param name="minRuntimeVersion" value="3.0.40624.0" /><param name="autoUpgrade" value="true" /><param name="enableHtmlAccess" value="true" /><param name="initParams" value="rootUri=http://live.mstechdays.fr/,statRootUri=http://live-stats.brainsonic.com/services/,projectName=techdays13,suffixName=sitespeaker" /><a style="text-decoration: none;" href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=3.0.40624.0"> <img style="border-style: none;" src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" /> </a> </object></p>
<p>&nbsp;</p>
<p>Ensuite voici les sessions anim&eacute;es par des consultants Microsoft Service de la practice MBC (Mission &amp; Business Critical) &agrave; ne surtout pas rater !!!</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 11pt;"><span style="font-size: small;"><span style="font-size: 12pt;">Luc Vo Van/ Cl&eacute;ment Gatin</span></span></span></span></strong></p>
<div style="margin: 14pt 0pt;"><span style="font-size: large; font-family: times new roman,serif;"><span style="font-size: 18pt;"><strong><a href="http://www.microsoft.com/france/mstechdays/programmes/2013/fiche-session.aspx?ID=1beca3cd-7d95-49ae-b0fe-793779575c20" target="_blank">C# et .NET : Enigmes et puzzles</a></strong></span></span></div>
<p><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 11pt;"><span style="font-size: x-small;"><span style="font-size: 10pt;">Mardi 12 f&eacute;vrier : 14h30-15h30 Niveau : Confirm&eacute; (300)</span></span></span></span></p>
<p><span style="font-size: small; font-family: times new roman,serif;"><span style="font-size: 12pt;"><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 10pt;">Comme des millions de d&eacute;veloppeurs, vous utilisez C# quotidiennement &hellip; mais en maitrisez-vous les subtilit&eacute;s ? Cette session ludique vous plongera au coeur de votre langage de pr&eacute;dilection au travers programmes et exemples de code qui ne cesseront de vous surprendre. Avec en prime quelques (petits) lots &agrave; gagner pour les d&eacute;veloppeurs les plus perspicaces !</span></span></span></span></p>
<div style="margin: 14pt 0pt;"><span style="font-size: small; font-family: times new roman,serif;"><span style="font-size: 12pt;"><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 10pt;">&nbsp;</span></span></span></span></div>
<div style="margin: 14pt 0pt;"><span style="font-size: large; font-family: times new roman,serif;"><span style="font-size: 18pt;"><strong><span style="font-size: small; font-family: calibri,sans-serif;"><span style="font-size: 12pt;">Audrey Petit</span></span></strong></span></span></div>
<div style="margin: 14pt 0pt;"><span style="font-size: large; font-family: times new roman,serif;"><span style="font-size: 18pt;"><strong><a href="http://www.microsoft.com/france/mstechdays/programmes/2013/fiche-session.aspx?ID=5608f6b0-30fb-48a8-969c-9b3d4719147a" target="_blank">Cr&eacute;er des applications m&eacute;tier (LOB) pour Windows 8 et Windows Phone 8</a></strong></span></span></div>
<p><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 11pt;"><span style="font-size: x-small;"><span style="font-size: 10pt;">Jeudi 14 f&eacute;vrier : 16h00-17h00 Niveau : Interm&eacute;diaire (200)</span></span></span></span></p>
<p><span style="font-size: large; font-family: times new roman,serif;"><span style="font-size: 18pt;"><strong><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 10pt; font-weight: normal;">Windows 8, Windows Phone 8 et le Windows Store Apps ont apport&eacute; une nouvelle approche pour les entreprises dans le d&eacute;veloppement de leurs applications m&eacute;tier (LOB). Ces applications qui sont complexes et sp&eacute;cifiques, pour r&eacute;pondre aux besoins fonctionnels doivent &ecirc;tre aussi intuitives, rapides, fluides, tactiles et si possible exploiter les nouvelles possibilit&eacute;s apport&eacute;es par ce nouveau syst&egrave;me d'exploitation et par les nouveaux terminaux. Cette session permettra de voir cette nouvelle approche et comment r&eacute;pondre &agrave; ces nouveaux besoins, ainsi que les outils mis &agrave; disposition des entreprises, et comment passer d'une application traditionnelle vers une application Modern UI.</span></span></strong></span></span></p>
<div style="margin: 14pt 0pt;"><span style="font-size: large; font-family: times new roman,serif;"><span style="font-size: 18pt;"><strong><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 10pt; font-weight: normal;">&nbsp;</span></span></strong></span></span></div>
<div style="margin: 14pt 0pt;"><span style="font-size: large; font-family: times new roman,serif;"><span style="font-size: 18pt;"><strong><span style="font-size: small; font-family: calibri,sans-serif;"><span style="font-size: 12pt;">Patrice Manach&rsquo;</span></span></strong></span></span></div>
<div style="margin: 14pt 0pt;"><span style="font-size: large; font-family: times new roman,serif;"><span style="font-size: 18pt;"><strong><a href="http://www.microsoft.com/france/mstechdays/programmes/2013/fiche-session.aspx?ID=ee32b115-5897-4a32-8f79-23e0cef951f8" target="_blank">Monter en charge, tester et surveiller avec une application Windows Azure : les bonnes pratiques</a></strong></span></span></div>
<div style="margin: 0pt;"><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 11pt;"><span style="font-size: x-small;"><span style="font-size: 10pt;">Mardi 12 f&eacute;vrier : 17h30-18h30 Niveau : Confirm&eacute; (300)</span></span></span></span></div>
<div style="margin: 14pt 0pt;"><span style="font-size: small; font-family: times new roman,serif;"><span style="font-size: 12pt;"><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 10pt;">La plateforme Windows Azure dispose d'une offre de services riche qui s'&eacute;tend rapidement. En fonction des projets, vous devez faire des choix d'architecture sur les services &agrave; utiliser et leur mise en oeuvre. Quelles sont les bonnes pratiques, mais &eacute;galement les mauvaises pratiques &agrave; &eacute;viter. Les experts Azure MCS partagent leurs retours d'exp&eacute;rience issus de leurs engagements terrain parmi les sujets suivants : conna&icirc;tre les limites de charge (Scalability) de Windows Azure incluant SQL Database, comment monter en charge pour un certain nombre de services, tester en charge une application, puis surveiller et exploiter une application ou une VM Windows Azure. </span></span></span></span></div>
<div style="margin: 14pt 0pt;">&nbsp;</div>
<div style="margin: 14pt 0pt;"><span style="font-size: large; font-family: times new roman,serif;"><span style="font-size: 18pt;"><strong><span style="font-size: small; font-family: calibri,sans-serif;"><span style="font-size: 12pt;">Philippe Laloum</span></span></strong></span></span></div>
<div style="margin: 14pt 0pt;"><span style="font-size: large; font-family: times new roman,serif;"><span style="font-size: 18pt;"><strong><a href="http://www.microsoft.com/france/mstechdays/programmes/2013/fiche-session.aspx?ID=b9310ae7-dc97-4c8a-af26-2b9cbbfae309" target="_blank">Industrialisation des d&eacute;veloppements CRM 2011</a></strong></span></span></div>
<div style="margin: 0pt;"><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 11pt;"><span style="font-size: x-small;"><span style="font-size: 10pt;">Mercredi 13 f&eacute;vrier : 11h00-12h00 Niveau : Interm&eacute;diaire (200)</span></span></span></span></div>
<div style="margin: 0pt;"><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 11pt;"><span style="font-size: x-small;"><span style="font-size: 10pt;">&nbsp;</span></span></span></span></div>
<div style="margin: 0pt;"><span style="font-size: x-small; font-family: calibri,sans-serif;"><span style="font-size: 11pt;"><span style="font-size: x-small;"><span style="font-size: 10pt;">Homog&eacute;n&eacute;isez vos d&eacute;veloppements CRM 2011 en d&eacute;finissant : &bull; Un ensemble de normes et bonnes pratiques de configuration et d&eacute;veloppement des composants d'une application CRM &bull; Un macro-processus de d&eacute;veloppement inspir&eacute; de Sure Step et articul&eacute; autour des trois phases de cadrage, r&eacute;alisation et livraison d'une solution CRM &bull; Un processus de livraison de solution CRM de livraison adapt&eacute; aux trois principaux sc&eacute;narios que repr&eacute;sentent la livraison d'une version majeure, mineure ou le support d'une version d'application CRM &bull; Une instrumentation de l'environnement de d&eacute;veloppement permettant le contr&ocirc;le de code source et l'automatisation des processus de g&eacute;n&eacute;ration et livraison de solution CRM</span></span></span></span></div>
<p><br /> <br /> <br /> <br />- Audrey Petit -</p>]]></content:encoded>
    </item>
    <item>
      <title>Workflows : un alias pour monades</title>
      <link>https://docs.microsoft.com/archive/blogs/frmcs-dev/workflows-un-alias-pour-monades</link>
      <pubDate>Fri, 22 Jun 2012 06:31:00 GMT</pubDate>
      <dc:creator><![CDATA[Equipe Business and Mission Critical- MCS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/frmcs-dev/2012/06/22/workflows-un-alias-pour-monades/</guid>
      <description><![CDATA[Les monades sont un des concepts les plus compliqués que j’ai pu rencontrer en apprenant la...]]></description>
      <content:encoded><![CDATA[<p>Les monades sont un des concepts les plus compliqués que j’ai pu rencontrer en apprenant la programmation fonctionnelle. Et malheureusement, comme beaucoup de développeurs, je n’utilise probablement qu’en partie tout leur potentiel. Mais avant de rentrer dans le vif du sujet, il est intéressant de comprendre d’où viennent les monades. Elles viennent des mathématiques, et sont utilisées, à ce que je sache, dans deux langages de programmation : Haskell et C#.</p>  <p>L’idée principale derrière la conception du Haskell était la création d’un langage purement fonctionnel, ie. sans effet de bord. Pourtant, il existe quand même des effets que l’on ne peut éviter. Un premier effet de bord me venant à l’esprit est celui des entrées/sorties (IO). En effet, si vos fonctions devaient toujours renvoyer la même sortie à partir de la même entrée, il serait impossible de représenter des fonctions comme celle renvoyant une string [<i>chaine de caractères si l'on est vraiment chauvin</i>] à partir d’une ligne entrée au clavier par un utilisateur. En fait, <b>les interactions avec la réalité créent des effets de bord</b>.</p>  <p>Afin d’éviter de créer un langage inutilisable, les concepteurs du Haskell ont donc cherché un moyen de séparer les parties de code liées aux effets de bord du reste du code, de façon à ce que les codes pur et impur ne puissent se mélanger. Ainsi, si vous introduisez une fonction impure dans une fonction pure en Haskell, le code est considéré comme impur. Et c’est à ce moment-là que le concept de monades entre en jeu. </p>  <p>Les monades représentent vraiment un concept générique puissant, et qui a beaucoup d’autres applications : comme vous le verrez plus loin, F# n’utilise même pas les monades pour résoudre le problème des IO.</p>  <h2>Que sont les monades ?</h2>  <p><u>Wikipedia:</u></p>  <p><i>“In </i><a href="http://en.wikipedia.org/wiki/Functional_programming"><i>functional programming</i></a><i>, a <b>monad</b> is a </i><a href="http://en.wikipedia.org/wiki/Programming"><i>programming</i></a><i> structure that represents </i><a href="http://en.wikipedia.org/wiki/Computation"><i>computations</i></a><i>. Monads are a kind of </i><a href="http://en.wikipedia.org/wiki/Abstract_data_type"><i>abstract data type</i></a><i> </i><a href="http://en.wikipedia.org/wiki/Type_constructor"><i>constructor</i></a><i> that </i><a href="http://en.wikipedia.org/wiki/Separation_of_concerns"><i>encapsulate</i></a><i> program logic instead of data in the </i><a href="http://en.wikipedia.org/wiki/Domain_model"><i>domain model</i></a><i>. A defined monad allows the programmer to chain actions together and build different </i><a href="http://en.wikipedia.org/wiki/Pipeline_(computing)"><i>pipelines</i></a><i> that process data in various steps, in which each action is </i><a href="http://en.wikipedia.org/wiki/Decorator_pattern"><i>decorated</i></a><i> with additional processing rules provided by the monad. For example, a sequence of </i><a href="http://en.wikipedia.org/wiki/Arithmetic"><i>arithmetic</i></a><i> operations can be controlled to avoid </i><a href="http://en.wikipedia.org/wiki/Division_by_zero"><i>division by zero</i></a><i> in intermediate results. Programs written in functional style can make use of monads to structure procedures that include sequenced operations,</i><a href="http://en.wikipedia.org/wiki/Monad_(functional_programming)#cite_note-0"><i><sup>[1]</sup></i></a><a href="http://en.wikipedia.org/wiki/Monad_(functional_programming)#cite_note-1"><i><sup>[2]</sup></i></a><i> or to define some arbitrary </i><a href="http://en.wikipedia.org/wiki/Control_flow"><i>control flows</i></a><i> (like handling </i><a href="http://en.wikipedia.org/wiki/Concurrency_(computer_science)"><i>concurrency</i></a><i>, </i><a href="http://en.wikipedia.org/wiki/Continuation"><i>continuations</i></a><i>, </i><a href="http://en.wikipedia.org/wiki/Side_effect_(computer_science)"><i>side effects</i></a><i> such as </i><a href="http://en.wikipedia.org/wiki/Input/output"><i>input/output</i></a><i> and variable </i><a href="http://en.wikipedia.org/wiki/Assignment_(computer_science)"><i>assignment</i></a><i>, or </i><a href="http://en.wikipedia.org/wiki/Exception_handling"><i>exceptions</i></a><i>).</i></p>  <p><i>Formally, a monad is constructed by defining two operations (bind and return) and a </i><a href="http://en.wikipedia.org/wiki/Type_constructor"><i>type constructor</i></a><i> M that must fulfill several properties to allow the correct composition of monadic functions (i.e. functions that use values from the monad as their arguments). The return operation takes a value from a plain type and puts it into a monadic container of type M. The bind operation performs the reverse process, extracting the original value from the container and passing it to the associated next function in the pipeline.</i></p>  <p><i>A programmer uses an existing monad by composing monadic functions to define a new data-processing pipeline. The monad acts as a </i><a href="http://en.wikipedia.org/wiki/Software_framework"><i>framework</i></a><i>, as it's a reusable behavior that decides the order in which the specific monadic functions in the pipeline are called, and manages all the undercover work required by the computation.</i><a href="http://en.wikipedia.org/wiki/Monad_(functional_programming)#cite_note-2"><i><sup>[3]</sup></i></a><i> The bind and return operators interleaved in the pipeline will be executed after each monadic function returns control, and will take care of the particular </i><a href="http://en.wikipedia.org/wiki/Aspect_(computer_science)"><i>aspects</i></a><i> handled by the monad.</i></p>  <p><i>The name is taken from the </i><a href="http://en.wikipedia.org/wiki/Monad_(category_theory)"><i>mathematical monad</i></a><i> construct in </i><a href="http://en.wikipedia.org/wiki/Category_theory"><i>category theory</i></a><i>, though the two concepts are not identical.”</i></p>  <p>La définition des monades est assez longue, et difficile à comprendre, gardons-en les idées les plus importantes :</p>  <ul>   <li><b>“A monad is a programming structure that represents computations” - une monade est une structure de programmation qui représente des calculs</b> </li>    <li><b>« A defined monad allows the programmer to chain actions together » – une monade, lorsqu’elle est définie en amont, permet au développeur d’enchainer une séquence d’actions</b> </li>    <li><b>« A monad is constructed by defining two operations (bind and return) and a type constructor M that must fulfill several properties to allow the correct composition of monadic functions » – une monade se construit par la définition de 2 opérations (appelées bind et return) et d’un constructeur de type, noté M, qui doit vérifier un ensemble de propriétés permettant la composition de fonctions monadiques.</b> </li> </ul>  <p>&#160;</p>  <h2>Mieux vaut un bon exemple qu’un long discours</h2>  <p>Disons que vous voulez définir une fonction permettant de chercher un élément présent dans une liste de paires (clé, valeur), avec en entrée sa clé associée. Cette fonction pourrait avoir le type suivant : (‘a –&gt; (‘a * ‘b) list –&gt; ‘b) si un opérateur d’égalité est défini pour le type ‘a.</p>  <p>Dans l’exemple qui suit, la liste de paires correspond à un annuaire. Cet annuaire associe des noms à leurs numéros de téléphone. Dans cette liste, je veux récupérer un numéro de téléphone à partir d’un nom donné :</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/1854.image_30CA02EF.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/1854.image_5F00_30CA02EF.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/6153.image_thumb_244BB9F9.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/6153.image_5F00_thumb_5F00_244BB9F9.png" width="585" height="432" /></a></p>  <p><u>À propos des noms choisis dans cet exemple </u>: À l’époque des Royaumes Combattants (époque Sengoku), tout le cours de l’histoire du Japon aurait pu être changé le 21 juin 1582, si seulement Hideyoshi avait eu un téléphone portable. Car c’est parce qu’une simple lettre est arrivée en retard, que le Daimyo (noble Japonais) le plus puissant de l’époque, Oda Nobunaga est mort, assassiné par un de ses hommes, le samouraï Mitsuhide, qui avait mal interprété ses véritables intentions !</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/5657.clip_image002_19CAE5D9.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/5657.clip_5F00_image002_5F00_19CAE5D9.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/1832.clip_image002_thumb_02BC649D.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/1832.clip_5F00_image002_5F00_thumb_5F00_02BC649D.png" width="584" height="316" /></a></p>  <p>Notre fonction <i>lookFor</i> marche bien, mais son comportement est assez lourd : lorsque la clé donnée n’est pas trouvée, elle lance une exception. Dans le cas d’un langage typé dynamiquement, on pourrait retourner une valeur qui aurait un certain sens au regard de cette fonction de recherche : une valeur booléenne <i>fausse</i> par exemple si la clé cherchée n’est pas trouvée. Dans des langages comme le C#, vous pourriez utiliser la valeur <i>null</i>, mais vous savez probablement déjà que <i>null</i> ne doit être utilisé en prenant quelques précautions. Si ces précautions ne sont pas prises en amont, des null reference exceptions pourraient apparaître dans votre code : les valeurs retournées doivent ainsi être vérifiées à chaque nouvel appel de fonction. C’est pourquoi en C#, sans la notion d’exception, la propagation et la gestion des erreurs ressembleraient à peu près à du C : </p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/0842.clip_image003_3F709AD5.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/0842.clip_5F00_image003_5F00_3F709AD5.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image003" border="0" alt="clip_image003" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/8371.clip_image003_thumb_1540ECED.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/8371.clip_5F00_image003_5F00_thumb_5F00_1540ECED.png" width="433" height="347" /></a></p>  <p>A ce stade, il est intéressant de noter que l’indentation fait que le code se déporte sur la droite, et à quel point de ce fait il devient difficile de le lire. J’en reparlerai un peu plus tard.</p>  <p>Nous voudrions que nos fonctions puissent retourner soit un résultat valide soit une valeur ayant assez de sens pour nous indiquer que l’opération a échoué. S’il y a échec de l’opération, le statut devrait être propagé et les étapes de calcul suivantes sautées. Et si possible, tout cela en évitant d’avoir à écrire tout le code permettant d’arriver à effectuer cette propagation (et qui fait que le code se déporte peu à peu vers la droite, comme on a pu le voir ci-dessus).</p>  <p>Croyez-le ou non, mais les Monades peuvent nous aider à atteindre cet objectif.</p>  <p>Dans un premier temps, on va créer un type représentant le fait que l’opération puisse retourner avec succès ou non une valeur. Et puis, on va redéfinir notre fonction <i>lookFor</i> de façon à ce qu’elle utilise ce nouveau type.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/8304.clip_image004_188238FB.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/8304.clip_5F00_image004_5F00_188238FB.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/3010.clip_image004_thumb_35A7E105.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/3010.clip_5F00_image004_5F00_thumb_5F00_35A7E105.png" width="444" height="176" /></a></p>  <p>Le type maybe est un type générique : quand la fonction trouve une valeur, <i>Just value </i>est retourné, et lorsqu’elle n’en trouve pas, <i>Nothing</i> va être retourné :</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/4571.clip_image005_0B78331D.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/4571.clip_5F00_image005_5F00_0B78331D.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image005" border="0" alt="clip_image005" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/7230.clip_image005_thumb_1C2FB7FE.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/7230.clip_5F00_image005_5F00_thumb_5F00_1C2FB7FE.png" width="452" height="125" /></a></p>  <p>Bien qu’ayant un peu plus de sens, on n’a rien ici de plus qu’un équivalent du pattern « retourner une valeur valide ou retourner null » que l’on a pu voir plus haut avec le C#.</p>  <p><u>Remarque </u>: Il existe déjà un équivalent au type <i>Maybe&lt;’a&gt;</i>, il est défini dans la bibliothèque standard de F# et s’appelle <i>option&lt;’a&gt;.</i></p>  <p>Disons que je veuille créer une fonction qui, à partir d’un annuaire, va vérifier que tous les contacts de mes amis sont dedans, et me retourner leurs numéros. Si un des numéros ne se trouve pas dans l’annuaire, la fonction devrait me signaler qu’elle n’a pas réussi à le trouver. Si vous suivez le modèle mettant en place une cascade de if, vous devriez vous retrouver avec un code à peu près comme celui-ci :</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/4174.clip_image006_4189859F.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/4174.clip_5F00_image006_5F00_4189859F.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/8713.clip_image006_thumb_5CFE61D5.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/8713.clip_5F00_image006_5F00_thumb_5F00_5CFE61D5.png" width="452" height="166" /></a></p>  <p>C’est plutôt moche non ? On se retrouve encore avec toutes ces redondances pour vérifier les valeurs retournées, et le code continu à se déporter vers la droite. On va essayer de factoriser un peu tout ça dans un premier temps :</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/8306.clip_image007_67CB1D50.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/8306.clip_5F00_image007_5F00_67CB1D50.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image007" border="0" alt="clip_image007" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/8206.clip_image007_thumb_64D5B89D.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/8206.clip_5F00_image007_5F00_thumb_5F00_64D5B89D.png" width="451" height="179" /></a></p>  <p>On utilise ici un pattern assez commun dans les langages de programmation fonctionnelle qui consiste à capturer les continuations à l’aide de clôtures (cf. mon article sur les continuations). Si vous êtes un(e) habitué(e) des langages non fonctionnels et que vous avez fait du code asynchrone, vous connaitrez peut-être le concept des callbacks qui est assez similaire à ce pattern.</p>  <p>Ici, nous avons donc réussi à factoriser les expressions conditionnelles <i>match</i> en définissant en amont une fonction de vérification. Cette fonction prend en entrées une valeur <i>Maybe</i> et une fonction représentant une continuation ; et, en fonction de la valeur, son exécution s’arrête ou continue en prenant la valeur encapsulée par le constructeur <i>Just</i>.</p>  <p>Nous nous rapprochons de la notion de Monade, en fait en généralisant un tout petit peu plus notre code, on arrive à cette notion. Conceptuellement, nous avons : un contexte (le type représentant la possibilité d’avoir un échec), ce contexte encapsule une valeur, et grâce à une fonction (<i>check</i> dans notre exemple) nous sommes capables de propager ce contexte au travers des différentes étapes de notre calcul en extrayant et en encapsulant à nouveau la valeur au sein du contexte. La fonction que nous utilisons pour encapsuler à nouveau la valeur dans un contexte est dans notre cas particulier le constructeur de type <i>Just</i>.</p>  <p>Si vous vous rappelez, un des points que nous avons souligné au début du post est : “<i>A monad is constructed by defining two operations (bind and return) and a type constructor M that must fulfill several properties to allow the correct composition of monadic functions</i>” - <i>Une monade se construit par la définition de 2 opérations (appelées bind et return) et d’un constructeur de type, noté M, qui doit vérifier un ensemble de propriétés permettant la composition de fonctions monadiques</i>. </p>  <p>La fonction <i>check</i> que nous avons définie tout à l’heure correspond justement à l’opération <i>bind</i>, et notre constructeur <i>Just</i> à l’opération <i>return</i> :</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/4087.clip_image008_617420F5.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/4087.clip_5F00_image008_5F00_617420F5.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image008" border="0" alt="clip_image008" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/4087.clip_image008_thumb_59104B9E.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/4087.clip_5F00_image008_5F00_thumb_5F00_59104B9E.png" width="477" height="193" /></a></p>  <p>OK, je sais ce que vous pensez : j’ai juste renommé quelques fonctions. Mais il est important de bien voir ces deux opérations. Et en les définissant, nous avons officiellement créé notre première Monade ! </p>  <p>&#160;</p>  <h2>Mais une Monade, en fait, c’est juste ça ???</h2>  <p>Non non, ne vous inquiétez pas, il y en a encore en réserve. Le pattern que je vous ai montré précédemment peut apparaître comme particulièrement adapté à mon problème de gestion d’erreur, mais en réalité c’est un pattern très générique ! Tellement générique que les monades ont leur propre syntaxe en Haskell et en F#.</p>  <p>Mais, dans un premier temps, je dois vous avouer que je vous ai menti : les monades ne sont pas vraiment appelées monades en F#, mais plutôt workflows, ou « expressions de calcul» (computational expressions). Et si vous vous rappelez bien du deuxième point que nous avions souligné dans la définition d’une monade : <i>« A defined monad allows the programmer to chain actions together » – Une monade, lorsqu’elle est définie en amont, permet au développeur d’enchainer une séquence d’actions</i> ; vous pouvez désormais mieux comprendre pourquoi nous l’avions mis en exergue. Cet enchainement d’actions correspond exactement à ce que l’on a pu faire dans notre exemple de gestion d’erreur : nous avons enchainé les appels de fonctions, de façon à ce que le contexte d’échec soit géré et propagé entre les différents appels.</p>  <p>Pour définir une monade en F# et utiliser les avantages de la syntaxe que je vais vous présenter dans un court instant, nous avons besoin de définir un type constructeur. </p>  <p>Un constructeur est une classe .NET qui contient des définitions de méthodes : pour les opérations <i>bind</i> et <i>return</i>, et éventuellement aussi pour d’autres opérations liées aux monades en F#. Pour que cette classe soit correctement définie, nous devons implémenter au moins 3 méthodes : Return(value), Bind (value, continuation) et Zero(). La méthode Zero() retourne la valeur monadique par défaut. Une fois que l’on a mis en place cette classe, on l’instancie.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/4174.clip_image009_08128776.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/4174.clip_5F00_image009_5F00_08128776.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image009" border="0" alt="clip_image009" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/4186.clip_image009_thumb_4B9A12CB.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/4186.clip_5F00_image009_5F00_thumb_5F00_4B9A12CB.png" width="323" height="198" /></a></p>  <p>La méthode ci-dessus est la méthode correcte pour définir une monade de base en F#.</p>  <p>On peut alors profiter d’une syntaxe plus sympathique pour réécrire notre fonction <i>getContactNumbers</i>.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/0777.clip_image010_5E3EE6B5.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/0777.clip_5F00_image010_5F00_5E3EE6B5.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image010" border="0" alt="clip_image010" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/8780.clip_image010_thumb_71136A5F.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/8780.clip_5F00_image010_5F00_thumb_5F00_71136A5F.png" width="467" height="141" /></a></p>  <p>Admirez donc ce code ! </p>  <p>Notre code qui auparavant se déportait sur la droite et n’était que difficilement lisible est maintenant véritablement propre et concis. Que s’est-il passé pour qu’on puisse arriver à un si joli résultat ? Nous avons en fait utilisé notre instance, une jolie typo et les nouveaux mots-clés <i>let !</i> et <i>return</i> de façon à améliorer la lisibilité. En réalité, <i>let !</i> ne fait qu’appeler l’opération <i>Bind(…)</i> de notre monade, capturant de façon implicite la continuation actuelle, tandis que le mot-clé <i>return</i> appelle notre méthode <i>Return(…)</i>. Si vous êtes un (e) habitué (e) de la programmation impérative, il est vraiment important que vous compreniez que le mot-clé <i>return</i> n’a rien à voir avec le mot-clé <i>return</i> tel que vous pourriez le rencontrer en C, C++ ou en C# par exemple : ça ne va pas arrêter l’exécution, <i>return</i> correspond juste au moyen d’encapsuler une valeur dans un contexte tel qu’il est exprimé par la monade utilisée.</p>  <p>&#160;</p>  <h2>Vous connaissez déjà bien une monade…</h2>  <p>Je vous ai expliqué le concept de monade : bien qu’étrange au premier abord, c’est un concept générique et vraiment puissant. La preuve en est que si vous avez lu mon article précédent, qui était sur les séquences, vous avez déjà rencontré et utilisé les monades.</p>  <p>En effet, les séquences en F# sont des monades ! Et en Haskell, même les listes sont des monades. Et pourquoi ça ? Tout simplement, parce que si vous prenez le temps de bien y réfléchir, les listes ou les séquences sont simplement un contexte entourant des valeurs, et vous voulez peut-être propager ce contexte que forment les séquences au travers d’un enchainement de calculs tout en modifiant les valeurs qui y sont encapsulées.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/4405.clip_image011_0A5B2200.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/4405.clip_5F00_image011_5F00_0A5B2200.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image011" border="0" alt="clip_image011" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/0880.clip_image011_thumb_1440136B.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/0880.clip_5F00_image011_5F00_thumb_5F00_1440136B.png" width="537" height="97" /></a></p>  <p>Ici, le mot-clé <i>yield</i> est un mot-clé strictement équivalent au mot-clé <i>return</i>, il a été introduit pour rendre l’utilisation du mot-clé <i>return</i> plus naturel pour les séquences. Si vous connaissez la notion de générateurs dans des langages tels que le Python ou le C#, vous comprendrez probablement pourquoi.</p>  <p><b>Windows 8, bientôt là…</b></p>  <p>Comme vous le savez probablement déjà, Windows 8 sortira dans quelques semaines. Si vous essayez déjà de voir comment développer des applications avec une interface Metro en C#, vous avez du rencontrer 2 nouveaux mots-clés (C# 5.0) : <i>async</i> et <i>await</i>.</p>  <p>WinRT, la bibliothèque native qui se cache derrière Metro, a été conçue pour utiliser et forcer l’utilisation d’un modèle asynchrone pour gérer le parallélisme. L’utilisation du parallélisme est nécessaire pour gérer, hors du thread UI dédié à l’interface utilisateur, des opérations chronophages, de façon à éviter un freeze de l’interface utilisateur et une dégradation de l’expérience utilisateur.</p>  <p><b>Le principal avantage du modèle asynchrone</b> est que cela empêche la plupart des développeurs (95 % d’entre eux ?) de continuer à manipuler au petit bonheur la chance les threads et la synchronisation objet. En effet, la plupart des développeurs ne savent pas comment utiliser correctement le parallélisme et…</p>  <p><b>UN DEVELOPPEUR NEOPHYTE + THREADING + EFFETS DE BORD = CHAOS</b></p>  <p>Vous pouvez remplacer chaos par :</p>  <ul>   <ul>     <li>Interblocage (Deadlocks) </li>      <li>Incapacité à déboguer correctement les programmes </li>      <li>Un programme qui crashe une à deux fois par mois sans raison </li>      <li>Crashs informatiques </li>      <li>Accidents de train </li>      <li>Accidents d’avion </li>      <li>… </li>      <li>Fin du monde ? </li>   </ul> </ul>  <p>Et maintenant, je suis même en train de me demander si ce n’est pas la raison pour laquelle la programmation fonctionnelle a récemment fait son comeback.</p>  <p>En effet, nous sommes dans l’ère du parallélisme : des processeurs multicœurs/ calculs distribués et ressources partagées avec le Cloud/ web et communication (avec une augmentation de la part des entrées/sorties dans les programmes). Les langages de programmation fonctionnelle, en décourageant les effets de bord, rendent le parallélisme plus sûr, et facilitent son usage grâce à de nombreux concepts puissants.</p>  <p><b>Le principal désavantage du modèle asynchrone</b> est qu’il n’est pas naturel. Regardons par exemple ce programme en C# :</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/6153.clip_image012_719BD4EF.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/6153.clip_5F00_image012_5F00_719BD4EF.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image012" border="0" alt="clip_image012" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/0880.clip_image012_thumb_4361D935.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/0880.clip_5F00_image012_5F00_thumb_5F00_4361D935.png" width="793" height="382" /></a></p>  <p>Grâce à toutes ces lignes de code, je ne fais que lire 3 lignes d’un Stream en utilisant une méthode asynchrone, puis je les affiche. Admirez à quel point ce code peut être intuitif …Et réjouissez-vous : sans clôture en C#, vous ne pourriez pas l’écrire si facilement.</p>  <p>Plus haut, lorsque nous étions en route vers une meilleure compréhension du concept de monades, j’ai écrit que les callbacks pouvaient être considérés comme un concept similaire aux continuations. Regardez le code : il se déporte vers la droite, et nous capturons des continuations, le fameux « quelle opération devrait s’exécuter ensuite ». Vous le devinez maintenant, il y a une monade pour s’occuper des opérations asynchrones.</p>  <p>En F#, elle correspond à <i>async</i> et s’utilise ainsi :</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/7142.clip_image013_1FE534D0.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/7142.clip_5F00_image013_5F00_1FE534D0.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image013" border="0" alt="clip_image013" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/1856.clip_image013_thumb_7E195C3E.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/1856.clip_5F00_image013_5F00_thumb_5F00_7E195C3E.png" width="470" height="424" /></a></p>  <p>Ici, <i>let !</i> permet de capturer la continuation actuelle et de l’appeler avec le résultat une fois que la page est téléchargée.</p>  <p><b>C# : le prochain langage de programmation fonctionnelle ?</b></p>  <p>Croyez-le ou non, mais après avoir emprunté le concept de ramasse-miettes (LISP), du paradigme de la POO (LISP), des clotûres, Linq, C# emprunte désormais un autre concept puissant au monde de la programmation fonctionnelle : les monades, et plus précisément la monade <i>async</i>.</p>  <p>Les concepteurs de WinRT ont fait un choix : entre donner la permission aux développeurs d’utiliser les threads – ie. « permettre à des enfants de jouer avec un bazooka » - et passer à un modèle de programmation peu naturel pour les langages impératifs. Pour transformer le C#, asynchrone, en un langage utilisable, ils avaient besoin d’un ajout puissant venant de la programmation fonctionnelle.</p>  <p><b>Mais il nous reste quand même un problème : qui, parmi les développeurs C#, connaît les monades ?</b></p>  <p><b>Qui sait que le mot clé <i>await</i> est en réalité un <i>bind</i> déguisé qui capture la continuation actuelle au sein d’une méthode <i>async </i>?</b></p>  <p>Vous pourriez arguer, et vous auriez raison, que la remarque n’est pas forcément très pertinente, car l’important est de savoir comment se servir du concept. Et moi, je vous répondrais que les concepteurs de SE pensaient la même chose quand ils ont introduit la notion d’ordonnancement préemptif et ont donné aux développeurs des APIs process et threading.</p>  <p>&#160;</p>  <p>- Dorian Corompt -</p>  <p>- Traduit de l’anglais par Céline Bouillon -</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows 8 : Utiliser la Navigation avec MVVM</title>
      <link>https://docs.microsoft.com/archive/blogs/frmcs-dev/windows-8-utiliser-la-navigation-avec-mvvm</link>
      <pubDate>Thu, 17 May 2012 18:53:00 GMT</pubDate>
      <dc:creator><![CDATA[Equipe Business and Mission Critical- MCS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/frmcs-dev/2012/05/17/windows-8-utiliser-la-navigation-avec-mvvm/</guid>
      <description><![CDATA[Lorsque l’on a l’habitude de créer des projets avec le pattern MVVM, la première chose que l’on...]]></description>
      <content:encoded><![CDATA[<p>   <br />Lorsque l’on a l’habitude de créer des projets avec le pattern MVVM, la première chose que l’on souhaite faire sur tout nouveau projet , c’est de mettre en place les concepts que l’on a déjà mis en œuvre lors des différents projets auxquels nous aurions pu participé.</p>  <p>Dans le cadre d’un nouveau projet Windows 8, nous nous posons la question qui est “<u>Comment utiliser la navigation à partir de nos ViewModels?</u>” Nous allons vous montrer comment intégrer un service de navigation qui pourra être utilisé au travers de nos ViewModels.</p>  <h3>Définition de l’interface INavigationService</h3>  <p>Avant de pouvoir naviguer au travers de nos ViewModels, nous avons besoin d’en définir le squelette :</p>  <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:78452520-932b-4350-8821-007cb1ac3428" class="wlWriterEditableSmartContent"> <div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"> <div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div> <div style="background: #ddd; max-height: 300px; overflow: auto"> <ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"> <li><span style="color:#0000ff">public</span> <span style="color:#0000ff">interface</span> <span style="color:#2b91af">INavigationService</span></li> <li style="background: #f3f3f3">    {</li> <li>        <span style="color:#0000ff">object</span> Parameter { <span style="color:#0000ff">get</span>; }</li> <li style="background: #f3f3f3">        <span style="color:#0000ff">event</span> NavigatingCancelEventHandler Navigating;</li> <li>        </li> <li style="background: #f3f3f3">        <span style="color:#0000ff">void</span> NavigateTo(<span style="color:#2b91af">Type</span> page, <span style="color:#0000ff">object</span> parameter = <span style="color:#0000ff">null</span>);</li> <li>        <span style="color:#0000ff">void</span> GoBack();</li> <li style="background: #f3f3f3">        <span style="color:#0000ff">void</span> Initialized(Frame frame);</li> <li>    }</li> </ol> </div> </div> </div>  <p>L’interface étant créée, nous allons détailler l’utilité de chacune des signatures de méthodes :</p>  <ul>   <li><font color="#0000ff">void</font> NavigateTo(<font color="#0000ff">Type</font> page, <font color="#0000ff">object</font> parameter=null)       <br />Cette méthode va nous permettre naviguer vers une autre page avec ou sans paramètre. </li>    <li><font color="#0000ff">void</font> GoBack()&#160; <br />Cette méthode appellera la méthode native <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.frame.goback.aspx" target="_blank">GoBack</a> de l’objet Frame pour revenir à la page précédemment vue </li>    <li><font color="#0000ff">void</font> Initialized(<font color="#0000ff">Frame</font> frame)       <br />Point d’entrée de la navigation qui va définir les vues que vous voulez enregistrer.       <br />L’object <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.frame.aspx" target="_blank">Frame</a> est&#160; celui qui est définit dans le fichier <strong>App.xaml.cs</strong>. Cet objet est le point d’entrée de votre application&#160;&#160; </li>    <li><font color="#0000ff">object</font> Parameter { <font color="#0000ff">get</font>; }       <br />Cet attribut jouera un rôle particulier car c’est au travers de celui-ci que nous pourrons récupérer le paramètre passer d’un ViewModel à un autre.       <br />&#160; </li> </ul>  <h3>Création de la classe de Navigation&#160; </h3>  <p>Une fois l’interface créée nous pouvons donc l’implémenter comme suit:</p>  <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6cc67d34-7034-4174-a15a-66d16502360d" class="wlWriterEditableSmartContent"> <div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"> <div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div> <div style="background: #ddd; max-height: 300px; overflow: auto"> <ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"> <li><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">NavigationService</span> : INavigationService</li> <li style="background: #f3f3f3">    {</li> <li>&nbsp;</li> <li style="background: #f3f3f3">        <span style="color:#0000ff">public</span> <span style="color:#0000ff">event</span> NavigatingCancelEventHandler Navigating;</li> <li>&nbsp;</li> <li style="background: #f3f3f3">        <span style="color:#0000ff">private</span> Frame frame;</li> <li>        <span style="color:#0000ff">public</span> <span style="color:#0000ff">object</span> Parameter</li> <li style="background: #f3f3f3">        {</li> <li>            <span style="color:#0000ff">get</span>;</li> <li style="background: #f3f3f3">            <span style="color:#0000ff">private</span> <span style="color:#0000ff">set</span>;</li> <li>        }</li> <li style="background: #f3f3f3">&nbsp;</li> <li>        <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> NavigateTo(<span style="color:#2b91af">Type</span> page, <span style="color:#0000ff">object</span> parameter = <span style="color:#0000ff">null</span>)</li> <li style="background: #f3f3f3">        {</li> <li>            <span style="color:#0000ff">if</span> (<span style="color:#0000ff">null</span> != parameter)</li> <li style="background: #f3f3f3">            {</li> <li>                Parameter = parameter;</li> <li style="background: #f3f3f3">                frame.Navigate(page, parameter);</li> <li>            }</li> <li style="background: #f3f3f3">            <span style="color:#0000ff">else</span></li> <li>            {</li> <li style="background: #f3f3f3">                Parameter = <span style="color:#0000ff">null</span>;</li> <li>                frame.Navigate(page);</li> <li style="background: #f3f3f3">            }</li> <li>        }</li> <li style="background: #f3f3f3">&nbsp;</li> <li>        <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> GoBack()</li> <li style="background: #f3f3f3">        {</li> <li>            <span style="color:#0000ff">if</span> (EnsureMainFrame() &amp;&amp; frame.CanGoBack)</li> <li style="background: #f3f3f3">            {</li> <li>                frame.GoBack();</li> <li style="background: #f3f3f3">            }</li> <li>        }</li> <li style="background: #f3f3f3">&nbsp;</li> <li>        <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> Initialized(Frame frame)</li> <li style="background: #f3f3f3">        {</li> <li>            <span style="color:#0000ff">if</span> (<span style="color:#0000ff">null</span> == frame)</li> <li style="background: #f3f3f3">            {</li> <li>                <span style="color:#0000ff">throw</span> <span style="color:#0000ff">new</span> <span style="color:#2b91af">ArgumentNullException</span>();</li> <li style="background: #f3f3f3">            }</li> <li>&nbsp;</li> <li style="background: #f3f3f3">            <span style="color:#0000ff">if</span> (<span style="color:#0000ff">null</span> != frame)</li> <li>            {</li> <li style="background: #f3f3f3">                frame.Navigating -= FrameNavigating;</li> <li>            }</li> <li style="background: #f3f3f3">            <span style="color:#0000ff">this</span>.frame = frame;</li> <li>            <span style="color:#0000ff">this</span>.frame.Navigating += FrameNavigating;</li> <li style="background: #f3f3f3">        }</li> <li>&nbsp;</li> <li style="background: #f3f3f3">        <span style="color:#0000ff">private</span> <span style="color:#0000ff">bool</span> EnsureMainFrame()</li> <li>        {</li> <li style="background: #f3f3f3">            <span style="color:#0000ff">return</span> <span style="color:#0000ff">null</span> != frame;</li> <li>        }</li> <li style="background: #f3f3f3">&nbsp;</li> <li>        <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> FrameNavigating(<span style="color:#0000ff">object</span> sender, NavigatingCancelEventArgs e)</li> <li style="background: #f3f3f3">        {</li> <li>            <span style="color:#0000ff">if</span> (<span style="color:#0000ff">null</span> != Navigating)</li> <li style="background: #f3f3f3">                Navigating(<span style="color:#0000ff">this</span>, e);</li> <li>        }</li> <li style="background: #f3f3f3">    }</li> </ol> </div> </div> </div>  <h3>&#160;</h3>  <h3>Comment utiliser cette nouvelle classe </h3>  <p>La mise en œuvre de cette classe se fait en trois étapes qui sont les suivantes :</p>  <p>1- Créer une classe intermédiaire n’autorisant l’accès qu’à une seule instance de la navigation et lui permettant par la même occasion d’enregistrer les vues créées dans votre application </p>  <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0b1636c6-249e-43b9-bbd0-976838bbdc12" class="wlWriterEditableSmartContent"> <div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"> <div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div> <div style="background: #ddd; max-height: 300px; overflow: auto"> <ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"> <li><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">ViewService</span></li> <li style="background: #f3f3f3">{</li> <li>    <span style="color:#0000ff">private</span> <span style="color:#2b91af">IDictionary</span>&lt;<span style="color:#0000ff">string</span>, <span style="color:#2b91af">Type</span>&gt; _viewRegistered;</li> <li style="background: #f3f3f3">&nbsp;</li> <li>    <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> ViewService _instance;</li> <li style="background: #f3f3f3">    <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> ViewService Service</li> <li>    {</li> <li style="background: #f3f3f3">        <span style="color:#0000ff">get</span></li> <li>        {</li> <li style="background: #f3f3f3">            <span style="color:#0000ff">return</span> _instance ?? (_instance = <span style="color:#0000ff">new</span> ViewService());</li> <li>        }</li> <li style="background: #f3f3f3">    }</li> <li>&nbsp;</li> <li style="background: #f3f3f3">    <span style="color:#0000ff">private</span> ViewService() </li> <li>    {</li> <li style="background: #f3f3f3">        _viewRegistered = <span style="color:#0000ff">new</span> <span style="color:#2b91af">Dictionary</span>&lt;<span style="color:#0000ff">string</span>, <span style="color:#2b91af">Type</span>&gt;();</li> <li>    }</li> <li style="background: #f3f3f3">&nbsp;</li> <li>    <span style="color:#0000ff">private</span> INavigationService _navigationService;</li> <li style="background: #f3f3f3">&nbsp;</li> <li>    <span style="color:#0000ff">public</span> INavigationService NavigationService</li> <li style="background: #f3f3f3">    {</li> <li>        <span style="color:#0000ff">get</span></li> <li style="background: #f3f3f3">        {</li> <li>            <span style="color:#0000ff">return</span> _navigationService ?? (_navigationService = <span style="color:#0000ff">new</span> NavigationService());</li> <li style="background: #f3f3f3">        }</li> <li>    }</li> <li style="background: #f3f3f3">&nbsp;</li> <li>    <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> RegisterView(<span style="color:#0000ff">string</span> navigationStringValue, <span style="color:#2b91af">Type</span> typeOfView)</li> <li style="background: #f3f3f3">    {</li> <li>        <span style="color:#0000ff">if</span>( !_viewRegistered.ContainsKey(navigationStringValue))</li> <li style="background: #f3f3f3">             _viewRegistered.Add(<span style="color:#0000ff">new</span> <span style="color:#2b91af">KeyValuePair</span>&lt;<span style="color:#0000ff">string</span>,<span style="color:#2b91af">Type</span>&gt;(navigationStringValue, typeOfView));</li> <li>    }</li> <li style="background: #f3f3f3">&nbsp;</li> <li>    <span style="color:#0000ff">public</span> <span style="color:#2b91af">Type</span> GetView(<span style="color:#0000ff">string</span> navigationStringValue)</li> <li style="background: #f3f3f3">    {</li> <li>        <span style="color:#0000ff">if</span> (<span style="color:#0000ff">string</span>.IsNullOrWhiteSpace(navigationStringValue))</li> <li style="background: #f3f3f3">        {</li> <li>            <span style="color:#0000ff">throw</span> <span style="color:#0000ff">new</span> <span style="color:#2b91af">ArgumentNullException</span>();</li> <li style="background: #f3f3f3">        }</li> <li>&nbsp;</li> <li style="background: #f3f3f3">        <span style="color:#0000ff">if</span> (!_viewRegistered.Any())</li> <li>        {</li> <li style="background: #f3f3f3">            <span style="color:#0000ff">return</span> <span style="color:#0000ff">null</span>;</li> <li>        }</li> <li style="background: #f3f3f3">&nbsp;</li> <li>        <span style="color:#0000ff">if</span> (!_viewRegistered.ContainsKey(navigationStringValue))</li> <li style="background: #f3f3f3">        {</li> <li>            <span style="color:#0000ff">throw</span> <span style="color:#0000ff">new</span> <span style="color:#2b91af">ArgumentOutOfRangeException</span>();</li> <li style="background: #f3f3f3">        }</li> <li>&nbsp;</li> <li style="background: #f3f3f3">        <span style="color:#0000ff">return</span> _viewRegistered[navigationStringValue];</li> <li>    }</li> <li style="background: #f3f3f3">}</li> </ol> </div> </div> </div>  <p>2- Renseigner les vues de votre application au travers de la précédente classe créée</p>  <p>Cette initialisation s’effectue pour le cadre de cette démo dans le le fichier du <strong>App.xaml.cs</strong>     <br /></p>  <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:917ab30d-2ac0-49c8-b368-64d5b1d13aac" class="wlWriterEditableSmartContent"> <div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"> <div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div> <div style="background: #ddd; max-height: 300px; overflow: auto"> <ol start="1" style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"> <li><span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> InitializeViewService(Frame rootFrame)</li> <li style="background: #f3f3f3">        {</li> <li>            ViewService.Service.NavigationService.Initialized(rootFrame);</li> <li style="background: #f3f3f3">            ViewService.Service.RegisterView(<span style="color:#a31515">&quot;BlankPage1&quot;</span>, <span style="color:#0000ff">typeof</span>(BlankPage1));</li> <li>            ViewService.Service.RegisterView(<span style="color:#a31515">&quot;BlankPage2&quot;</span>, <span style="color:#0000ff">typeof</span>(BlankPage2));</li> <li style="background: #f3f3f3">        }</li> </ol> </div> </div> </div>  <p>3- La navigation à partir des ViewModels</p>  <p>A partir de cette étape, il ne vous reste plus qu’à utiliser la méthode <strong>NavigateTo</strong> de la classe <strong>NavigationService</strong> pour naviguer d’une page à une autre. Comme vous pouvez le voir ci-dessous, une seule ligne de code nous permet de gérer la navigation d’une vue courante à une autre.</p>  <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:df523fab-dcb4-4484-97e2-9297c52daf95" class="wlWriterEditableSmartContent"> <div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"> <div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div> <div style="background: #ddd; max-height: 500px; overflow: auto"> <ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"> <li><span style="color:#0000ff">public</span> ICommand GoToMyPage1Command { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">private</span> <span style="color:#0000ff">set</span>; }</li> <li style="background: #f3f3f3">        </li> <li>        <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> InitializeCommands()</li> <li style="background: #f3f3f3">        {</li> <li>            <span style="color:#0000ff">this</span>.GoToMyPage1Command = CommandFactory.CreateCommand(GoToMyPage1, () =&gt; { <span style="color:#0000ff">return</span> <span style="color:#0000ff">true</span>; });</li> <li style="background: #f3f3f3">        }</li> <li>&nbsp;</li> <li style="background: #f3f3f3">        <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> GoToMyPage1()</li> <li>        {</li> <li style="background: #f3f3f3">            ViewService.Service.NavigationService.NavigateTo(</li> <li>                ViewService.Service.GetView(<span style="color:#a31515">&quot;Page1&quot;</span>));</li> <li style="background: #f3f3f3">        }</li> </ol> </div> </div> </div>  <p>L’exemple ci-dessus montre l’utilisation du service sans passer de paramètre. Dans le cas où nous avons besoin de passer une quelconque information à un autre ViewModel&#160; grâce à un paramètre, il nous faut alors utiliser la navigation de la manière suivante : </p>  <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:02c8c570-1a5e-425f-ba06-168a4bb2e93d" class="wlWriterEditableSmartContent"> <div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"> <div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div> <div style="background: #ddd; max-height: 300px; overflow: auto"> <ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"> <li><span style="color:#0000ff">public</span> ICommand GoToMyPage1Command { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">private</span> <span style="color:#0000ff">set</span>; }</li> <li style="background: #f3f3f3">        </li> <li>        <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> InitializeCommands()</li> <li style="background: #f3f3f3">        {</li> <li>            <span style="color:#0000ff">this</span>.GoToMyPage1Command = CommandFactory.CreateCommand&lt;MyClass&gt;(GoToMyPage1, (o) =&gt; { <span style="color:#0000ff">return</span> <span style="color:#0000ff">true</span>; });</li> <li style="background: #f3f3f3">        }</li> <li>&nbsp;</li> <li style="background: #f3f3f3">        <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> GoToMyPage1(MyClass parameter)</li> <li>        {</li> <li style="background: #f3f3f3">            ViewService.Service.NavigationService.NavigateTo(</li> <li>                ViewService.Service.GetView(<span style="color:#a31515">&quot;Page1&quot;</span>), parameter);</li> <li style="background: #f3f3f3">        }</li> </ol> </div> </div> </div>  <h3>&#160;</h3>  <h3>Code source</h3>  <p>Le code source de la démo se trouve <a href="https://skydrive.live.com/redir?resid=2AC025337D6B8002!157&amp;authkey=!AMqLNVgt7dhjz7g" target="_blank">ICI</a>.</p>  <p>- Patrick Payet -</p>]]></content:encoded>
    </item>
    <item>
      <title>Concevoir des APIs web avec ASP.NET MVC Web API</title>
      <link>https://docs.microsoft.com/archive/blogs/frmcs-dev/concevoir-des-apis-web-avec-asp-net-mvc-web-api</link>
      <pubDate>Tue, 15 May 2012 14:10:00 GMT</pubDate>
      <dc:creator><![CDATA[Equipe Business and Mission Critical- MCS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/frmcs-dev/2012/05/15/concevoir-des-apis-web-avec-asp-net-mvc-web-api/</guid>
      <description><![CDATA[&#160;  Le web continue de se remplir d’APIs web, ces services offerts par les sociétés de...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>Le web continue de se remplir d’APIs web, ces services offerts par les sociétés de l’Internet qui permettent d’exploiter leurs données. Ils peuvent être sécurisés ou accessibles à quiconque ; gratuits ou payants ; en REST ou en SOAP ; et ont encore bien d’autres différences les uns avec les autres.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/3264.image_17644F04.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/3264.image_5F00_17644F04.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/4265.image_thumb_3C819970.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/4265.image_5F00_thumb_5F00_3C819970.png" width="557" height="317" /></a></p>  <p><em>Source : ProgrammableWeb</em></p>  <p>Mais tous ont un but commun : offrir aux développeurs un moyen simple d’exploiter des données depuis une multitude de clients différents, du PC au téléphone en passant par la télévision connectée. Dans l’optique de simplifier la conception d’APIs Web, les équipes ASP.NET et WCF ont créé un tout nouveau framework : ASP.NET Web API.</p>  <p>Dans cet article nous verrons les bases du développement d’APIs Web avec ce dernier, nous survolerons les fonctionnalités plus avancées, et finirons avec quelques ressources complémentaires qui vous permettront de vous lancer dans le développement de votre première API Web avec ASP.NET Web API.</p>  <h2>Comment ça marche ?</h2>  <p>ASP.NET Web API est certes un nouveau framework de la stack ASP.NET, il n’en reprend pas moins les concepts fondamentaux introduits avec ASP.NET / ASP.NET MVC. En particulier, ses ressemblances avec ASP.NET MVC feront de l’apprentissage pour les développeurs l’ayant pratiqué, un vrai jeu d’enfant !</p>  <h3>Rapide rappel d’ASP.NET MVC</h3>  <p>Pour les autres, revenons rapidement sur ASP.NET MVC : ici, le but est de séparer la logique d’une application (en l’occurrence d’une application web) en trois parties distinctes :</p>  <p>· la <b>vue</b> : c’est la partie que voit l’utilisateur et avec laquelle il interagit, généralement faite d’HTML agrémenté de balises serveur, de CSS et de JavaScript pour l’interaction côté client.</p>  <p>· le <b>contrôleur</b> : c’est la partie serveur qui traite la demande, communique potentiellement avec une base de données et envoie une réponse au client.</p>  <p>· le <b>modèle</b> : c’est la donnée brute qui est traitée par le contrôleur et envoyée à la vue pour y être affichée.</p>  <p>Le contrôleur joue un rôle central car c’est lui qui reçoit la requête, traite les données du modèle et redirige vers la page qui convient. Chaque contrôleur est une classe .NET (généralement C# ou VB.NET) qui contient des méthodes que l’on appelle des <b>actions</b> car ce sont celles-ci que peut activer le client. Chaque action est définie par une <b>URI</b> définie par une ou plusieurs <b>routes</b> déclarée au lancement de l’application web. Le client va donc demander une action grâce à une URI ; l’action va être traitée et la vue associée à l’action, contenant les données de sortie, va être renvoyée au client.</p>  <p>Prenons un exemple : dans un site de recettes culinaires, on pourrait trouver un contrôleur <i>Recette</i> qui dispose d’une action <i>AfficherTopRecettes</i> permettant d’afficher les recettes les plus populaires et prenant un paramètre entier qui s’il est présent, filtre sur l’ID de la recette. Cette action peut être activée depuis l’adresse : http://www.contoso.com/recette/afficherTopRecettes/10</p>  <p>Ici, la « route » qui nous a permis d’arriver à l’action en question est : http://www.contoso.com/{contrôleur}/{action}/{paramètre}</p>  <p><i>Pour plus d’informations sur ASP.NET MVC voir les articles sur le site officiel : </i><a href="http://www.asp.net/mvc"><i>http://www.asp.net/mvc</i></a><i></i></p>  <h3>Un fonctionnement similaire</h3>  <p>ASP.NET Web API fonctionne sur le même principe : un client souhaite récupérer une donnée brute : pour cela il va passer par l’<b>URI </b>correspondant à l’<b>action</b> à effectuer. La requête va être passée au <b>contrôleur</b> en question, traitée par celui-ci, qui va potentiellement interroger une base de données pour en récupérer des données (<b>modèle</b>), qui seront finalement renvoyées au client.</p>  <p>Le fonctionnement est donc extrêmement similaire, cependant à deux exceptions prêtes :</p>  <p>· Bien évidemment, il n’y a pas de vues : les données sont sérialisée (XML ou JSON par défaut) et renvoyées directement au client.</p>  <p>· Contrairement à ASP.NET MVC, les actions sont par défaut implicites dans ASP.NET Web API : l’action à exécuter est déduite des paramètres passés dans la requête et du verbe HTTP (GET, POST, PUT, DELETE).</p>  <p>Par exemple, si nous décidons d’ajouter une partie Web API dans le site culinaire que je prenais comme exemple plus haut, nous pouvons imaginer faire des requêtes comme celles-ci :</p>  <p>· [GET] http://www.contoso.com/api/recette/ : renvoi toutes les recettes</p>  <p>· [GET] http://www.contoso.com/api/recette/1242 : renvoi la recette dont l’ID est 1242</p>  <p>· [DELETE] http://www.contoso.com/api/recette/1242 : supprime la recette dont l’ID est 1242</p>  <p>· [POST] http://www.contoso.com/api/recette/ : ajoute une nouvelle recette depuis les données de formulaire POST</p>  <p>· [PUT] http://www.contoso.com/api/recette/1242 : met à jour la recette dont l’ID est 1242 depuis les données de formulaire POST</p>  <p>Note : ASP.NET Web API, qui se base entièrement sur le protocole HTTP, s’inscrit donc dans le <a href="http://fr.wikipedia.org/wiki/Representational_State_Transfer">modèle REST</a> de conception des services web.</p>  <h3>Notre premier contrôleur ASP.NET Web API</h3>  <p>Pour cela nous allons définir une classe qui étend <i>ApiController</i> et qui définit ces mêmes actions :</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/0243.image_39F867B2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/0243.image_5F00_39F867B2.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/45/70/metablogapi/0167.image_thumb_708612F6.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-45-70-metablogapi/0167.image_5F00_thumb_5F00_708612F6.png" width="415" height="618" /></a></p>  <p>Quelques points à noter dans cette classe :</p>  <p>· Si le nom des actions commencent par le verbe HTTP (Get*, Post*, Put*, Delete*) auxquelles elles sont associées, les actions n’ont pas besoin d’être décorées. Dans le cas où l’on veut changer le nom, il suffit de rajouter l’attribut correspondant : ici, on a décoré la méthode ListAllReceipes d’un HttpGetAttribute pour signaler que la méthode devait être utilisée lors d’un GET.</p>  <p>· On utilise le <a href="http://msdn.microsoft.com/en-us/library/ff649690.aspx">pattern Repository</a> pour toute la manipulation des données.</p>  <p>· On obtient l’instance courante du Repository via de l’injection de dépendance. Pour cela on a préalablement enregistré la classe qui va résoudre les dépendances : j’ai utilisé <a href="http://unity.codeplex.com/">Unity</a>, mais de nombreux autres projets permettent de le faire, tels que <a href="http://www.ninject.org/">Ninject</a>, <a href="http://www.castleproject.org/index.html">Castle Windsor</a>, etc.</p>  <p>· La méthode ListAllReceipes renvoi un IQueryable&lt;T&gt; : de cette manière il est possible de rajouter des paramètres à la requête pour ne prendre qu’un certain nombre de résultats ou faire de la pagination, sans récupérer tous les enregistrements de la base de données et ainsi gagner en performances.</p>  <p>· La méthode Post prend directement une instance de la classe Recette : la transformation des valeurs de formulaire en instance de classe est fait automatiquement, et peut être personnalisée.</p>  <p>· Il est possible d’autoriser seulement certains utilisateurs / rôles à accéder à certaines actions ; pour cela il suffit de rajouter un attribut de type AuthorizeAttribute sur les actions ou sur le contrôleur tout entier. Pour le reste, les autorisations se basent sur le modèle habituel d’authentification d’ASP.NET</p>  <h3>Les fonctionnalités avancées</h3>  <p>Il existe d’autres fonctionnalités qui viennent étoffer les possibilités d’ASP.NET Web API :</p>  <h5>Négociation de contenus</h5>  <p>Côté client, on peut préciser le type de formatage que l’on attend en sortie : via le header HTTP, <i>Accept </i>on peut demander explicitement que le retour soit formaté en XML ou en JSON. C’est la négociation de contenus (<i>Content Negociation</i>). Cela permet de renvoyer au client les données sous le format qui lui est le plus simple à traiter. On peut également personnaliser le formatage en ajoutant la prise en compte de nouveaux formats.</p>  <h5>Validation</h5>  <p>La validation des données est présente sous la même forme qu’ASP.NET MVC. On pourra décorer nos classes de modèle avec des attributs de System.ComponentModel.DataAnnotations tels que <i>Required</i>, <i>Range, MaxLength, RegularExpression</i>, etc. Ainsi les données seront automatiquement validées et les erreurs pourront être renvoyées côté client pour y être traitées.</p>  <h5>Filtres</h5>  <p>De même que dans ASP.NET MVC, il est possible de définir des classes qui vont intercepter les requêtes et exécuter du code : ce sont les filtres. Ces filtres pourront être ensuite utilisé globalement, ou bien être mis unitairement sur un contrôleur ou une action.</p>  <h5>Requêtes avancées</h5>  <p>Comme précisé précédemment, il est possible grâce au IQueryable&lt;T&gt; de rajouter des paramètres supplémentaires à la requête : sélection d’une plage de données, filtre, ordonnancement, etc.</p>  <p>Pour cela on va utiliser les <a href="http://www.odata.org/documentation/uri-conventions">conventions d’URI d’OData</a>. Par exemple, la requête suivante nous permettra de récupérer les résultats de la 3ème page de 10 recettes, ordonnés par nom: http://www.contoso.com/api/recette/?$skip=20&amp;$top=10&amp;$orderby=Name</p>  <h5>Personnalisation</h5>  <p>Tout comme ASP.NET MVC, ASP.NET Web API peut être entièrement personnalisé : il est possible d’étendre toutes les classes du processus de traitement d’une requête pour l’adapter à ses besoins. On utilisera alors le même mécanisme de résolution des dépendances que celui utilisé avec le pattern Repository.</p>  <h2>Pourquoi utiliser ASP.NET Web API</h2>  <p>ASP.NET Web API est un framework très simple à mettre en place, qui n’en est pas moins puissant et personnalisable. Il s’intègre sans problème aux sites ASP.NET / ASP.NET MVC existant et peut être auto-hébergé depuis une application console par exemple.</p>  <p>Plus important encore, il embrasse le concept de programmation RESTful ce qui le rend utilisable depuis n’importe quel terminal capable de passer des requêtes HTTP. Comme le service peut en outre adapter le formatage des données renvoyées au client qui les demande, cela le rend particulièrement cohérent pour les scénarii de mobilité, ou d’interopérabilité multi-clients.</p>  <h2>Quelques resources pour bien commencer</h2>  <p>· Pour bien commencer, installez le framework depuis la page officielle : <a href="http://www.asp.net/web-api">http://www.asp.net/web-api</a></p>  <p>· Un excellent tutorial qui entre particulièrement en détail dans le code côté client avec JQuery : <a href="http://stephenwalther.com/blog/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx">http://stephenwalther.com/blog/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx</a></p>  <p>· Le blog d’Henrik Nielsen de l’équipe ASP.NET pour suivre toutes les nouveautés sur ASP.NET Web API : <a href="http://blogs.msdn.com/b/henrikn/">http://blogs.msdn.com/b/henrikn/</a></p>  <p>· Plus d’infos sur la négociation de contenus : <a href="http://www.tugberkugurlu.com/archive/asp-net-web-api-mediatypeformatters-with-mediatypemappings">http://www.tugberkugurlu.com/archive/asp-net-web-api-mediatypeformatters-with-mediatypemappings</a></p>  <p>&#160;</p>  <p>- Sebastien Mornas -</p>]]></content:encoded>
    </item>
  </channel>
</rss>