<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ASHWORKS</title>
	<atom:link href="http://ashworks.fr/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://ashworks.fr/blog</link>
	<description>Développement .NET</description>
	<lastBuildDate>Wed, 16 May 2012 11:02:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Persistez vos données sur Windows 8 aussi !</title>
		<link>http://ashworks.fr/blog/?p=284</link>
		<comments>http://ashworks.fr/blog/?p=284#comments</comments>
		<pubDate>Wed, 16 May 2012 10:51:46 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://ashworks.fr/blog/?p=284</guid>
		<description><![CDATA[Je mets en ligne une version du helper précédent côté Windows 8 ! Ils vous permettra de sauvegarder vos données dans l&#8217;ApplicationData. Ce code est en grande partie disponible sur le Dev Center qui est une bon compagnon pour débuter le développement d&#8217;application Metro. De mon côté, je n&#8217;ai eu besoin que de supprimer tous [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ashworks.fr/blog/wp-content/uploads/2012/05/windows-8-logo-big.jpg"><img src="http://ashworks.fr/blog/wp-content/uploads/2012/05/windows-8-logo-big-300x170.jpg" alt="logo Windows 8" title="windows-8" width="300" height="170" class="aligncenter size-medium wp-image-287" /></a></p>
<p>Je mets en ligne une version du helper précédent côté Windows 8 !<br />
Ils vous permettra de sauvegarder vos données dans l&#8217;ApplicationData.<br />
Ce code est en grande partie disponible sur le <a href="http://msdn.microsoft.com/fr-fr/windows">Dev Center</a> qui est une bon compagnon pour débuter le développement d&#8217;application Metro.</p>
<p>De mon côté, je n&#8217;ai eu besoin que de supprimer tous les éléments d&#8217;un coup, c&#8217;est le but de ma fonction DeleteAll(). J&#8217;ai gardé cette méthode de foreach puisque le DeleteAsync() au niveau du LocalFolder n&#8217;avait pas le comportement que je voulais.<br />
Vous pouvez au besoin, facilement retrouver comment faire une fonction DeleteObject(string name), alors à vos claviers !</p>
<pre class="brush: csharp; title: ; notranslate">

/// &lt;summary&gt;
    /// Gestion de l'Application Data
    /// &lt;/summary&gt;
    public static class ApplicationDataStorageFactory
    {
        static async public Task SaveAsync&lt;T&gt;(string name, T obj)
        {
            try
            {
                // Lance la fonction dans un nouveau thread
                await Windows.System.Threading.ThreadPool.RunAsync((wiSender) =&gt;
                {
                    SaveImplAsync(name, obj).Wait();
                }, Windows.System.Threading.WorkItemPriority.Normal);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

        static async private Task SaveImplAsync&lt;T&gt;(string name, T obj)
        {
            try
            {
                // Création du fichier
                StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(name, CreationCollisionOption.ReplaceExisting);
                IRandomAccessStream raStream = await file.OpenAsync(FileAccessMode.ReadWrite);
                IOutputStream outStream = raStream.GetOutputStreamAt(0);

                // On écrit dans le flux de données l'objet sérialisé
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                serializer.WriteObject(outStream.AsStreamForWrite(), obj);
                await outStream.FlushAsync();
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

        static async public Task&lt;T&gt; RestoreAsync&lt;T&gt;(string name, T outObject)
        {
            await Windows.System.Threading.ThreadPool.RunAsync((wiSender) =&gt;
            {
                outObject = RestoreImplAsync(name, outObject).Result;
            }, Windows.System.Threading.WorkItemPriority.Normal);
            return outObject;
        }

        static async private Task&lt;T&gt; RestoreImplAsync&lt;T&gt;(string name, T outObject)
        {
            try
            {
                // On récupère le flux de données associé au fichier
                StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(name, CreationCollisionOption.OpenIfExists);
                if (file == null) return default(T);
                IInputStream inStream = await file.OpenSequentialReadAsync();

                // On désérialise !
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                outObject = (T)serializer.ReadObject(inStream.AsStreamForRead());
                return outObject;
            }
            catch
            {
                return default(T);
            }
        }

        static async public Task DeleteAll()
        {
            var files = await ApplicationData.Current.LocalFolder.GetFilesAsync();
            foreach (var f in files)
            {
                await f.DeleteAsync();
            }
            var folders = await ApplicationData.Current.LocalFolder.GetFoldersAsync();
            foreach (var f in folders)
            {
                await f.DeleteAsync();
            }
        }
    }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://ashworks.fr/blog/?feed=rss2&amp;p=284</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Persistez facilement vos données sur Windows Phone 7 avec l’Isolated Storage Application Settings</title>
		<link>http://ashworks.fr/blog/?p=260</link>
		<comments>http://ashworks.fr/blog/?p=260#comments</comments>
		<pubDate>Tue, 10 Jan 2012 15:56:47 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://ashworks.fr/blog/?p=260</guid>
		<description><![CDATA[Bonjour à tous ! Aujourd&#8217;hui, je partage un code inspiré par un helper sur lequel j&#8217;avais mis la main il y a longtemps, mis en ligne par Microsoft Il permet d&#8217;utiliser une partie de l&#8217;IsolatedStorage (nommé ApplicationSettings) pour pouvoir sauvegarder des données. Voici un rappel visuel des trois options liées au stockage local sur Windows [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous !</p>
<p>Aujourd&#8217;hui, je partage un code inspiré par un helper sur lequel j&#8217;avais mis la main il y a longtemps, mis en ligne par Microsoft <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Il permet d&#8217;utiliser une partie de l&#8217;IsolatedStorage (nommé ApplicationSettings) pour pouvoir sauvegarder des données.</p>
<p>Voici un rappel visuel des trois options liées au stockage local sur Windows Phone </p>
<p><a href="http://ashworks.fr/blog/wp-content/uploads/2012/01/IsolatedStorage-copy2.jpg"><img src="http://ashworks.fr/blog/wp-content/uploads/2012/01/IsolatedStorage-copy2.jpg" alt="" title="IsolatedStorage copy" width="560" height="400" class="aligncenter size-full wp-image-273" /></a></p>
<p>Dans le cas de l&#8217;Application Settings, nous pouvons stocker des chaînes de caractère en leur attribuant une clef (système Key/Value Pair), qui va aussi nous permettre  par la suite de récupérer l&#8217;objet.<br />
Du coup, pour rendre la chose encore plus sympa, nous allons passer par une étape de sérialisation/désérialisation.<br />
Attention, il faut du coup que vos classes soit sérialisables, ce qui peux ne pas être le cas si vous utilisez les bibliothèques tierces et que vous n&#8217;avez pas les sources !</p>
<p>Nous partons sur une classe statique, qui va accueillir les méthodes suivantes :</p>
<pre class="brush: plain; title: ; notranslate">
public static T GetDataContractObject&lt;T&gt;(string key)
public static void SaveDataContractObject&lt;T&gt;(string key, T objectToSave)
public static void DeleteObject(string key)
public static void DeleteAll()
private static string Serialize(object objectToSerialize)
private static T Deserialize&lt;T&gt;(string objectToDeserialize)
</pre>
<p>Le résultat final dans une application finale Windows Phone est vraiment très simple à utiliser :</p>
<pre class="brush: csharp; title: ; notranslate">

// Considérons une liste de chaîne de caractères

List&lt;string&gt; myCollection = new List&lt;string&gt;() { &quot;valeur&quot;, &quot;valeur 2&quot;, &quot;valeur 3&quot;};

// On sauvegarde l'objet
IsolatedStorageHelper.SaveDataContractObject(&quot;MyCollectionKey&quot;, myCollection)

// On récupère l'objet

List&lt;string&gt; myCollectionCopy = IsolatedStorageHelper.GetDataContractObject&lt;List&lt;String&gt;&gt;(&quot;MyCollectionKey&quot;)

// On supprime l'objet

IsolatedStorageHelper.DeleteObject(&quot;MyCollectionKey&quot;);

// On vide l'ApplicationSettings

IsolatedStorageHelper.DeleteAll();
</pre>
<p>Difficile de faire plus simple hein <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Avant ça, codons et tentons de comprendre ce helper.</p>
<p>On crée notre classe statique</p>
<pre class="brush: plain; title: ; notranslate">public static class IsolatedStorageHelper</pre>
<p>Ensuite, on va rajouter la référence vers la bibliothèque System.Runtime.Serialization, et ajouter les using :</p>
<pre class="brush: csharp; title: ; notranslate">
using System.Runtime.Serialization;
using System.IO.IsolatedStorage;
using System.IO;
</pre>
<p>Commençons par la méthode Serialize : elle prend en paramètre l&#8217;objet a sérialiser.<br />
Ce qui se passe : on sérialise l&#8217;objet, c&#8217;est à dire qu&#8217;on le transforme en un flux de données, représenté ici par la classe MemoryStream . Grâce à la classe StreamReader, on pourra représenter l&#8217;objet sous la forme d&#8217;une chaîne de caractère.</p>
<pre class="brush: csharp; title: ; notranslate">
private static string Serialize(object objectToSerialize)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                DataContractSerializer serializer = new DataContractSerializer(objectToSerialize.GetType());

                serializer.WriteObject(ms, objectToSerialize);
                ms.Position = 0;

                using (StreamReader reader = new StreamReader(ms))
                {
                    return reader.ReadToEnd();
                }
            }
        }
</pre>
<p>Ensuite, cette classe sera utilisée par SaveDataContractObject, une classe qui prend en paramètre une clef, et l&#8217;objet à persister. On remarquera l&#8217;utilisation du générique T, qui représente la classe, le type de l&#8217;objet.</p>
<pre class="brush: csharp; title: ; notranslate">
public static void SaveDataContractObject&lt;T&gt;(string key, T objectToSave)
        {
            string serializedObject = Serialize(objectToSave);
            IsolatedStorageSettings.ApplicationSettings[key] = serializedObject;
        }
</pre>
<p>Maintenant, on va créer le mécanisme inverse, en désérialisant la chaîne de caractère vers un flux de données.</p>
<pre class="brush: plain; title: ; notranslate">
private static T Deserialize&lt;T&gt;(string objectToDeserialize)
        {
            using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(objectToDeserialize)))
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                return (T)serializer.ReadObject(ms);
            }
        }
</pre>
<p>Et la méthode liée</p>
<pre class="brush: csharp; title: ; notranslate">
public static T GetDataContractObject&lt;T&gt;(string key)
        {
            if (IsolatedStorageSettings.ApplicationSettings.Contains(key))
            {
                string serializedObject = IsolatedStorageSettings.ApplicationSettings[key].ToString();
                return Deserialize&lt;T&gt;(serializedObject);
            }

            return default(T);
        }
</pre>
<p>On peut éventuellement compléter notre helper avec ces deux méthodes pour centraliser complètement la gestion de l&#8217;Isolated Storage :</p>
<pre class="brush: csharp; title: ; notranslate">
 public static void DeleteObject(string key)
        {
            IsolatedStorageSettings.ApplicationSettings.Remove(key);
        }

        public static void DeleteAll()
        {
            IsolatedStorageSettings.ApplicationSettings.Clear();
        }
</pre>
<p>Voilà c&#8217;est tout !<br />
J&#8217;ai remarqué que pas mal de personnes posaient des questions relatives au stockage isolé sur Windows Phone, si vous voulez persister des données facilement et sans vous prendre la tête, ce helper est fait pour vous <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Quelques liens sur la persistance des données sur Windows Phone :</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/ff769510(v=vs.92).aspx">Create a Settings Page for Windows Phone</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/hh202865(v=VS.92).aspx">Local Database for Windows Phone</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ashworks.fr/blog/?feed=rss2&amp;p=260</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nokia présente les Lumia 800 &amp; 710 !</title>
		<link>http://ashworks.fr/blog/?p=234</link>
		<comments>http://ashworks.fr/blog/?p=234#comments</comments>
		<pubDate>Wed, 26 Oct 2011 13:40:52 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://ashworks.fr/blog/?p=234</guid>
		<description><![CDATA[L&#8217;univers Nokia est en pleine effervescence aujourd&#8217;hui, et ce jusqu&#8217;à demain grâce au Nokia World qui a lieu à Londres. Cet évènement est majeur pour Nokia, mais aussi pour Microsoft, car le partenariat entre les deux géants représente une réelle opportunité côté économique : celle pour Nokia de prendre part à la nouvelle donne instaurée [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;univers Nokia est en pleine effervescence aujourd&#8217;hui, et ce jusqu&#8217;à demain grâce au Nokia World qui a lieu à Londres.</p>
<p>Cet évènement est majeur pour Nokia, mais aussi pour Microsoft, car le partenariat entre les deux géants représente une réelle opportunité côté économique : celle pour Nokia de prendre part à la nouvelle donne instaurée par les systèmes d&#8217;exploitation (on ne voit plus un téléphone comme une entité device/OS unique, mais comme un terminal qui accueille un système précis), et celle pour Microsoft de diffuser Windows Phone et de bénéficier de l&#8217;appui de la firme finlandaise en termes de qualité des composants,  qualité de la couche logicielle, mais aussi d&#8217;un appui marketing/communication vraiment des plus importants.</p>
<p>Lors de ce Nokia World qui a donc débuté aujourd&#8217;hui, a été présenté les deux premiers téléphones nés de l&#8217;alliance Nokia-Microsoft : les Lumia 710 et Lumia 800, sous Windows Phone 7.5 (Mango).</p>
<p>Le channel YouTube de Nokia permet de faire les présentations :</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/rdMoRhfd1Sk" frameborder="0" allowfullscreen></iframe></p>
<h3>Nokia Drive, Maps &#038; Music</h3>
<p></p>
<p>Côté apports logiciels, on notera évidemment la présence de Nokia Drive, logiciel de navigation GPS qui semble vraiment prometteur ! Enfin une vraie application GPS avec une voix intergeangable <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Il est aussi possible de switcher entre une vue 2D et une vue 3D, ainsi que de choisir une vue adaptée au jour ou à la nuit selon la situation.</p>
<p><a href="http://ashworks.fr/blog/wp-content/uploads/2011/10/NokiaMaps.png"><img src="http://ashworks.fr/blog/wp-content/uploads/2011/10/NokiaMaps-300x146.png" alt="" title="NokiaMaps" width="300" height="146" class="aligncenter size-medium wp-image-243" /></a></p>
<p>Nokia Maps est une autre application de navigation &laquo;&nbsp;turn by turn&nbsp;&raquo;, un peu à la manière de Bing Maps, mais qui ajoute des points d&#8217;intérêts.</p>
<p><a href="http://ashworks.fr/blog/wp-content/uploads/2011/10/NokiaMusic.png"><img src="http://ashworks.fr/blog/wp-content/uploads/2011/10/NokiaMusic-239x300.png" alt="" title="NokiaMusic" width="239" height="300" class="aligncenter size-medium wp-image-245" /></a><br />
On a aussi l&#8217;application Nokia Music, qui permet de lire des fichiers audios, mais aussi d&#8217;acheter des morceaux sur la boutique en ligne Nokia MP3.<br />
Le côté Mix Radio donne accès à des chaines, ou d&#8217;en créer une, voire de créer des &laquo;&nbsp;mix&nbsp;&raquo; uniques à partir de morceaux présents sur la bibliothèque.</p>
<p>Côté hardware, le Lumia 800 reste classique, tout en étant assez massif (plus profond et plus lourd que l&#8217;Omnia 7 de Samsung par exemple), mais accueille un écran AMOLED équipé de la technologie ClearBlack, et embarque un stockage de 16Go ainsi qu&#8217;un appareil photo 8mp et le fameux objectif Carl Zeiss. </p>
<p>Sur le Lumia 710, plus modeste, on trouve un écran TFT plus classique (toujours avec ClearBlack cependant !), et avec un appareil photo 5mp doté d&#8217;objectif plus commun.</p>
<p>Notez que <a href="http://www.phonehouse.fr/nokia/lumia-800/NO800BLACK">The Phone House propose déjà le Lumia 800 </a> à partir de 99€ avec abonnement, et 499€ sans (dont 50€ remboursés si acheté avec fin décembre).</p>
<p>Pour suivre le Nokia World en live c&#8217;est <a href="http://events.nokia.com/nokiaworld/index.html">ici</a> !<br />
Pour découvrir le Nokia Lumia 800 <a href="http://www.nokia.fr/fr-fr/produits/mobiles/lumia800/">c&#8217;est plutôt là</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ashworks.fr/blog/?feed=rss2&amp;p=234</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nokia Developer Training à Paris !</title>
		<link>http://ashworks.fr/blog/?p=186</link>
		<comments>http://ashworks.fr/blog/?p=186#comments</comments>
		<pubDate>Sat, 24 Sep 2011 20:26:42 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://ashworks.fr/blog/?p=186</guid>
		<description><![CDATA[Bonjour à tous ! Hier j&#8217;ai eu la chance d&#8217;assister au Nokia Developer Training qui se tenait à CAP 15, au Quai de Grenelle à Paris. Le but de cette conférence était de faire découvrir le développement d&#8217;application sur Windows Phone 7.5. A ma grande surprise, la conférence était animée notamment par Rob Miles et [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ashworks.fr/blog/wp-content/uploads/2011/09/logo.jpg"><img src="http://ashworks.fr/blog/wp-content/uploads/2011/09/logo.jpg" alt="Nokia Developer Training" title="Nokia" width="600" height="128" class="aligncenter size-full wp-image-187" /></a></p>
<p>Bonjour à tous !</p>
<p>Hier j&#8217;ai eu la chance d&#8217;assister au <strong>Nokia Developer Training </strong>qui se tenait à CAP 15, au Quai de Grenelle à Paris.<br />
Le but de cette conférence était de faire découvrir le développement d&#8217;application sur Windows Phone 7.5.<br />
A ma grande surprise, la conférence était animée notamment par Rob Miles et Andy Wigley !</p>
<table cellspacing="5" width="600">
<tr>
<td>
<a href="http://ashworks.fr/blog/wp-content/uploads/2011/09/wigley1.jpg"><img src="http://ashworks.fr/blog/wp-content/uploads/2011/09/wigley1.jpg" alt="" title="wigley" width="200" height="150" class="aligncenter size-full wp-image-201" /></a>
</td>
<td align="left">
<b>Andy Wigley</b></p>
<hr />
<a href="https://mvp.support.microsoft.com/profile=1EF31470-6654-4796-9A8E-92767192A78D"><b>Sa fiche MVP</b></a><br />
<a href="http://mobileworld.appamundi.com/blogs/andywigley/default.aspx"><b>Son blog chez Appa Mundi</b></a>
</td>
</tr>
<tr>
<td align="right">
<b>Rob Miles</b></p>
<hr />
<a href="https://mvp.support.microsoft.com/profile=A45C9A02-2624-455A-BD14-7F72733D9756"><b>Sa fiche MVP</b></a><br />
<a href="http://www.robmiles.com"><b>Son blog</b></a>
</td>
<td>
<a href="http://ashworks.fr/blog/wp-content/uploads/2011/09/miles1.jpg"><img src="http://ashworks.fr/blog/wp-content/uploads/2011/09/miles1.jpg" alt="" title="miles" width="200" height="150" class="aligncenter size-full wp-image-202" /></a>
</td>
</tr>
</table>
<p></p>
<p>Le lieu de réception était vraiment sympa, nous avons été bien accueillis.<br />
On a d&#8217;abord eu une introduction de Nokia (par Julien Amouroux je crois) sur le partenariat avec Microsoft, les enjeux actuels, etc. On nous a bien fait comprendre que les applications étaient le &laquo;&nbsp;nerf de la guerre&nbsp;&raquo;, qu&#8217;un smartphone était smart grâce à celles-ci, et que de ce fait les développeurs avaient une place de choix dans la &laquo;&nbsp;bataille&nbsp;&raquo;. Ce champ lexical guerrier ne me plait guère, et il n&#8217;est pas adapté &#8211; à mon sens &#8211; à un public de développeurs : le partage, l&#8217;humilité et la quête du savoir sont des valeurs clefs du bon développeur d&#8217;après moi.</p>
<p>Outre Rob Miles et Andy Wigley, Gregg Lebovitz (un &laquo;&nbsp;Nokia Champion&nbsp;&raquo;, semblable à un MVP à la sauce finlandaise) était là pour assurer les questions qui pouvait se poser entre le développement sous les systèmes Nokia comparé à celui sur Windows Phone.</p>
<p>En réalité, cette journée était un sorte de Jump Start pour Windows Phone &laquo;&nbsp;Mango&nbsp;&raquo;, suite à <a href="http://channel9.msdn.com/Blogs/egibson/Windows-Phone-7-Jump-Start-Session-1-of-12-Introduction"></a>celui sur Windows Phone 7 animé par le même duo.</p>
<p><em><strong>Côté thèmes abordés, on avait</strong></em></p>
<p>Silverlight sur Windows Phone<br />
Windows Phone Fast Application Switching &#038; Tombstoning<br />
XNA for Windows Phone<br />
Présentation d&#8217;une application style to-do list sur Mango, englobant quelques API comme la gestion d&#8217;état, le stockage local, les alerts &#038; reminders, les Tiles, etc&#8230;<br />
Le Marketplace et la vente d&#8217;une application</p>
<p>Etant donné que j&#8217;avais déjà développé sur Windows Phone, ce qui m&#8217;intéressait réellement c&#8217;était le point de vue d&#8217;un maître : j&#8217;ai été servi, c&#8217;est le moins qu&#8217;on puisse dire <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Rob et Andy, comme a leur habitude, on dispensé une formation très agréable : détendue, technique mais souvent accompagnée de métaphores très pertinentes, ponctuée de quelques &laquo;&nbsp;jokes&nbsp;&raquo;. Leur bonne humeur et leur esprit didactique est vraiment à la hauteur de leur technique.</p>
<p>Ce que j&#8217;en retiens surtout côté développement, c&#8217;est l&#8217;importance du cycle de vie de l&#8217;application Windows Phone, qui est propre au device et qui demande une attention particulière : l&#8217;application peut-être lancée, mise en arrière plan si un appel survient, réactivée, ou complètement effacée de la mémoire.<br />
Aussi, je n&#8217;utilisais absolument pas les Tiles secondaires, qui permettent depuis Mango d&#8217;afficher des &laquo;&nbsp;tuiles&nbsp;&raquo; en plus sur l&#8217;écran d&#8217;accueil, on peut par exemple mettre une tuile consacrée à un élément d&#8217;une To-Do List, un peu comme on peut déjà le faire avec OneNote.</p>
<p>Parmi les choses qui étaient en désaccord avec ce que je pensais, il y avait ce propos de Rob sur la visibilité d&#8217;une application sur le Marketplace. Sur Windows Phone, nous avons la possibilité de créer facilement une version d&#8217;essai d&#8217;une application ou d&#8217;un jeux, et il était précognisé d&#8217;utiliser cette pratique plutôt que de faire des applications version &laquo;&nbsp;light&nbsp;&raquo; ou &laquo;&nbsp;free&nbsp;&raquo;, dans le but d&#8217;éviter les multiplications inutiles des applications comme on en trouve sur l&#8217;App Store par exemple. C&#8217;était selon moi quelque chose de très intéressant et d&#8217;important, et ça ajoutait à la qualité du Marketplace Windows Phone.<br />
Cependant, Rob a fait une remarque très pertinente : une application payante qui possède une version d&#8217;essai n&#8217;apparaît pas dans la catégorie &laquo;&nbsp;gratuits&nbsp;&raquo; du Marketplace, et comme une partie des utilisateurs ne regardent QUE les applications gratuites, on prive celle-ci d&#8217;une visibilité certaine.<br />
Parmi d&#8217;autres remarques utiles, Rob nous a dit que changer de temps en temps la catégorie de l&#8217;application permettait de toucher à chaque fois une partie du marché différente, et d&#8217;en déduire celle dans laquelle elle se portait le mieux, ce qui sert entre autre à relancer un peu l&#8217;application, puisqu&#8217;il faut savoir que la plus grand nombre de téléchargement aura lieu dans les premières semaines suivant la sa publication sur le Marketplace.</p>
<p>A la fin de cette journée, nous avons été tous très gâtés par Microsoft, qui nous a gentillement remis des devices Samsung Focus AT&#038;T débloquables avec un code qu&#8217;ils nous ont fourni !<br />
J&#8217;avoue avoir été un peu &laquo;&nbsp;déçu&nbsp;&raquo; de ne pas avoir de prototype Nokia à la place, mais c&#8217;était inattendu et vraiment génial de leur part. Tout les ingrédients étaient réunis pour que les développeurs présents gardent un très bon souvenir de cette journée, et c&#8217;est un pari réussi par Nokia &#038; Microsoft. Je suis vraiment pressé de pouvoir mettre la main sur un Nokia sous Mango <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Encore merci à Nokia pour cette super journée, passée en plus en compagnie d&#8217;un de mes meilleurs amis, nous étions au premier rang tels de bons élèves ^^</p>
<p><a href="http://ashworks.fr/blog/wp-content/uploads/2011/09/299700_10150327479184802_640174801_7940746_342618537_n.jpg"><img src="http://ashworks.fr/blog/wp-content/uploads/2011/09/299700_10150327479184802_640174801_7940746_342618537_n-300x199.jpg" alt="" title="299700_10150327479184802_640174801_7940746_342618537_n" width="300" height="199" class="aligncenter size-medium wp-image-224" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://ashworks.fr/blog/?feed=rss2&amp;p=186</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les couleurs d&#8217;accent de Windows Phone</title>
		<link>http://ashworks.fr/blog/?p=176</link>
		<comments>http://ashworks.fr/blog/?p=176#comments</comments>
		<pubDate>Fri, 09 Sep 2011 10:51:29 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PhoneAccentColor]]></category>
		<category><![CDATA[Resources]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://ashworks.fr/blog/?p=176</guid>
		<description><![CDATA[Voici un bref article qui liste les couleurs d&#8217;accent disponibles sous Windows Phone 7.1 (beta), sans les couleurs personnalisées des opérateurs Pour ceux qui ne le savent pas, on peut aisément récupérer la couleur d&#8217;accent choisie par l&#8217;utilisateur en faisant appel aux ressources : Côté XAML => Côté C# =>]]></description>
			<content:encoded><![CDATA[<p>Voici un bref article qui liste les couleurs d&#8217;accent disponibles sous Windows Phone 7.1 (beta), sans les couleurs personnalisées des opérateurs <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pour ceux qui ne le savent pas, on peut aisément récupérer la couleur d&#8217;accent choisie par l&#8217;utilisateur en faisant appel aux ressources :</p>
<p>Côté XAML =></p>
<pre class="brush: xml; title: ; notranslate">
&lt;TextBlock Foreground=&quot;{StaticResource PhoneAccentBrush}&quot; /&gt;
</pre>
<p>Côté C# =></p>
<pre class="brush: csharp; title: ; notranslate">
SolidColorBrush accentColor = Application.Current.Resources[&quot;PhoneAccentBrush&quot;] as SolidColorBrush;
</pre>
<p><a href="http://ashworks.fr/blog/wp-content/uploads/2011/09/WindowsPhoneAccentColors.png"><img src="http://ashworks.fr/blog/wp-content/uploads/2011/09/WindowsPhoneAccentColors.png" alt="Windows Phone Accent Colors" title="WindowsPhoneAccentColors" width="620" height="375" class="alignnone size-full wp-image-177" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://ashworks.fr/blog/?feed=rss2&amp;p=176</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utiliser le LongListSelector</title>
		<link>http://ashworks.fr/blog/?p=158</link>
		<comments>http://ashworks.fr/blog/?p=158#comments</comments>
		<pubDate>Thu, 25 Aug 2011 16:16:25 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[CodePlex]]></category>
		<category><![CDATA[LongListSelector]]></category>
		<category><![CDATA[Mango]]></category>
		<category><![CDATA[Toolkit]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://ashworks.fr/blog/?p=158</guid>
		<description><![CDATA[Bonjour à tous ! Après un long silence, je refais surface en vous proposant de découvrir un contrôle du dernier Silverlight for Windows Phone Toolkit. Si vous avez manqué cet évènement, vous pouvez aller de ce pas le télécharger sur codeplex, et jeter un coup d&#8217;oeil aux samples. Côté nouveauté, on a notamment ce fameux [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ashworks.fr/blog/wp-content/uploads/2011/08/list.png"><img src="http://ashworks.fr/blog/wp-content/uploads/2011/08/list.png" alt="LongListSelector" title="LongListSelector" width="314" height="532" class="aligncenter size-full wp-image-166" /></a>Bonjour à tous !<br />
Après un long silence, je refais surface en vous proposant de découvrir un contrôle du dernier Silverlight for Windows Phone Toolkit.</p>
<p>Si vous avez manqué cet évènement, vous pouvez aller de ce pas le télécharger sur <a href="http://silverlight.codeplex.com/">codeplex</a>, et jeter un coup d&#8217;oeil aux samples.</p>
<p>Côté nouveauté, on a notamment ce fameux LongListSelector, que vous connaissez certainement déjà. Il est vraiment propre à l&#8217;univers Windows Phone et vraiment appréciable côté utilisateur.</p>
<p>Pour mettre en place ce composant, nous aurons d&#8217;abord besoin d&#8217;une classe qui hérite de IEnumerable, qui nous permettra d&#8217;introduire une notion de groupe.<br />
C&#8217;est effectivement de ça qu&#8217;il s&#8217;agit : associer des éléments à un groupe.<br />
Celui qui m&#8217;intéressait était celui qu&#8217;on connait bien, le groupement par ordre alphabétique.</p>
<p>Nous allons d&#8217;abord créer cette classe, puis créer une méthode qui permet d&#8217;ajouter des objets à des groupes.<br />
Dans mon application, j&#8217;ai centralisé la classe et la méthode dans un Helper, une classe statique.</p>
<pre class="brush: csharp; title: ; notranslate">
public class Group&lt;T&gt; : IEnumerable&lt;T&gt;
    {
        public Group(string key, IEnumerable&lt;T&gt; items)
        {
            this.Key = key;
            this.Items = new List&lt;T&gt;(items);
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

        public override bool Equals(object obj)
        {
            Group&lt;T&gt; that = obj as Group&lt;T&gt;;

            return (that != null) &amp;&amp; (this.Title.Equals(that.Title));
        }

        public string Key
        {
            get;
            set;
        }

        public bool HasItems
        {
            get { if (Items.Count == 0) { return false; }else return true; }
        }

        public IList&lt;T&gt; Items
        {
            get;
            set;
        }

        #region IEnumerable&lt;T&gt; Members

        public IEnumerator&lt;T&gt; GetEnumerator()
        {
            return this.Items.GetEnumerator();
        }

        #endregion

        #region IEnumerable Members

        IEnumerator IEnumerable.GetEnumerator()
        {
            return this.Items.GetEnumerator();
        }

        #endregion
</pre>
<p>Si on regarde les paramètres du constructeur, on voit qu&#8217;on a une chaîne de caractère et une collection générique. La chaîne de caractère représente le nom du groupe, et la collection références tous les objets de ce groupe.<br />
En clair, un groupe &laquo;&nbsp;P&nbsp;&raquo; et une liste de fruits &laquo;&nbsp;Pomme&nbsp;&raquo;, &laquo;&nbsp;Poire&nbsp;&raquo;, &laquo;&nbsp;Pêche&nbsp;&raquo; par exemple.</p>
<p>Ensuite il faut pouvoir faire des groupes par ordre alphabétique, c&#8217;est là qu&#8217;intervient la méthode.</p>
<p>Imaginons des objets Fruit avec des propriétés string Nom, string Variété, DateTime DebutSaison et DateTime FinSaison.</p>
<pre class="brush: csharp; title: ; notranslate">
public static ObservableCollection&lt;Group&lt;Fruit&gt;&gt; CreateWidgetGroups(ObservableCollection&lt;Fruit&gt; fruits)
        {
            ObservableCollection&lt;Group&lt;Fruit&gt;&gt; groups = new ObservableCollection&lt;Group&lt;Fruit&gt;&gt;();
            string chars = &quot;#abcdefghijklmnopqrstuvwxyz&quot;;

            var source = from f in fruits
                         orderby f.Nom
                         select f;

            // On compare chaque caractère avec le premier de chaque objet de notre liste
            // si ils correspondent, on ajoute l'objet au groupe du caractère précédement créé
            foreach (char c in chars)
            {
                Group&lt;Widget&gt; group = new Group&lt;Fruit&gt;(c.ToString().ToLower(), new List&lt;Fruit&gt;());
                foreach (Fruit fruit in source)
                {
                    if (fruit.Nom.Substring(0, 1) == c.ToString() || fruit.om.Substring(0,1) == c.ToString().ToUpper())
                        group.Items.Add(widget);
                    // On centralise les chiffres dans le groupe #
                    else if (c.ToString() == &quot;#&quot;)
                    {
                        try
                        {
                            if ((Convert.ToInt32(fruit.Nom.Substring(0, 1)) &gt;= 0))
                            {
                                group.Items.Add(fruit);
                            }
                        }

                        catch (FormatException ex)
                        {
                            System.Diagnostics.Debug.WriteLine(ex.Message);
                        }
                    }

                }
                groups.Add(group);
            }
</pre>
<p>Voilà, nous avons une méthode capable de créer un groupe pour chaque lettre et d&#8217;y ajouter les objets concernés.</p>
<p>Maintenant, il reste encore à créer la vue !<br />
Imaginons que dans notre base de données, nous ayons aussi une illustration de chaque fruit stockée sous forme de chaîne de caractère.</p>
<p>Dans un premier temps, nous allons créer nos DataTemplate, qui servent à décrire la façon dont les données seront affichées.<br />
Rendons nous dans phone:PhoneApplicationPage.Resources pour les créer.</p>
<p>Le contrôle LongListSelector propose un large choix de DataTemplate, mais ici trois suffiront : l&#8217;ItemTemplate, le GroupHeaderTemplate et le GroupItemTemplate.</p>
<p>Le premier définit le bloc qui représente chaque fruit, ici une image et nos propriétés énumérées plus haut :</p>
<pre class="brush: xml; title: ; notranslate">
&lt;DataTemplate x:Key=&quot;itemTemplate&quot;&gt;
            &lt;Grid Margin=&quot;12,8,0,8&quot;&gt;
                &lt;Grid.ColumnDefinitions&gt;
                    &lt;ColumnDefinition Width=&quot;Auto&quot;/&gt;
                    &lt;ColumnDefinition Width=&quot;*&quot;/&gt;
                &lt;/Grid.ColumnDefinitions&gt;
                &lt;Image Height=&quot;62&quot; Width=&quot;62&quot; Source=&quot;{Binding Path=Image, Converter={StaticResource ImageConverter}}&quot;&gt;&lt;/Image&gt;
                &lt;StackPanel VerticalAlignment=&quot;Top&quot; Grid.Column=&quot;1&quot;&gt;
                    &lt;TextBlock Text=&quot;{Binding Nom}&quot; Style=&quot;{StaticResource PhoneTextLargeStyle}&quot;  /&gt;
                    &lt;TextBlock Text=&quot;{Binding Variete}&quot; Style=&quot;{StaticResource PhoneTextSmallStyle}&quot;/&gt;
                    &lt;StackPanel Orientation=&quot;Horizontal&quot;&gt;
                        &lt;TextBlock Text=&quot;Début de saison &quot;  Margin=&quot;12,3,5,0&quot; Style=&quot;{StaticResource PhoneTextSmallStyle}&quot;&gt;&lt;/TextBlock&gt;
                        &lt;TextBlock Text=&quot;{Binding DebutSaison}&quot;  Margin=&quot;0,3,0,0&quot; Style=&quot;{StaticResource PhoneTextSmallStyle}&quot;/&gt;
                    &lt;/StackPanel&gt;
                    &lt;StackPanel Orientation=&quot;Horizontal&quot;&gt;
                        &lt;TextBlock Text=&quot;Finde saison &quot;  Margin=&quot;12,3,5,0&quot; Style=&quot;{StaticResource PhoneTextSmallStyle}&quot;&gt;&lt;/TextBlock&gt;
                        &lt;TextBlock Text=&quot;{Binding FinSaison}&quot;  Margin=&quot;0,3,0,0&quot; Style=&quot;{StaticResource PhoneTextSmallStyle}&quot;/&gt;
                    &lt;/StackPanel&gt;
                &lt;/StackPanel&gt;
            &lt;/Grid&gt;
        &lt;/DataTemplate&gt;
</pre>
<p>Passons ensuite au GroupHeaderTemplate, qui définit le bloc qui affiche le nom du groupe en tête de chaque groupe :</p>
<pre class="brush: xml; title: ; notranslate">
 &lt;DataTemplate x:Key=&quot;groupHeaderTemplate&quot;&gt;
            &lt;Border Background=&quot;Transparent&quot; Margin=&quot;12,8,0,8&quot;&gt;
                &lt;Border Background=&quot;{StaticResource PhoneAccentBrush}&quot;
                                        Padding=&quot;8,0,0,0&quot; Width=&quot;62&quot; Height=&quot;62&quot;
                                        HorizontalAlignment=&quot;Left&quot;&gt;
                    &lt;TextBlock Text=&quot;{Binding Key}&quot;
                                               Foreground=&quot;#FFFFFF&quot;
                                               FontSize=&quot;{StaticResource PhoneFontSizeExtraLarge}&quot;
                                               HorizontalAlignment=&quot;Left&quot;
                                               VerticalAlignment=&quot;Bottom&quot;/&gt;
                &lt;/Border&gt;
            &lt;/Border&gt;
        &lt;/DataTemplate&gt;
</pre>
<p>Et enfin, passons au GroupItemTemplate, qui définit la manière dont sera affichée la liste des groupes quand on clique sur un &laquo;&nbsp;GroupHeader&nbsp;&raquo; [qu'on vient de définir plus haut !]</p>
<pre class="brush: xml; title: ; notranslate">
 &lt;DataTemplate x:Key=&quot;groupItemTemplate&quot;&gt;
            &lt;Border Width=&quot;99&quot; Height=&quot;99&quot; Margin=&quot;6&quot; toolkit:TiltEffect.IsTiltEnabled=&quot;True&quot; Background=&quot;{Binding HasItems, Converter={StaticResource BackgroundConverter}}&quot; IsHitTestVisible=&quot;{Binding HasItems}&quot;&gt;
                &lt;TextBlock Text=&quot;{Binding Key}&quot;
                          FontSize=&quot;{StaticResource PhoneFontSizeExtraLarge}&quot;
                           FontFamily=&quot;{StaticResource PhoneFontFamilySemiLight}&quot;
                                           Margin=&quot;8,0,0,0&quot;
                                           VerticalAlignment=&quot;Bottom&quot;
                           Foreground=&quot;{Binding HasItems, Converter={StaticResource ForegroundConverter}}&quot;
                           /&gt;
            &lt;/Border&gt;
        &lt;/DataTemplate&gt;
</pre>
<p>Je sais que vous avez l&#8217;oeil et que vous avez du coup remarqué la présence de Converters, et de cette propriété HasItems.<br />
Vous vous en doutez, il faut que le groupe soit cliquable uniquement quand il contient au moins un item, sans quoi il faut en informer visuellement l&#8217;utilisateur et empêcher le click.<br />
C&#8217;est à ça que sert la propriété IsHitTestVisible de Border.<br />
HasItems renvoit true si la collection contient plus de zéro élément.</p>
<p>Si vous ne savez pas vraiment utiliser les converters, je vais vous expliquer comment procéder.</p>
<p>Les converters s&#8217;utilisent en général lors des bindings, quand vous voulez &#8230;convertir [évidemment <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ] la valeur passé par le binding vers une autre.<br />
Ici, HasItems nous envoie un type Bool, et nous voulons selon sa valeur changer le Background ou Foreground, qui sont des types  SolidColorBrush.<br />
En faisant en binding sans converter de Background=&nbsp;&raquo;{Binding HasItems}&nbsp;&raquo;, ça plantera à coup sûr, ça revient à écrire Background = true, ou false.<br />
Du coup, nous allons passer par un converter, qui au moment du binding, va prendre notre valeur, et la &#8230;convertir [vous vous attendiez à quoi ? <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ] en un autre.</p>
<pre class="brush: csharp; title: ; notranslate">
public class BackgroundConverter:IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            bool hasItems = (bool)value;
            if (hasItems)
                return Application.Current.Resources[&quot;PhoneAccentBrush&quot;] as SolidColorBrush;
            else return Application.Current.Resources[&quot;PhoneBackgroundBrush&quot;] as SolidColorBrush;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            // Do something with exception
        }
    }
</pre>
<p>Voilà, notre HasItem nous retournera une SolidColorBrush qui nous permettra de donner un look &laquo;&nbsp;activé&nbsp;&raquo; ou &laquo;&nbsp;désactivé&nbsp;&raquo; à nos items <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ah aussi, pour ceux qui ne sont pas habitués aux ressources, il faut évidemment référencer ces converters, soit dans l&#8217;App.xaml, soit dans les ressources de la page (comme illustré ci-dessous)</p>
<pre class="brush: xml; title: ; notranslate">
xmlns:converters=&quot;clr-namespace:MonApplication.NamespaceDuConverter&quot;&gt;
&lt;phone:PhoneApplicationPage.Resources&gt;
&lt;converters:BackgroundConverter x:Key=&quot;BackgroundConverter&quot;&gt;&lt;/converters:BackgroundConverter&gt;
...
&lt;/phone:PhoneApplicationPage.Resources&gt;
</pre>
<p>Sans quoi, la ressource n&#8217;existerait pas <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://ashworks.fr/blog/?feed=rss2&amp;p=158</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les frame rate counters</title>
		<link>http://ashworks.fr/blog/?p=125</link>
		<comments>http://ashworks.fr/blog/?p=125#comments</comments>
		<pubDate>Tue, 15 Feb 2011 12:16:00 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[Counters]]></category>
		<category><![CDATA[Frame]]></category>
		<category><![CDATA[Rate]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://ashworks.fr/blog/?p=125</guid>
		<description><![CDATA[Pour peu que vous ayez déjà lancé l&#8217;émulataur de Visual Studio, ou mieux un device réel pendant le développement d&#8217;une application, vous avez sans doute remarqué la présence de compteurs sur le côté droit de l&#8217;écran. Ces compteurs sont en fait de très utiles indicateurs de performances, je vais en décrire seulement 3 ici pour [...]]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td>
<img src="http://i.msdn.microsoft.com/dynimg/IC468501.png" alt="frame_rate_counter" />
</td>
</tr>
<tr>
<td>
<br />
Pour peu que vous ayez déjà lancé l&#8217;émulataur de Visual Studio, ou mieux un device réel pendant le développement d&#8217;une application, vous avez sans doute remarqué la présence de compteurs sur le côté droit de l&#8217;écran.<br />
Ces compteurs sont en fait de très utiles indicateurs de performances, je vais en décrire seulement 3 ici pour le moment :</p>
<ul>
<li><strong>Le Compositor Thread counter</strong>(Render Thread) -> avec une valeur exprimée en FPS. Il prend en charge la plupart des animations, en-dessous de 30fps, le compteur vire au rouge. Il opère principalement avec le GPU et le cache bitmap</li>
<p></p>
<li><strong>L&#8217;UI Thread counter</strong> -> aussi exprimé en FPS, il est impacté par la création de composants, les composants recréés (changement de couleur, de marge ou de bordure par exemple). Il vous alertera en tombant sous les 15fps.</li>
<p></p>
<li><strong>Le Fill Rate counter</strong> -> Il mesure le travail effectué par le GPU, exprimé en terme d&#8217;écrans (1 = 480&#215;800). La valeur recommandée est d&#8217;environ 2.5, le compteur vire au rouge au-dessus de 3.</li>
<p>
</ul>
<p>Il est vraiment important de prêter une attention particulière à ces compteurs, pour fournir la meilleure expérience utilisateur possible, d&#8217;autant plus que Windows Phone 7 brille par sa fluidité. <br />
Nous verrons dans d&#8217;autres posts comment s&#8217;illustrent ces différents acteurs de performance dans la pratique, avec quelques &laquo;&nbsp;best-practices&nbsp;&raquo; si vous ne les connaissez pas déjà <img src='http://ashworks.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://ashworks.fr/blog/?feed=rss2&amp;p=125</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Afficher des icones selon le thème utilisé</title>
		<link>http://ashworks.fr/blog/?p=91</link>
		<comments>http://ashworks.fr/blog/?p=91#comments</comments>
		<pubDate>Mon, 10 Jan 2011 17:04:51 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://ashworks.fr/blog/?p=91</guid>
		<description><![CDATA[Il est très important de tester son application aussi bien sur le thème &#171;&#160;Dark&#160;&#187; que le thème &#171;&#160;Light&#160;&#187;, sans quoi cette dernière se verra recalée au moment de la certification ! Pour ceux qui ne savent pas, vous pouvez récupérer les icônes de l&#8217;Application Bar dans C:\Program Files\Microsoft SDKs\Windows Phone\v7.0\Icons, en thème &#171;&#160;Dark&#160;&#187; et &#171;&#160;Light&#160;&#187;. [...]]]></description>
			<content:encoded><![CDATA[<p>Il est très important de tester son application aussi bien sur le thème &laquo;&nbsp;Dark&nbsp;&raquo; que le thème &laquo;&nbsp;Light&nbsp;&raquo;, sans quoi cette dernière se verra recalée au moment de la certification !</p>
<p>Pour ceux qui ne savent pas, vous pouvez récupérer les icônes de l&#8217;Application Bar dans C:\Program Files\Microsoft SDKs\Windows Phone\v7.0\Icons, en thème &laquo;&nbsp;Dark&nbsp;&raquo; et &laquo;&nbsp;Light&nbsp;&raquo;.</p>
<p>L&#8217;Application Bar, elle, adaptera ses icônes au thème si vous utilisez les icônes du thème &laquo;&nbsp;Dark&nbsp;&raquo;. En revanche, si vous utilisez celles du thème &laquo;&nbsp;Light&nbsp;&raquo;, ou que vous utilisez ces icônes en dehors de l&#8217;Application Bar, ce ne sera pas le cas.</p>
<p>Pour pouvoir afficher des icônes en fonction du thème choisi, j&#8217;ai décidé de créer une fonction booléenne dans App.xaml.cs, qui me retourne vrai si le thème &laquo;&nbsp;Light&nbsp;&raquo; est le thème courant, faux dans le cas contraire.</p>
<pre class="brush: csharp; title: ; notranslate">
public bool LightThemeIsEnabled()
        {
            return (Visibility)Application.Current.Resources[&quot;PhoneLightThemeVisibility&quot;] == Visibility.Visible;
        }
</pre>
<p>Pour l&#8217;utiliser, il suffit ensuite d&#8217;ajouter une ligne :</p>
<pre class="brush: csharp; title: ; notranslate">
                myImage.Source = (App.Current as App).LightThemeIsEnabled() ? new BitmapImage(&quot;myIconLight&quot;) : new BitmapImage(&quot;myIconDark.png);
</pre>
<p>Pour ceux qui ne connaissent pas cette syntaxe, on peut la traduire par : maVariable = condition ? alors : sinon;</p>
<p>Voilà, cet article parle d&#8217;un détail, mais qui a vraiment son importance ^^</p>
<p>PS : ne pas oublier que l&#8217;ApplicationBar prendra des icônes sous forme de &laquo;&nbsp;Contenu&nbsp;&raquo;.</p>
]]></content:encoded>
			<wfw:commentRss>http://ashworks.fr/blog/?feed=rss2&amp;p=91</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convertir un type string en enum</title>
		<link>http://ashworks.fr/blog/?p=86</link>
		<comments>http://ashworks.fr/blog/?p=86#comments</comments>
		<pubDate>Mon, 20 Dec 2010 16:13:57 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://ashworks.fr/blog/?p=86</guid>
		<description><![CDATA[Voici une petite astuce que j&#8217;ai utilisée aujourd&#8217;hui, ce n&#8217;est pas grand chose, mais ça peut toujours servir ! Prenons l&#8217;exemple de DayOfWeek, qui énumère les jours de la semaine. Pour &#171;&#160;convertir&#160;&#187; un type string en DayOfWeek, nous allons utiliser une méthode statique de la classe Enum. Exemple : Et voilà =) J&#8217;avais dit que [...]]]></description>
			<content:encoded><![CDATA[<p>Voici une petite astuce que j&#8217;ai utilisée aujourd&#8217;hui, ce n&#8217;est pas grand chose, mais ça peut toujours servir !</p>
<p>Prenons l&#8217;exemple de DayOfWeek, qui énumère les jours de la semaine.<br />
Pour &laquo;&nbsp;convertir&nbsp;&raquo; un type string en DayOfWeek, nous allons utiliser une méthode statique de la classe Enum.</p>
<p><em>Exemple :</em></p>
<pre class="brush: csharp; title: ; notranslate">
string day = &quot;Monday&quot;
DayOfWeek dayOfWeek =
      (DayOfWeek)Enum.Parse(typeof(DayOfWeek), &quot;Monday&quot;, true);
</pre>
<p>Et voilà =)<br />
J&#8217;avais dit que c&#8217;était pas grand chose !</p>
]]></content:encoded>
			<wfw:commentRss>http://ashworks.fr/blog/?feed=rss2&amp;p=86</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lire un flux RSS avec Silverlight</title>
		<link>http://ashworks.fr/blog/?p=77</link>
		<comments>http://ashworks.fr/blog/?p=77#comments</comments>
		<pubDate>Mon, 22 Nov 2010 14:33:47 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://ashworks.fr/blog/?p=77</guid>
		<description><![CDATA[J&#8217;ai vu vraiment beaucoup de méthodes pour parvenir à lire un flux RSS avec Silverlight, mais étant &#171;&#160;partisan du moindre effort&#160;&#187;, j&#8217;aime utiliser la combinaison WebClient/SyndicationFeed, une manière simple et rapide d&#8217;y parvenir. Créer la classe Article Cette étape est &#8211; je pense &#8211; facultative : vous pouvez très bien garder un objet de type [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="RSS_icon" src="http://www.forex-floating.com/images/rss.png" title="RSS_icon" width="48" height="48" /></p>
<p>J&#8217;ai vu vraiment beaucoup de méthodes pour parvenir à lire un flux RSS avec Silverlight, mais étant &laquo;&nbsp;partisan du moindre effort&nbsp;&raquo;, j&#8217;aime utiliser la combinaison WebClient/SyndicationFeed, une manière simple et rapide d&#8217;y parvenir.</p>
<ol>
<li><b><u>Créer la classe Article</u></b></li>
<p> Cette étape est &#8211; je pense &#8211; facultative : vous pouvez très bien garder  un objet de type SyndicationItem et faire votre propre truc avec.</p>
<p>En tout cas, voici la classe en question, volontairement très restreinte et très simple.</p>
<pre class="brush: csharp; title: ; notranslate">
 public class Article
    {
        private string _titre;
        private string _lien;
        private string _contenu;

        public string Contenu
        {
            get { return _contenu; }
            set { _contenu = value; }
        }

        public Article()
        {
        }

        public string Lien
        {
            get { return _lien; }
            set { _lien = value; }
        }

        public string Titre
        {
            get { return _titre; }
            set { _titre = value; }
        }
    }
</pre>
<li><b><u>Le WebClient</u></b></li>
<p>Pour utiliser un flux RSS, nous allons utiliser la classe WebClient, en nous intéressant particulièrement à l&#8217;évènement OpenReadCompleted et la méthode OpenReadAsync.</p>
<p>L&#8217;évènement OpenReadCompleted se produit quand la lecture asynchrone du flux est terminée, alors que la méthode OpenReadAsync permet justement d&#8217;ouvrir un flux à partir d&#8217;une uri passée en paramètre.</p>
<p>On peut donc déjà créer la méthode ReadRSS(), par exemple en utilisant le flux RSS de ce blog =) </p>
<pre class="brush: csharp; title: ; notranslate">
public void ReadRSS()
        {
            WebClient client = new WebClient();
            client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
            Uri uri = new Uri(&quot;http://ashworks.fr/blog/?feed=rss2&quot;, UriKind.Absolute);
            client.OpenReadAsync(uri);
        }
</pre>
<p>Pour ceux qui ne connaissent pas vraiment les raccourcis de Visual Studio, après avoir écrit client.OpenReadCompleted, en appuyant deux fois sur tab, le gestionnaire d&#8217;évènement sera créé automatiquement.</p>
<li><b><u>La classe SyndicationFeed</u></b></li>
<p>Avant toute chose, vous devez ajouter l&#8217;assembly System.ServiceModel.Syndication.dll, qui se trouve dans Program Files\MicrosoftSDKs\Silverlight\v4.0\Libraries\Client. Notez qu&#8217;elle est aussi présente dans la v3.0.</p>
<p>Il faut ensuite ajouter le namespace System.ServiceModel.Syndication à votre fichier.</p>
<p>A ce moment du code, il faudra écrire la logique du gestionnaire d&#8217;évènement fraîchement créé.<br />
C&#8217;est ici qu&#8217;intervient notre classe SyndicationFeed, qui permet &#8211; selon moi &#8211; de simplifier un maximum la récupération des données du flux.<br />
On utilise une liste d&#8217;objet Article, un XmlReader qui prendra en paramètre le résultat de OpenReadCompletedEventArgs, qui est notre flux sous forme de stream (ça sonne redondant hein). Ce même XmlReader passera en paramètre de la méthode Load de notre SyndicationFeed.</p>
<p>Ensuite, nous avons accès à une liste de SyndicationItems, qui représentes toutes vos entrées dans le flux (dans notre cas, les articles de ce blog), avec des propriétés très claires comme le titre, une liste de liens, le contenu (même si pour celui-ci, il faudra fouiller un peu comme dans le code ci-dessous), etc&#8230;</p>
<pre class="brush: csharp; title: ; notranslate">
 void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            List&lt;Article&gt; articles;
            XmlReader rssReader = XmlReader.Create(e.Result);
            SyndicationFeed feed = SyndicationFeed.Load(rssReader);

            articles = (from article in feed.Items
                       select new Article
                       {
                           Titre = article.Title.Text,
                           Lien = article.Links.First().Uri.ToString(),
                           Content = article.ElementExtensions[2].GetObject&lt;XElement&gt;().Value.ToString()
                       }).ToList();
        }
</pre>
<p>A vous de voir comment vous voulez utiliser cette liste, mais en mettant un point d&#8217;arrêt dans la boucle, vous verrez qu&#8217;elle se charge effectivement avec le contenu du flux !</p>
<li><b><u>Conclusion</u></b></li>
<p>Voilà, c&#8217;est tout ! Voyez qu&#8217;il est vraiment très simple d&#8217;utiliser les flux RSS avec Silverlight, et ça marche très bien aussi sous Windows Phone 7.<br />
D&#8217;ailleurs, si tout ce passe bien, un lecteur RSS de base de ce blog sera disponible sur le MarketPlace (avec un design et des fonctionnalités vraiment minables, mais c&#8217;est une question de temps et son but est juste de valider mon compte étudiant sur l&#8217;AppHub ^^)
</ol>
]]></content:encoded>
			<wfw:commentRss>http://ashworks.fr/blog/?feed=rss2&amp;p=77</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

