<?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>Rudy Huyn</title>
	<atom:link href="http://www.rudyhuyn.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rudyhuyn.com/blog</link>
	<description>*true* Windows Phone addict</description>
	<lastBuildDate>Thu, 23 May 2013 11:35:59 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
	<!-- Wordpres Counter -->
	<item>
		<title>How to launch the official youtube app from your app</title>
		<link>http://www.rudyhuyn.com/blog/2013/05/23/how-to-launch-the-official-youtube-app-from-your-app/</link>
		<comments>http://www.rudyhuyn.com/blog/2013/05/23/how-to-launch-the-official-youtube-app-from-your-app/#comments</comments>
		<pubDate>Thu, 23 May 2013 11:33:26 +0000</pubDate>
		<dc:creator>rudyhuyn</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.rudyhuyn.com/blog/?p=1745</guid>
		<description><![CDATA[&#160; Since this morning, &#8216;metro tube&#8217; developers enable third-party developers to use their app to play youtube video instead of embed a custom youtube player in their applications. http://lazywormapps.com/metrotube-URI-schema.html This is cool, but personally, I won&#8217;t do that, cause I &#8230; <a href="http://www.rudyhuyn.com/blog/2013/05/23/how-to-launch-the-official-youtube-app-from-your-app/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<p><a href="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/05/YouTube1.png"><img alt="YouTube" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/05/YouTube1-1024x408.png" width="584" height="232" /></a></p>
<div>Since this morning, &lsquo;metro tube&rsquo; developers enable third-party developers to use their app to play youtube video instead of embed a custom youtube player in their applications.</div>
<p>http://lazywormapps.com/metrotube-URI-schema.html</p>
<p>This is cool, but personally, I won&rsquo;t do that, cause I trust only the official player for several reasons:</p>
<ul>
<li>It&rsquo;s supported by Microsoft, more stable and less risky, &lsquo;Metro tube&rsquo; using a hack to retrieve Urls of the mp4 video, it happened several times in the past that the application no longer works for days, a good way to have negative comments in your own application.</li>
<li>There is a risk that the application be removed by Youtube for non-compliance with the youtube TOS</li>
<li>Metro tube is a paid application, I do not want to impose this on my users.</li>
<li>Other apps can use the same protocol extension and can be crappy</li>
</ul>
<div>The question now is:</div>
<div></div>
<h1>How to launch the official player?</h1>
<p>For this, you only need to use the protocol extension of the official application: <strong>vnd.youtube</strong>.</p>
<p>So create a launcher et use the youtube video id as a parameter.</p>
<p>For example, the video id of <a href="http://www.youtube.com/watch?v=9bZkp7q19f0">http://www.youtube.com/watch?v=9bZkp7q19f0</a> is &rsquo;9bZkp7q19f0&prime; :</p>
<pre>

Windows.System.Launcher.LaunchUriAsync(

new System.Uri("vnd.youtube:9bZkp7q19f0")

);

</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.rudyhuyn.com/blog/2013/05/23/how-to-launch-the-official-youtube-app-from-your-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Commencer lancer le player officiel Youtube depuis son application ?</title>
		<link>http://www.rudyhuyn.com/blog/2013/05/23/commencer-lancer-le-player-officiel-youtube-depuis-son-application/</link>
		<comments>http://www.rudyhuyn.com/blog/2013/05/23/commencer-lancer-le-player-officiel-youtube-depuis-son-application/#comments</comments>
		<pubDate>Thu, 23 May 2013 11:24:34 +0000</pubDate>
		<dc:creator>rudyhuyn</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.rudyhuyn.com/blog/?p=1739</guid>
		<description><![CDATA[&#160; Les développeurs de l&#8217;application Metro tube font actuellement la promo de leur app en proposant aux développeurs tierces d&#8217;utiliser le protocole d&#8217;extension pour lancer leurs apps au lien d&#8217;intégrer un player youtube directement dans son application. http://lazywormapps.com/metrotube-uri-schema.html La chose &#8230; <a href="http://www.rudyhuyn.com/blog/2013/05/23/commencer-lancer-le-player-officiel-youtube-depuis-son-application/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<p><a href="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/05/YouTube1.png"><img class="alignnone size-large wp-image-1741" alt="YouTube" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/05/YouTube1-1024x408.png" width="584" height="232" /></a></p>
<p>Les développeurs de l&rsquo;application Metro tube font actuellement la promo de leur app en proposant aux développeurs tierces d&rsquo;utiliser le protocole d&rsquo;extension pour lancer leurs apps au lien d&rsquo;intégrer un player youtube directement dans son application.</p>
<p><a href="http://lazywormapps.com/metrotube-uri-schema.html">http://lazywormapps.com/metrotube-uri-schema.html</a></p>
<p>La chose est louable, mais personnellement, je ne ferais confiance qu&rsquo;au player officiel pour plusieurs raisons :</p>
<ul>
<li>Il est supporté par Microsoft, donc beaucoup plus stable, Metro tube utilisant un hack pour récupérer les uri des vidéos, il est arrivé plusieurs fois dans le passé que l&rsquo;application ne fonctionne plus pendant des jours, un bon moyen pour avoir des commentaires négatifs dans sa propre application sans en être la case</li>
<li>Un risque existe que l&rsquo;application soit retiré du jour au lendemain du Store pour non respect des TOS de youtube</li>
<li>Metro tube est une application payante, je ne souhaite pas imposer cela à mes utilisateurs.</li>
<li>N&rsquo;importe quel autre app peut se brancher sur le même protocole que metro tube et avoir une qualité bcp moindre</li>
</ul>
<p>La question maintenant est :</p>
<h1>Comment lancer le player officiel ?</h1>
<p>Pour cela, il suffit d&rsquo;utiliser le protocole d&rsquo;extension réservé à l&rsquo;application officielle youtube : <strong>vnd.youtube</strong>.</p>
<p>Créez juste un launcher et passez en paramètre l&rsquo;identifiant de votre vidéo youtube.</p>
<p>Par exemple, pour la vidéo <a href="http://www.youtube.com/watch?v=9bZkp7q19f0">http://www.youtube.com/watch?v=9bZkp7q19f0</a>, son id est 9bZkp7q19f0 et on peut la lancer en écrivant :</p>
<pre>

Windows.System.Launcher.LaunchUriAsync(

new System.Uri("vnd.youtube:9bZkp7q19f0")

);

</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.rudyhuyn.com/blog/2013/05/23/commencer-lancer-le-player-officiel-youtube-depuis-son-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jouons avec le webbrowser</title>
		<link>http://www.rudyhuyn.com/blog/2013/05/19/jouons-avec-le-webbrowser/</link>
		<comments>http://www.rudyhuyn.com/blog/2013/05/19/jouons-avec-le-webbrowser/#comments</comments>
		<pubDate>Sun, 19 May 2013 10:58:45 +0000</pubDate>
		<dc:creator>rudyhuyn</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.rudyhuyn.com/blog/?p=1736</guid>
		<description><![CDATA[Dans la communauté développeurs Windows Phone, je reçois régulièrement des questions sur le webbrowser. Ce mini article va mettre en avant quelques fonctionnalités cachées du webbrowser en passant notammment par la classe d&#8217;extension WebBrowserExtensions. WebBrowserExtensions contient 3 méthodes qui rendraient &#8230; <a href="http://www.rudyhuyn.com/blog/2013/05/19/jouons-avec-le-webbrowser/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Dans la communauté développeurs Windows Phone, je reçois régulièrement des questions sur le webbrowser.</p>
<p>Ce mini article va mettre en avant quelques fonctionnalités cachées du webbrowser en passant notammment par la classe d&rsquo;extension WebBrowserExtensions.</p>
<p>WebBrowserExtensions contient 3 méthodes qui rendraient jaloux tous les développeurs Windows 8</p>
<p>&nbsp;</p>
<p><img class="alignnone" alt="" src="http://www.digitaljournal.com/img/6/3/7/5/4/i/1/1/9/o/Cookiemonster2_FB.jpg" width="960" height="642" /></p>
<h1><span style="line-height: 15px;">GetCookies </span></h1>
<p>Cette méthode permet de récupérer les cookies d&rsquo;un contrôle browser de votre application. Il vous sera impossible de récupérer les cookies de l&rsquo;application &laquo;&nbsp;Internet Explorer&nbsp;&raquo; du téléphone, votre application et l&rsquo;application Internet Explorer étant toutes les deux sandboxées. Même s&rsquo;il faut passer un webbrowser en paramètre, les cookies sont gérées de façon globale dans votre application. Il sera impossible de récupérer les cookies http only via cette méthode.</p>
<h1>ClearCookiesAsync</h1>
<p>Cette méthode va vous permettre d&rsquo;effacer les cookies, c&rsquo;est l&rsquo;antagonisme de la première, elle permet d&rsquo;effacer l&rsquo;ensemble des cookies de votre application. A noter, c&rsquo;est un tout ou rien, impossible de supprimer qu&rsquo;une partie des cookies.</p>
<h1>ClearInternetCacheAsync</h1>
<p>La dernière et non des moindres va vous permettre de supprimer l&rsquo;ensemble du cache http de votre application, celui-ci étant utilisé quand une page/un script/une image est retournée avec l&rsquo;attribut cache-control. Comme ClearCookiesAsync, c&rsquo;est tout ou rien, attention donc.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rudyhuyn.com/blog/2013/05/19/jouons-avec-le-webbrowser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lister les applications installées de l&#8217;auteur sur le téléphone, les lancer, etc&#8230;</title>
		<link>http://www.rudyhuyn.com/blog/2013/04/01/lister-les-applications-installes-de-lauteur-sur-le-telephone-de-lutilisateur-les-lancer-etc/</link>
		<comments>http://www.rudyhuyn.com/blog/2013/04/01/lister-les-applications-installes-de-lauteur-sur-le-telephone-de-lutilisateur-les-lancer-etc/#comments</comments>
		<pubDate>Mon, 01 Apr 2013 22:41:52 +0000</pubDate>
		<dc:creator>rudyhuyn</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.rudyhuyn.com/blog/?p=1718</guid>
		<description><![CDATA[Comme souvent, je me balade sur  MSDN à la recherche d&#8217;un morceau de l&#8217;API pas encore explorée. Ce soir, à force de cliquer sur des liens, je suis tombé sur une petite pépite assez intéressante donc autant la partager donc &#8230; <a href="http://www.rudyhuyn.com/blog/2013/04/01/lister-les-applications-installes-de-lauteur-sur-le-telephone-de-lutilisateur-les-lancer-etc/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Comme souvent, je me balade sur  MSDN à la recherche d&rsquo;un morceau de l&rsquo;API pas encore explorée. Ce soir, à force de cliquer sur des liens, je suis tombé sur une petite pépite assez intéressante donc autant la partager donc !</p>
<p>Saviez-vous que depuis Windows Phone 8, il est possible de récupérer la liste de vos applications que l&rsquo;utilisateur possède sur son téléphone ? Maintenant oui, et plus fort il est possible d&rsquo;avoir aussi des informations afin de savoir si l&rsquo;application est en cours d&rsquo;installation ou déjà installée et encore mieux ! Vous pourrez récupérer la date d&rsquo;installation de l&rsquo;application ou encore le numéro de version et même l&rsquo;icone de l&rsquo;app : MAGIQUE !</p>
<p>Et le meilleur pour la fin : vous avez la possibilité de lancer l&rsquo;application sans recourir à l&rsquo;extension de protocole !!!!</p>
<h1>Lister les applications de l&rsquo;auteur sur le téléphone</h1>
<p>Cela se fait très simplement :</p>
<pre>
foreach(var package in InstallationManager.FindPackagesForCurrentPublisher())
{
MessageBox.Show(package.InstallDate + " " + package.Id.Name);

}

</pre>
<h1>Rechercher une application</h1>
<pre>

Package SearchApp(String productId)
{
return InstallationManager.FindPackagesForCurrentPublisher().FirstOrDefault(app =&gt; app.Id.ProductId == productId);
}

</pre>
<h1>Lancer une application</h1>
<pre>

{

var package=SearchApp("{91000C5C-9943-43B7-AB65-7609D91057EF}");
package.Launch();

}

</pre>
<p>Allons encore un peu plus loin, on sait maintenant lancer une application, maintenant voyons comment lancer une page bien précise de votre application !</p>
<h1>lancer une page spécifique d&rsquo;une application</h1>
<pre>

{

var package=SearchApp("{91000C5C-9943-43B7-AB65-7609D91057EF}");
package.Launch("/AboutPage.xaml);

}

</pre>
<p>On a donc une possibilité de manipulation assez extraordinaire ! En plus de spécifier la page, vous pouvez aussi spécifier des paramètres comme par exemple :</p>
<pre>

{

var package=SearchApp("{91000C5C-9943-43B7-AB65-7609D91057EF}");
package.Launch("/FluxRSSPage.xaml?uri=rudyhuyn.com");

}

</pre>
<h1>Récupérer l&rsquo;icône de l&rsquo;application</h1>
<pre>

{

var package=SearchApp("{91000C5C-9943-43B7-AB65-7609D91057EF}");

var token = package.GetThumbnailToken();

var name = SharedStorageAccessManager.GetSharedFileName(token);

await SharedStorageAccessManager.CopySharedFileAsync(ApplicationData.Current.LocalFolder, name, NameCollisionOption.ReplaceExisting, token);

using (var file = IsolatedStorageFile.GetUserStoreForApplication().OpenFile(name, FileMode.Open, FileAccess.Read))
{
BitmapImage bitmap = new BitmapImage();
bitmap.SetSource(file);
MonImage.Source = bitmap;
}

}

</pre>
<h1>Et comment faire fonctionner ceci quand mon application n&rsquo;est pas sur le store ?</h1>
<p>En effet, il y a de grandes chances que votre publisher Id de vos application ne correspond pas avec votre publisher id du Store.</p>
<p>Lorsque vous soumettez une application, le Store remplace automatiquement le publisher id de vos apps par celui du store, nous allons donc tout simplement remplacer le publisher ID que visual studio a généré par le votre, pour cela commencez par le récupérer sur la page suivante :</p>
<p><a href="https://dev.windowsphone.com/en-us/account">https://dev.windowsphone.com/en-us/account</a></p>
<p><a href="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/04/Capture2.jpg"><img class="alignnone size-full wp-image-1719" alt="Capture2" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/04/Capture2.jpg" width="403" height="400" /></a></p>
<p>&nbsp;</p>
<p>puis ouvrez le fichier WMAppManifest.xml de votre application, allez dans l&rsquo;onglet Packaging et remplacez le Publisher Id par le votre (en n&rsquo;oubliant pas les accolades)</p>
<p>&nbsp;</p>
<p><a href="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/04/Capture.jpg"><img class="alignnone size-full wp-image-1720" alt="Capture" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/04/Capture.jpg" width="992" height="439" /></a></p>
<p>&nbsp;</p>
<p>Vous aurez maintenant la possibilité de lister vos autres applications provenant du store.</p>
<p>&nbsp;</p>
<h1>Puis je lancer une application ne m&rsquo;appartenant pas ?</h1>
<p>Non, pour des raisons évidente de sécurité !</p>
<h1>Conclusion</h1>
<p>Énormément de scénario peuvent découler de ces APIs, quelques exemples en vrac :</p>
<p>- permettre l&rsquo;accès à des fonctionnalités uniquement si l&rsquo;utilisateur possède une autre de vos apps</p>
<p>- afficher un message de remerciement : &laquo;&nbsp;vous utilisez 4 de nos applications, merci beaucoup, voulez-vous découvrir nos autres applications ?&nbsp;&raquo;</p>
<p>- permettre le lancement d&rsquo;une de vos apps sans exposer publiquement une extension de protocole, vous sécurisez ainsi les communications</p>
<p>- avoir des pages cachées dans vos applications, uniquement accessible depuis une autre de vos apps</p>
<p>- etc&#8230;</p>
<p><a href="wikipedia:windows phone">ff</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rudyhuyn.com/blog/2013/04/01/lister-les-applications-installes-de-lauteur-sur-le-telephone-de-lutilisateur-les-lancer-etc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rendre vos pages dynamiques en injectant du XAML !</title>
		<link>http://www.rudyhuyn.com/blog/2013/03/30/rendre-vos-pages-dynamiques-en-injectant-du-xaml/</link>
		<comments>http://www.rudyhuyn.com/blog/2013/03/30/rendre-vos-pages-dynamiques-en-injectant-du-xaml/#comments</comments>
		<pubDate>Sat, 30 Mar 2013 10:36:02 +0000</pubDate>
		<dc:creator>rudyhuyn</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.rudyhuyn.com/blog/?p=1705</guid>
		<description><![CDATA[Si vous utilisez mon application Wikipedia, vous avez surement remarqué que la partie supérieure de la page d&#8217;accueil varie avec le temps. Quelques exemples : &#160; Invitation à lancer un webbrowser pour participer à un concours Ouvre le Windows Phone &#8230; <a href="http://www.rudyhuyn.com/blog/2013/03/30/rendre-vos-pages-dynamiques-en-injectant-du-xaml/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Si vous utilisez mon application Wikipedia, vous avez surement remarqué que la partie supérieure de la page d&rsquo;accueil varie avec le temps. Quelques exemples :</p>
<p>&nbsp;</p>
<p>Invitation à lancer un webbrowser pour participer à un concours<br />
<a href="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/03/wp_ss_20130330_0001.png"><img class="alignnone  wp-image-1706" alt="wp_ss_20130330_0001" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/03/wp_ss_20130330_0001.png" width="350" height="584" /></a></p>
<p>Ouvre le Windows Phone Store pour télécharger une application<br />
<a href="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/03/wp_ss_20130330_0002.png"><img class="alignnone  wp-image-1707" alt="wp_ss_20130330_0002" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/03/wp_ss_20130330_0002-614x1024.png" width="350" height="584" /></a></p>
<p>Pour cela la technique est assez simple, à chaque démarrage, l&rsquo;application fait une requête sur mon serveur en passant sa culture (anglais, français, etc&#8230;), et récupère des variables : image url, texte descriptif et le lien.</p>
<p>Selon le type du lien, je lance alors : une page interne de l&rsquo;application (pour faire découvrir un article bien précis, pour faire découvrir les settings, etc&#8230;), un lien internet via un WebBrowserTask ou une page du Windows Phone Store via un MarketplaceDetailTask.</p>
<p>Toutefois, la mise en forme reste assez statique et pour la prochaine version je veux aller en plus en injectant directement du XAML dans la page ! On pourra alors imaginer avoir des animations spécifiques, des sliders, etc&#8230;</p>
<h1>Comment le faire ?</h1>
<p>C&rsquo;est très très simple, il suffit en fait d&rsquo;utiliser un XamlReader, et notamment  sa méthode Load qui va permettre de lire du code xaml depuis une string et de générer les différents objets XAML.</p>
<p>Dans l&rsquo;exemple suivant, nous allons appeler une page php qui va nous fournir du code xaml selon notre culture. Nous donnerons le résultat de cette requête au XamlReader et nous afficherons le résultat dans un panel XAML nommé CommentPanel.</p>
<pre>
WebClient web = new WebClient();
web.DownloadStringCompleted += (sender, e) =&gt;{
try
{
var xaml = XamlReader.Load(e.Result);
CommentPanel.Content = xaml;
}
catch
{
}

};
web.DownloadStringAsync(new Uri(uri+"?culture="+CultureInfo.CurrentUICulture.TwoLetterISOLanguageName,UriKind.Absolute));

</pre>
<p>et du côté PHP :</p>
<pre>

&lt;?php
$culture=$_GET['culture'];
if($culture=='fr'){
?&gt;

&lt;StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt;
&lt;Button Content="Click Me" /&gt;
&lt;Slider Minimum="0" Maximum="100" /&gt;
&lt;/StackPanel&gt;
&lt;?php }else
{
?&gt;
&lt;Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Background="Red" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt;
&lt;TextBox /&gt;
&lt;/Grid&gt;
&lt;?php } ?&gt;

</pre>
<p>Et ça fonctionne !!</p>
<p><a href="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/03/wp_ss_20130330_0003.png"><img class="alignnone  wp-image-1708" alt="wp_ss_20130330_0003" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/03/wp_ss_20130330_0003-614x1024.png" width="350" height="584" /></a></p>
<p>A noter : pensez bien à définir les namespaces sans oublier le namespace par défaut, sinon vous recevrez une exception pendant le chargement du XAML.</p>
<p>&nbsp;</p>
<h1>Comment rendre ceci interactif ?</h1>
<p>Il n&rsquo;est pas possible en effet d&rsquo;inclure du code-behind dans cette injection afin d’interagir avec les nouveaux éléments XAML (par exemple afficher une page web quand on clique sur un bouton ou lancer une animation), il y a plusieurs solutions.</p>
<p>Pour afficher une page web ou une page interne de votre application, vous pouvez vous reposer sur les spécificités du contrôle HyperlinkButton par exemple :</p>
<pre>

&lt;HyperlinkButton NavigateUri="http://www.bing.com" /&gt;

</pre>
<p>Une autre solution est de binding vos contrôles à des commandes, en effet, il n&rsquo;est pas possible de se lier à des event handlers directement comme : </p>
<pre>
&lt;Button Click=&quot;ClickAction&quot; /&gt;
</pre>
<h1>Binding ?</h1>
<p>Les bindings fonctionnent évidemment ! Vous pouvez écrire sans soucis :</p>
<pre>
&lt;Button Content=&quot;{Binding MyTitle}&quot; /&gt;
</pre>
<p>Toutefois, vous ne pourrez faire référence à des éléments de votre page dans vos bindings (mais vous pouvez référer des éléments de votre XAML dynamique.</p>
<h1>Note</h1>
<p>Evidemment, vous ne pouvez pas injecté tout et n&rsquo;importe quoi, il va falloir faire attention à quelles assemblies vous faites appellent et les capabilities de vos applications. Par exemple, pour inclure dynamiquement une pub PubCenter dans votre app, il va falloir que celle-ci contienne déjà une référence à la librairie PubCenter et que vous disposez de toutes les capabilities nécessaire à l&rsquo;exécution de ce contrôle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rudyhuyn.com/blog/2013/03/30/rendre-vos-pages-dynamiques-en-injectant-du-xaml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WP8] Binder une collection sur une Map ! 2 le retour</title>
		<link>http://www.rudyhuyn.com/blog/2013/03/19/wp8-binder-une-collection-sur-une-map-2-le-retour/</link>
		<comments>http://www.rudyhuyn.com/blog/2013/03/19/wp8-binder-une-collection-sur-une-map-2-le-retour/#comments</comments>
		<pubDate>Tue, 19 Mar 2013 12:52:49 +0000</pubDate>
		<dc:creator>rudyhuyn</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.rudyhuyn.com/blog/?p=1691</guid>
		<description><![CDATA[Cet article fait suite non pas à un de mes articles mais à un article d&#8217;un copain Julien Lo Presti :  MSP, expert Windows Phone et breton, trois bons points ! (et accessoirement un bon copain et partenaire de hackathon). &#8230; <a href="http://www.rudyhuyn.com/blog/2013/03/19/wp8-binder-une-collection-sur-une-map-2-le-retour/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Cet article fait suite non pas à un de mes articles mais à un article d&rsquo;un copain<strong> Julien Lo Presti : </strong> MSP, expert Windows Phone et breton, trois bons points ! (et accessoirement un bon copain et partenaire de hackathon). Il a notamment développé l&rsquo;application <a title="Stinson Book" href="http://www.windowsphone.com/fr-fr/store/app/stinson-book/6921941f-b630-4416-a10c-4e462f852654">Stinson Book</a></p>
<p>Sur son blog Julien propose une solution à un problème assez gênant : l&rsquo;impossibilité de binder avec un MapItemsControl du toolkit. Pour parer à cela, Julien proposer une solution astucieuse avec un Behavior : classe !</p>
<p>Lire son article ici :</p>
<p><a href="http://jlopresti.fr/post/2013/03/19/WP8-Binder-une-collection-sur-une-Map-!">http://jlopresti.fr/post/2013/03/19/WP8-Binder-une-collection-sur-une-Map-!</a></p>
<p><a href="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/03/Untitled-1.png"><img class="alignnone size-full wp-image-1692" alt="Untitled-1" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/03/Untitled-1.png" width="470" height="329" /></a></p>
<p>&nbsp;</p>
<p>Entre bretons, on aime se chamailler, on considère que cela nous fait progresser et il se trouve que pour Wikipedia WP8 (qui va bientôt arriver dès que je trouverais quelques heures) j&rsquo;avais rencontré la même problématique et j&rsquo;avais contourné cette problématique non pas un behavior mais une propriété d&rsquo;extensions.</p>
<h1>Ma solution</h1>
<pre>
    public class MapTools : DependencyObject
    {
        [SuppressMessage(&quot;Microsoft.Design&quot;, &quot;CA1062:Validate arguments of public methods&quot;, MessageId = &quot;0&quot;, Justification = &quot;Standard pattern.&quot;)]
        public static bool GetMapItemsSource(DependencyObject source)
        {
            return (bool)source.GetValue(MapItemsSourceProperty);
        }


        [SuppressMessage(&quot;Microsoft.Design&quot;, &quot;CA1062:Validate arguments of public methods&quot;, MessageId = &quot;0&quot;, Justification = &quot;Standard pattern.&quot;)]
        public static void SetMapItemsSource(DependencyObject source, IEnumerable value)
        {
            source.SetValue(MapItemsSourceProperty, value);
        }

        // Using a DependencyProperty as the backing store for MapItemsSource.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MapItemsSourceProperty =
            DependencyProperty.Register(&quot;MapItemsSource&quot;, typeof(IEnumerable), typeof(Map), new PropertyMetadata(null, MapItemsSourceChanged));

        private static void MapItemsSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var map = ((Map)sender);
            var itemsControl = MapExtensions.GetChildren(map).OfType&lt;MapItemsControl&gt;().FirstOrDefault();
            if (itemsControl != null)
            {
                itemsControl.ItemsSource = (IEnumerable)e.NewValue;
            }
        }
    }
</pre>
<p>et pour l&rsquo;utiliser :</p>
<pre>

&lt;maps:Map x:Name="Map" huynmap:MapTools.MapItemsSource="{Binding MyPlaces}" HorizontalAlignment="Stretch" ZoomLevel="15"&gt;
&lt;toolkit:MapExtensions.Children&gt;
&lt;toolkit:MapItemsControl &gt;
&lt;toolkit:MapItemsControl.ItemTemplate&gt;
&lt;DataTemplate&gt;
&lt;toolkit:Pushpin .../&gt;
&lt;/DataTemplate&gt;
&lt;/toolkit:MapItemsControl.ItemTemplate&gt;
&lt;/toolkit:MapItemsControl&gt;
&lt;/toolkit:MapExtensions.Children&gt;
&lt;/maps:Map&gt;

</pre>
<h1>Conclusion</h1>
<p>Les deux solutions sont au final équivalente et utilisent les mêmes principes : se brancher au FrameworkElement Map, qui est le dernier élément à avoir accès au DataContext et gérer le MapItemsControl depuis ce point.</p>
<p>La différence est surtout que le Behavior est plus facilement exploitable sous Blend en WYSIWYG alors que la propriété d&rsquo;extension elle à l&rsquo;avantage de ne pas tirer des dépendances de librairies liées à Blend. On pourra toutefois espérer avec de meilleur performance au chargement pour la propriété d&rsquo;extension (pas de dll à charger, moins complexe).</p>
<p>&nbsp;</p>
<p>Merci Likeman</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rudyhuyn.com/blog/2013/03/19/wp8-binder-une-collection-sur-une-map-2-le-retour/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Attention aux singletons statiques</title>
		<link>http://www.rudyhuyn.com/blog/2013/03/08/attention-aux-singletons-statiques/</link>
		<comments>http://www.rudyhuyn.com/blog/2013/03/08/attention-aux-singletons-statiques/#comments</comments>
		<pubDate>Fri, 08 Mar 2013 11:33:21 +0000</pubDate>
		<dc:creator>rudyhuyn</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.rudyhuyn.com/blog/?p=1681</guid>
		<description><![CDATA[Pour créer une classe singleton, il existe plusieurs méthodes, la plus simple étant d&#8217;avoir une propriété statique couplée à un constructeur statique dans la classe comme ceci : public class Datas { static Datas() { Instance = new Datas(); } &#8230; <a href="http://www.rudyhuyn.com/blog/2013/03/08/attention-aux-singletons-statiques/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pour créer une classe singleton, il existe plusieurs méthodes, la plus simple étant d&rsquo;avoir une propriété statique couplée à un constructeur statique dans la classe comme ceci :</p>
<pre>
public class Datas
{

static Datas()
{
Instance = new Datas();
}
public static Datas Instance { get; set; }
}
</pre>
<p>Simple et efficace ! Enfin presque, car couplé à l&rsquo;IsolatedStorageSettings cela peut mener à une catastrophe.</p>
<p>Voici un exemple de code :</p>
<pre>
public class Datas
{
static Datas()
{
if (IsolatedStorageSettings.ApplicationSettings.Contains("Data"))
{
Instance = IsolatedStorageSettings.ApplicationSettings["Data"] as Datas;
if (Instance != null)
return;
}
Instance = new Datas();

}

public void Save()
{
IsolatedStorageSettings.ApplicationSettings["Data"] = this;
IsolatedStorageSettings.ApplicationSettings.Save();
}

public String Login { get; set; }
public DateTime LastUpdate { get; set; }

[XmlIgnore]
public static Datas Instance { get; set; }
}
</pre>
<p>&nbsp;</p>
<p>De toute évidence ce code fonctionne et est fiable, vous le trouverez assez souvent dans des tutoriaux par exemple.</p>
<p>Or ceci n&rsquo;est qu&rsquo;un apparence, prenez 2 minutes et essayez de trouver ce qu&rsquo;il ne va pas dedans&#8230;.</p>
<p>Un indice chez vous : Data.Instance peut retourner null dans certains cas.</p>
<p>Allez voilà ce qu&rsquo;il va se passer !</p>
<p><a href="http://www.rudyhuyn.com/blog/2013/03/08/attention-aux-singletons-statiques/va-passer-l-mtt7lk/" rel="attachment wp-att-1682"><img class="alignnone size-full wp-image-1682" alt="va-passer-L-mtt7lk" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/03/va-passer-L-mtt7lk.jpeg" width="580" height="326" /></a></p>
<p>&nbsp;</p>
<p>Imaginons qu&rsquo;avant d&rsquo;utiliser la classe Datas, j&rsquo;ai quelque part dans monde code :</p>
<p>IsolatedStorageSettings.ApplicationSettings.Contains(&laquo;&nbsp;UneAutreDonnee&nbsp;&raquo;) par exemple<br id=".reactRoot[1].[1][2][1]{comment456951751038020_456961724370356}.0.[1].0.[1].0.[0].[0][2].0.[4]" /><br id=".reactRoot[1].[1][2][1]{comment456951751038020_456961724370356}.0.[1].0.[1].0.[0].[0][2].0.[5]" />L&rsquo;isolatedStorageSettings va commencer par désérialiser l&rsquo;ensemble de ses données, incluant ma donnée ["Data"]. Comme on le sait, le constructeur statique de Datas va être appelé à la première utilisation, donc dans notre cas si cela n&rsquo;a pas été le cas avant : maintenant.<br id=".reactRoot[1].[1][2][1]{comment456951751038020_456961724370356}.0.[1].0.[1].0.[0].[0][2].0.[7]" /><br id=".reactRoot[1].[1][2][1]{comment456951751038020_456961724370356}.0.[1].0.[1].0.[0].[0][2].0.[8]" />Or, le constructeur statique accède aussi à l&rsquo;isolatedStorageSettings, qui est toujours en cours de désérialisation et là ça fait :</p>
<p><a href="http://www.rudyhuyn.com/blog/2013/03/08/attention-aux-singletons-statiques/divide3/" rel="attachment wp-att-1683"><img class="alignnone size-full wp-image-1683" alt="divide3" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2013/03/divide3.jpg" width="638" height="536" /></a></p>
<h1>Pourquoi ?</h1>
<p><br id=".reactRoot[1].[1][2][1]{comment456951751038020_456961724370356}.0.[1].0.[1].0.[0].[0][2].0.[11]" />Car comme c&rsquo;est l&rsquo;initialisateur de IsolatedSettings qui a appelé le constructeur statique, il a &laquo;&nbsp;hérité&nbsp;&raquo; des droits sur le lock de l&rsquo;IsolatedSettings et donc a ainsi les droits une donnée qui est en train d&rsquo;être créée !</p>
<p><em><strong>&laquo;&nbsp;Operation not permitted on IsolatedStorageFileStream.&nbsp;&raquo;</strong></em><br id=".reactRoot[1].[1][2][1]{comment456951751038020_456961724370356}.0.[1].0.[1].0.[0].[0][2].0.[16]" /><br id=".reactRoot[1].[1][2][1]{comment456951751038020_456961724370356}.0.[1].0.[1].0.[0].[0][2].0.[17]" />Encore plus vicieux, l&rsquo;initialisateur de l&rsquo;IsolatedSettings a son propre try catch, donc aucune exception, mais qd vous allez faire  Data.Instance, celui ci vaudra NULL malgré toutes les sécurités que vous avez misent ! Or comme vous êtiez sûr que Data.Instance ne pouvait jamais valoir NULL, vous allez appeler par exemple : Data.Instance.Login et créer une belle exception qui fera planter votre application.</p>
<h1>Pourquoi ca n&rsquo;arrive pas quand on n&rsquo;a jamais appelé IsolatedStorageSettings auparavant ?</h1>
<p>Car comme on l&rsquo;a dit, un constructeur statique n&rsquo;est appelé qu&rsquo;une seule fois, donc comme on vient de l&rsquo;appeler via Data.Instance, l&rsquo;IsolatedStorageSettings ne va pas le rappeler de nouveau, pas de problème de lock, pas d&rsquo;exception.</p>
<h1>Pourtant je suis sûr de ne pas appeler IsolatedStorageSettings avant ?</h1>
<p>Moi aussi c&rsquo;était ce que je pensais&#8230; mais en réalité il ne faut pas se contenter d&rsquo;analyser que son propre code, il faut regarder ce que fait les librairies tierces par exemple. Or, Flurry par exemple stocke ses données dans l&rsquo;isolatedStorageSettings aussi et comme il faut initialiser Flurry dès le chargement de l&rsquo;application, il y a de grande chance qu&rsquo;elle appelle l&rsquo;IsolatedStorageSettings avant vous. Soyez donc toujours prévoyant !</p>
<h1>La solution ?</h1>
<p>Tout simplement externaliser la gestion du singleton en utilisant une seconde class que l&rsquo;on va appeler &laquo;&nbsp;Provider&nbsp;&raquo;, on sépare ainsi la gestion du singleton et la désérialisation.</p>
<pre>

public class DatasProvider
{
static DatasProvider()
{
if (IsolatedStorageSettings.ApplicationSettings.Contains("Data"))
{
Instance = IsolatedStorageSettings.ApplicationSettings["Data"] as Datas;
if (Instance != null)
return;
}
Instance = new Datas() { HasBeenCreated = true };

}

[XmlIgnore]
public static Datas Instance { get; set; }

}

public class Datas
{

public void Save()
{
IsolatedStorageSettings.ApplicationSettings["Data"] = this;
IsolatedStorageSettings.ApplicationSettings.Save();
}

public String Login { get; set; }

[XmlIgnore]
public bool HasBeenCreated { get; set; }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.rudyhuyn.com/blog/2013/03/08/attention-aux-singletons-statiques/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Forcer un thème sous Windows Phone 8</title>
		<link>http://www.rudyhuyn.com/blog/2013/01/18/forcer-un-theme-sous-windows-phone-8/</link>
		<comments>http://www.rudyhuyn.com/blog/2013/01/18/forcer-un-theme-sous-windows-phone-8/#comments</comments>
		<pubDate>Fri, 18 Jan 2013 16:29:43 +0000</pubDate>
		<dc:creator>rudyhuyn</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.rudyhuyn.com/blog/?p=1674</guid>
		<description><![CDATA[Il y a plus d&#8217;un an, je vous avais montré comment forcer un thème sous Windows Phone 7 Mango, depuis Windows Phone 8 est sorti avec son nouvel SDK. Le code Windows Phone 7 fonctionne t&#8217;il toujours ? Non, sinon &#8230; <a href="http://www.rudyhuyn.com/blog/2013/01/18/forcer-un-theme-sous-windows-phone-8/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Il y a plus d&rsquo;un an, je vous avais montré <a href="http://www.rudyhuyn.com/blog/2011/08/18/forcer-les-themes-sous-windows-phone-7-mango/">comment forcer un thème sous Windows Phone 7 Mango</a>, depuis Windows Phone 8 est sorti avec son nouvel SDK.</p>
<h1>Le code Windows Phone 7 fonctionne t&rsquo;il toujours ?</h1>
<p>Non, sinon cet article aurait très peu d&rsquo;intérêt évidemment.</p>
<h1>Pourquoi ?</h1>
<p>Car les brushs ont changé entre temps, certaines ont été ajoutées et surtout certaines ont été supprimées et c&rsquo;est là que ça nous pose problème car le code Windows Phone 7 fait littéralement planter l&rsquo;application.</p>
<p>Car en effet, depuis Mango, on ne peut plus redéfinir les brush, on avait donc pris la liberté de ne pas écraser les brushs mais de modifier directement leurs couleurs. Sauf que si la brush n&rsquo;existe plus, le code suivant plante :</p>
<pre>

((SolidColorBrush)Resources["MaBrushQuiNExistePlus"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);

</pre>
<p>Car Resources["MaBrushQuiNExistePlus"] retourne null et comme on essaie d&rsquo;accéder à sa propriété Color, on se retrouve avec une NullException.</p>
<p>Et c&rsquo;est le cas de PhoneRadioCheckBoxBrush par exemple, qui a simplement disparu sous le runtime WP8</p>
<h1>Mais les applications Windows Phone 7 qui tourne sous un Windows Phone 8 ?</h1>
<p>Elle fonctionne très bien, le problème ne concerne que les application Windows Phone 8 !</p>
<p>&nbsp;</p>
<h1>Alors la solution ?</h1>
<p>Reprendre l&rsquo;ensemble des brush WP8 et les modifier de nouveau.</p>
<p>Commençons par le thème foncé :</p>
<pre>

private void DarkTheme()
{
((SolidColorBrush)Resources["PhoneRadioCheckBoxCheckBrush"]).Color = ((SolidColorBrush)Resources["PhoneRadioCheckBoxBorderBrush"]).Color = ((SolidColorBrush)Resources["PhoneForegroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneBackgroundBrush"]).Color = Color.FromArgb(0xFF, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneContrastForegroundBrush"]).Color = Color.FromArgb(0xFF, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneContrastBackgroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneDisabledBrush"]).Color = Color.FromArgb(0x66, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneProgressBarBackgroundBrush"]).Color = Color.FromArgb(0x19, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneTextCaretBrush"]).Color = Color.FromArgb(0xFF, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneTextBoxBrush"]).Color = Color.FromArgb(0xBF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneTextBoxForegroundBrush"]).Color = Color.FromArgb(0xFF, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneTextBoxEditBackgroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneTextBoxReadOnlyBrush"]).Color = Color.FromArgb(0x77, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneSubtleBrush"]).Color = Color.FromArgb(0x99, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneTextBoxSelectionForegroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneButtonBasePressedForegroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneTextHighContrastBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneTextMidContrastBrush"]).Color = Color.FromArgb(0x99, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneTextLowContrastBrush"]).Color = Color.FromArgb(0x73, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneSemitransparentBrush"]).Color = Color.FromArgb(0xAA, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneChromeBrush"]).Color = Color.FromArgb(0xFF, 0x1F, 0x1F, 0x1F);

((SolidColorBrush)Resources["PhoneInactiveBrush"]).Color = Color.FromArgb(0x33, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneInverseInactiveBrush"]).Color = Color.FromArgb(0xFF, 0xCC, 0xCC, 0xCC);
((SolidColorBrush)Resources["PhoneInverseBackgroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneBorderBrush"]).Color = Color.FromArgb(0xBF, 0xFF, 0xFF, 0xFF);

}

</pre>
<p>et le thème clair :</p>
<pre>

private void DarkTheme()
{
((SolidColorBrush)Resources["PhoneRadioCheckBoxCheckBrush"]).Color = ((SolidColorBrush)Resources["PhoneRadioCheckBoxBorderBrush"]).Color = ((SolidColorBrush)Resources["PhoneForegroundBrush"]).Color = Color.FromArgb(0xDE, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneBackgroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneContrastForegroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneContrastBackgroundBrush"]).Color = Color.FromArgb(0xDE, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneDisabledBrush"]).Color = Color.FromArgb(0x4D, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneProgressBarBackgroundBrush"]).Color = Color.FromArgb(0x19, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneTextCaretBrush"]).Color = Color.FromArgb(0xDE, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneTextBoxBrush"]).Color = Color.FromArgb(0x26, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneTextBoxForegroundBrush"]).Color = Color.FromArgb(0xDE, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneTextBoxEditBackgroundBrush"]).Color = Color.FromArgb(0x00, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneTextBoxReadOnlyBrush"]).Color = Color.FromArgb(0x2E, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneSubtleBrush"]).Color = Color.FromArgb(0x66, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneTextBoxSelectionForegroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneButtonBasePressedForegroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneTextHighContrastBrush"]).Color = Color.FromArgb(0xDE, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneTextMidContrastBrush"]).Color = Color.FromArgb(0x73, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneTextLowContrastBrush"]).Color = Color.FromArgb(0x40, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneSemitransparentBrush"]).Color = Color.FromArgb(0xAA, 0xFF, 0xFF, 0xFF);
((SolidColorBrush)Resources["PhoneChromeBrush"]).Color = Color.FromArgb(0xFF, 0xDD, 0xDD, 0xDD);

((SolidColorBrush)Resources["PhoneInactiveBrush"]).Color = Color.FromArgb(0x33, 0x00, 0x00, 0x00);
((SolidColorBrush)Resources["PhoneInverseInactiveBrush"]).Color = Color.FromArgb(0xFF, 0xE5, 0xE5, 0xE5);
((SolidColorBrush)Resources["PhoneInverseBackgroundBrush"]).Color = Color.FromArgb(0xFF, 0xDD, 0xDD, 0xDD);
((SolidColorBrush)Resources["PhoneBorderBrush"]).Color = Color.FromArgb(0x99, 0x00, 0x00, 0x00);

}

</pre>
<p>et il suffira d&rsquo;utiliser le code suivant dans le constructeur de App</p>
<pre>

if ((Visibility) Resources["PhoneLightThemeVisibility"] == Visibility.Visible)
{
DarkTheme();
}

</pre>
<p>&nbsp;</p>
<p>Attention, comme sous Windows Phone 7, attention à forcer aussi le fond de vos pages <img src='http://www.rudyhuyn.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.rudyhuyn.com/blog/2013/01/18/forcer-un-theme-sous-windows-phone-8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Attention au WriteableBitmap pour générer vos tuiles Windows Phone 8 !</title>
		<link>http://www.rudyhuyn.com/blog/2012/12/26/attention-au-writeablebitmap-pour-generer-vos-tuiles-windows-phone-8/</link>
		<comments>http://www.rudyhuyn.com/blog/2012/12/26/attention-au-writeablebitmap-pour-generer-vos-tuiles-windows-phone-8/#comments</comments>
		<pubDate>Wed, 26 Dec 2012 16:17:42 +0000</pubDate>
		<dc:creator>rudyhuyn</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.rudyhuyn.com/blog/?p=1666</guid>
		<description><![CDATA[Quelques minutes avant de publier Fuse², je me suis rendu compte d&#8217;un bug assez étrange. Lorsque que sortais de l&#8217;application via le bouton Windows, je ne pouvais plus revenir dans l&#8217;application avec le bouton &#171;&#160;back&#160;&#187; du téléphone, voici ce que &#8230; <a href="http://www.rudyhuyn.com/blog/2012/12/26/attention-au-writeablebitmap-pour-generer-vos-tuiles-windows-phone-8/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Quelques minutes avant de publier Fuse², je me suis rendu compte d&rsquo;un bug assez étrange. Lorsque que sortais de l&rsquo;application via le bouton Windows, je ne pouvais plus revenir dans l&rsquo;application avec le bouton &laquo;&nbsp;back&nbsp;&raquo; du téléphone, voici ce que le téléphone m&rsquo;affichait :</p>
<p><a href="http://www.rudyhuyn.com/blog/2012/12/26/attention-au-writeablebitmap-pour-generer-vos-tuiles-windows-phone-8/wp_ss_20121226_0001/" rel="attachment wp-att-1667"><img class="alignnone  wp-image-1667" alt="wp_ss_20121226_0001" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2012/12/wp_ss_20121226_0001.png" width="336" height="560" /></a></p>
<p>Plutôt gênant !!</p>
<h1>Pourquoi cela ?</h1>
<p>En fait, le bug n&rsquo;intervenait que lorsque j&rsquo;avais une tuile sur l&rsquo;écran d&rsquo;accueil. Après investigation, il se trouve que cela provient de la fonction WriteableBitmap.Render qui, s&rsquo;il est appelé après Application_Desactivated, empêche tout retour à l&rsquo;application.</p>
<h1>Reproduire le problème</h1>
<p>Il est assez facile de reproduire ce soucis :</p>
<ul>
<li><span style="line-height: 15px;">Créez une application windows phone 8</span></li>
<li>Ajoutez le code suivant dans Application_Desactivated</li>
</ul>
<pre>
WriteableBitmap wb = new WriteableBitmap(336, 336);
BitmapImage image = new BitmapImage(new Uri("/Assets/AlignmentGrid.png", UriKind.Relative));
var im = new Image() { Source = image, Height = 336, Width = 336 };
wb.Render(im, null);
</pre>
<ul>
<li>Lancez l&rsquo;application</li>
<li>Appuyez sur le bouton windows</li>
<li>Appuyez sur le bouton &laquo;&nbsp;back&nbsp;&raquo;</li>
</ul>
<h1>L&rsquo;explication</h1>
<p>Comme beaucoup d&rsquo;applications, je génère mes tuiles dynamiques en local en utilisant un  WriteableBitmap et j&rsquo;appelle ma fonction de génération de tuiles dans Application_Desactivated et Application_Closing, deux évènements qui sont lancés lorsque l&rsquo;on quitte l&rsquo;application soit via le bouton Windows (ou un launcher), soit en fermant complètement l&rsquo;application via le bouton &laquo;&nbsp;back&nbsp;&raquo;.</p>
<p>Tout ceci fonctionnait bien avec les applications Windows Phone 7, mais ce n&rsquo;est plus le cas avec les applications Windows Phone 8 (précision : une application Windows Phone 7 tournant sur un Windows Phone 8 ne rencontre pas ce soucis).</p>
<p>Chose intéressante, l&rsquo;image est bien généré ! C&rsquo;est juste le retour à l&rsquo;application qui est impossible, comme si WriteableBitmap.Render maintenait le thread UI et empêchait son retour.</p>
<h1>Comment contourner ?</h1>
<p>Pour contourner ce soucis, il faut se brancher un peu avant le Application_Desactivated comme par exemple sur l&rsquo;évènement OnNavigatingFrom de chaque page. Cette solution pourrait fonctionner mais serait difficile à maintenir et assez contraignante.</p>
<p>On va donc se brancher encore un peu plus haut, au niveau de l&rsquo;ApplicationFrame, pour cela dans App.xaml.cs</p>
<p>Ajoutez la ligne suivante dans InitializePhoneApplication :</p>
<pre>

RootFrame.Navigating += RootFrame_Navigating;

</pre>
<p>Puis ajoutez la fonction suivante :</p>
<pre>

void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e)
{
if(e.Uri.OriginalString=="app://external/")
{

//gestion de mes tuiles

}

}

</pre>
<p>&nbsp;</p>
<p>Et voilà !!</p>
<p>Attention, votre code sera appelé à la fois pour la désactivation et la fermeture, il n&rsquo;est malheureusement pas possible à ce niveau de différencier les deux. Toutefois, cela devrait avoir peu d&rsquo;effet car en général, on met à jour ses tuiles dans ces deux évènements.</p>
<p>&nbsp;</p>
<p>Bonnes fêtes !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rudyhuyn.com/blog/2012/12/26/attention-au-writeablebitmap-pour-generer-vos-tuiles-windows-phone-8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beats Audio est-il vraiment un avantage de HTC envers Nokia ?</title>
		<link>http://www.rudyhuyn.com/blog/2012/12/18/beats-audio-est-il-vraiment-un-avantage-de-htc-envers-nokia/</link>
		<comments>http://www.rudyhuyn.com/blog/2012/12/18/beats-audio-est-il-vraiment-un-avantage-de-htc-envers-nokia/#comments</comments>
		<pubDate>Tue, 18 Dec 2012 15:58:50 +0000</pubDate>
		<dc:creator>rudyhuyn</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.rudyhuyn.com/blog/?p=1653</guid>
		<description><![CDATA[Beaucoup de publicités ont été faites autour du son Beats des HTC 8X/8S, à un tel point que ceci est devenu un avantage marketing face au 820 et 920 de Nokia. Or, ceci est purement du marketing et même moi &#8230; <a href="http://www.rudyhuyn.com/blog/2012/12/18/beats-audio-est-il-vraiment-un-avantage-de-htc-envers-nokia/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Beaucoup de publicités ont été faites autour du son Beats des HTC 8X/8S, à un tel point que ceci est devenu un avantage marketing face au 820 et 920 de Nokia. Or, ceci est purement du marketing et même moi je me suis fait avoir, voyons pourquoi.</p>
<p><span id="more-1653"></span></p>
<h1>Beats Audio, what&rsquo;s that ?</h1>
<p>Comme le montre l&rsquo;article suivant :</p>
<p>http://www.engadget.com/2011/10/13/htc-sensation-xe-with-beats-audio-review/</p>
<p>Beats audio est donc equalizer légèrement dynamique comprenant augmentation des basses et de la voix + une augmentation du volume général (malin !)</p>
<p>Encore plus malin, le téléphone détectera le casque que vous utilisez et n&rsquo;utilisera les meilleurs profils que pour les casques de la marque Beats alors qu&rsquo;un profil plus générique sera utilisé pour les autres casques.</p>
<h1>A quoi cela ressemble sous Windows Phone ?</h1>
<p>Prenons un 8X et allons voir à quoi ressemble les paramètres du son :</p>
<p><a href="http://www.rudyhuyn.com/blog/wp-content/uploads/2012/12/wp_ss_20121218_0001.png"><img class="alignnone  wp-image-1654" title="wp_ss_20121218_0001" alt="" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2012/12/wp_ss_20121218_0001-576x1024.png" height="400" /></a></p>
<p>&nbsp;</p>
<p>On ne peut faire plus simple comme configuration : On/Off et c&rsquo;est tout ! Aucune possibilité de configurer votre equalizer selon vos préférences, rien.</p>
<h1>Et les téléphones Nokia ?</h1>
<p>Les téléphones nokia dispose d&rsquo;un paramétrage nommé : &laquo;&nbsp;audio&nbsp;&raquo;, si on entre dedans, voici ce que l&rsquo;on a :</p>
<p>&nbsp;</p>
<p><a href="http://www.rudyhuyn.com/blog/wp-content/uploads/2012/12/wp_ss_20121218_00011.png"><img class="alignnone size-full wp-image-1655" title="wp_ss_20121218_0001" alt="" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2012/12/wp_ss_20121218_00011.png" width="480" height="800" /></a></p>
<p>Un vrai equalizer avec une vingtaine de profils : amplification des basses, classique, dance, Jazz, Voix, etc&#8230;</p>
<p>Avec la possibilité de modifier manuellement les paramètres :</p>
<p><a href="http://www.rudyhuyn.com/blog/wp-content/uploads/2012/12/wp_ss_20121218_0002.png"><img class="alignnone size-full wp-image-1656" title="wp_ss_20121218_0002" alt="" src="http://www.rudyhuyn.com/blog/wp-content/uploads/2012/12/wp_ss_20121218_0002.png" width="480" height="800" /></a></p>
<p>&nbsp;</p>
<p>Mais c&rsquo;est pas tout !</p>
<p>Les nokia prennent aussi en compte le son Dolby, l&rsquo;idée est de &laquo;&nbsp;simuler&nbsp;&raquo; l&rsquo;expérience 5.1 avec un casque 2.0, plus d&rsquo;information ici :</p>
<p>http://membres.multimania.fr/homecine/surround/headphone.html</p>
<p>Au même titre que Beats Audio, on est là aussi dans du marketing avec un equalizer dynamique avec un son un peu plus aérien.</p>
<h1>Conclusion</h1>
<p>Toutefois Beats Audio est purement marketing, tout comme Dolby Headphone, il est difficile de voir dans cette technologie un avantage face aux Nokia qui proposent pour leurs parts à la fois une expérience Dolby Headphone et un equalizer manuel.</p>
<p>Avantage aux Nokia donc pour l&rsquo;aspect audio.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rudyhuyn.com/blog/2012/12/18/beats-audio-est-il-vraiment-un-avantage-de-htc-envers-nokia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
