<?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>Découvrons DotNet sur différentes plateformes &#187; Xamarin.Forms</title>
	<atom:link href="https://blog.developpez.com/insideqt/pcategory/xamarin-forms/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/insideqt</link>
	<description></description>
	<lastBuildDate>Sun, 28 Dec 2014 15:50:37 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>PCL et dependences</title>
		<link>https://blog.developpez.com/insideqt/p12812/xamarin-forms/pcl-et-dependences</link>
		<comments>https://blog.developpez.com/insideqt/p12812/xamarin-forms/pcl-et-dependences#comments</comments>
		<pubDate>Sun, 28 Dec 2014 15:50:37 +0000</pubDate>
		<dc:creator><![CDATA[Aktaour]]></dc:creator>
				<category><![CDATA[PCL]]></category>
		<category><![CDATA[Xamarin.Forms]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/insideqt/?p=34</guid>
		<description><![CDATA[PCL = Portable class Library Pour pouvoir dans un projet PCL accèder aux API d&#8217;un système, il faut utiliser un système de dépendances. Vous avez plusieurs solutions liées à des interfaces ou à des classes abstraites/virtuelles aux choix Créer une classe avec des références sur des classes implémentant des interfaces Utiliser le DependencyService de Xamarin pour plateforme mobile référencant la librairie Xamarin Créer votre propre DependencyService multi plateforme Je privilégie la solution 1 et 3. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>PCL = Portable class Library<br />
Pour pouvoir dans un projet PCL accèder aux API d&rsquo;un système, il faut utiliser un système de dépendances.</p>
<p>Vous avez plusieurs solutions liées à des interfaces ou à des classes abstraites/virtuelles aux choix</p>
<ul>
<li>Créer une classe avec des références sur des classes implémentant des interfaces</li>
<li>Utiliser le  <a href="http://developer.xamarin.com/guides/cross-platform/xamarin-forms/dependency-service/" title="Aide" target="_blank">DependencyService de Xamarin pour plateforme mobile référencant la librairie Xamarin</a></li>
<li>Créer votre propre DependencyService multi plateforme</li>
</ul>
<p>Je privilégie la solution 1 et 3. La solution DependencyService de Xamarin ne me plaît pas car elle ne fonctionne pas pour les projets PC.</p>
<p>Je vous expose donc la solution 1 et 3.</p>
<p><strong>Solution 1</strong> avec une classe et un sorte de singleton renseigné par l&rsquo;application cible (et non par sa propre classe):</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public class IO<br />
{<br />
&nbsp; &nbsp;private static IO _current = null;<br />
&nbsp; &nbsp;public static IO Current<br />
&nbsp; &nbsp;{<br />
&nbsp; &nbsp; &nbsp;get { return _current; }<br />
&nbsp; &nbsp; &nbsp;set { _current = value; }<br />
&nbsp; &nbsp;}<br />
&nbsp; &nbsp;public virtual bool FichierExiste(string cheminFichier)<br />
&nbsp; &nbsp;{<br />
&nbsp; &nbsp; &nbsp;return false; // Vous pouvez aussi lever une exception pour indiquer que le code n'a pas été implémenté<br />
&nbsp; &nbsp;}<br />
}<br />
<br />
public class IOiOS : IO<br />
{<br />
&nbsp; &nbsp;public override bool FichierExiste(string cheminFichier)<br />
&nbsp; &nbsp;{<br />
&nbsp; &nbsp; &nbsp;return File.Exists(cheminFichier);<br />
&nbsp; &nbsp;}<br />
}</div></div>
<p>pour l&rsquo;utiliser, il suffit de faire un<br />
IO.Current = new IOiOS();<br />
puis dans le PCL : IO.Current.FichierExiste(&laquo;&nbsp;image.png&nbsp;&raquo;);</p>
<p><strong>Solution 3</strong><br />
Créer votre propre DependencyService</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">using System.Reflection;<br />
using System.Text;<br />
using System.Threading.Tasks;<br />
<br />
namespace Aktaour.Core.Framework<br />
{<br />
&nbsp; &nbsp; public class DependencyInjector<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; private static DependencyInjector _instance = null;<br />
&nbsp; &nbsp; &nbsp; &nbsp; private Dictionary&amp;lt;Type,Type&amp;gt; _dependencyList = new Dictionary&amp;lt;Type,Type&amp;gt;();<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public static DependencyInjector Instance<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (_instance == null)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _instance = new DependencyInjector();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return _instance;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; public void Register&amp;lt;TBase,T&amp;gt;() where T : TBase<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (_dependencyList.ContainsKey(typeof(TBase)))<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new Exception(&quot;Type already register&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _dependencyList.Add(typeof(TBase), typeof(T));<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public TBase Get&amp;lt;TBase&amp;gt;()<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (_dependencyList.ContainsKey(typeof(TBase)))<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (TBase)Activator.CreateInstance(_dependencyList[typeof(TBase)]);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return default(TBase);<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }<br />
}</div></div>
<p>Dans le projet PCL créer une classe IO</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public class IO<br />
{<br />
&nbsp; &nbsp;public virtual bool FichierExiste(string cheminFichier)<br />
&nbsp; &nbsp;{<br />
&nbsp; &nbsp; &nbsp;return false; // Vous pouvez aussi lever une exception pour indiquer que le code n'a pas été implémenté<br />
&nbsp; &nbsp;}<br />
}</div></div>
<p>Et dans votre application iOS créer une classe IOiOS</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public class IOiOS : IO<br />
{<br />
&nbsp; &nbsp;public override bool FichierExiste(string cheminFichier)<br />
&nbsp; &nbsp;{<br />
&nbsp; &nbsp; &nbsp;return File.Exists(cheminFichier);<br />
&nbsp; &nbsp;}<br />
}</div></div>
<p>et enregistrer votre classe dans le DependencyInjector</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DependencyInjector.Instance.Register();</div></div>
<p>Ensuite, pour créer vos objets, vous utilisez le DependencyInjector via la classe de base</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">IOiOS io = DependencyInjector.Instance.Get&amp;lt;IO&amp;gt; ();</div></div>
<p>Pour finir, il suffit d&rsquo;être inventif pour coller au plus à vos besoins.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multiplateforme, MVVM, PCL, Xamarin.Forms</title>
		<link>https://blog.developpez.com/insideqt/p12811/xamarin-forms/multiplateforme-mvvm-pcl-xamarin-forms</link>
		<comments>https://blog.developpez.com/insideqt/p12811/xamarin-forms/multiplateforme-mvvm-pcl-xamarin-forms#comments</comments>
		<pubDate>Sun, 28 Dec 2014 14:13:11 +0000</pubDate>
		<dc:creator><![CDATA[Aktaour]]></dc:creator>
				<category><![CDATA[MVVM]]></category>
		<category><![CDATA[PCL]]></category>
		<category><![CDATA[Xamarin.Forms]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/insideqt/?p=16</guid>
		<description><![CDATA[Pour l&#8217;écriture d&#8217;un logiciel multi-plateforme PC et mobile, j&#8217;utilise des techniques qui sont nouvelles pour moi et qui m&#8217;oblige à remettre en question mes acquis de développeur mono plateforme. Pour écrire un logiciel sur plusieurs plateformes, il faut un langage de programmation commun, un ou plusieurs EDI compatible et une logique de programmation qui ne dépend pas de la machine cible. J&#8217;ai retenu: EDI visual studio Community 2013 (gratuit) et Xamarin Studio (avec licence indie) [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Pour l&rsquo;écriture d&rsquo;un logiciel multi-plateforme PC et mobile, j&rsquo;utilise des techniques qui sont nouvelles pour moi et qui m&rsquo;oblige à remettre en question mes acquis de développeur mono plateforme.</p>
<p>Pour écrire un logiciel sur plusieurs plateformes, il faut un langage de programmation commun, un ou plusieurs EDI compatible et une logique de programmation qui ne dépend pas de la machine cible.</p>
<p>J&rsquo;ai retenu:</p>
<ul>
<li>EDI visual studio Community 2013 (gratuit) et Xamarin Studio (avec licence indie)</li>
<li>Le langage de programmation C# basé sur le frameWork 4.5 avec les mots clés aync/await</li>
<li>Des projets multi plateformes PCL</li>
<li>le pattern de programmation MVVM</li>
<li>un PC sous Windows 8.1</li>
<li>un Mac pour l&rsquo;émulateur iOS, et pour le développement sous un device Android (ici un galaxy note 1) </li>
</ul>
<p><em><strong>MVVM</strong></em><br />
Le pattern Modèle-Vue-VueModèle est un pattern qui veut séparer la vue de la logique et de l&rsquo;accès aux données en accentuant les principes de binding et des événements.<br />
Vous écrivez dans le viewModel et le résultat s&rsquo;affiche dans la vue à l&rsquo;aide de Binding et la vue interagit avec le viewModel par des événements. et enfin le viewModel agit sur les données en bdd/fichier directement.</p>
<p>C&rsquo;est simple et efficace.</p>
<p><em><strong>PCL</strong></em><br />
Le but du PCL (portable class library) est donc de créer différentes librairies indépendantes de chaque plateforme et de créer un projet pour chaque plateforme cible.<br />
Chaque projet PCL a accès à un framework .Net inter plateforme mais limité par ses fonctionnalités. Toutes dll qui n&rsquo;est pas multiplateforme et indépendant du systèmes y est rejetés.</p>
<p>En résumé:</p>
<ul>
<li>un projet library PCL nommé &laquo;&nbsp;Message&nbsp;&raquo; qui contiendra vos classes strictement de stockage de données en mémoire</li>
<li>un projet library PCL nommé &laquo;&nbsp;Core&nbsp;&raquo; qui contiendra votre logique applicative, vos viewModel (pour le MVVM)</li>
<li>un projet library PCL nommé &laquo;&nbsp;DesktopCore&nbsp;&raquo; qui contiendra les view WPF et les viewmodel dérivés de ceux du projet Core</li>
<li>un projet library PCL nommé &laquo;&nbsp;MobileCore&nbsp;&raquo; qui contiendra les view Xamarin.Forms et les viewmodel dérivés de ceux du projet Core</li>
<li>un projet application WPF nommé &laquo;&nbsp;DesktopApp&nbsp;&raquo; qui contiendra le premier formulaire et l&rsquo;accès aux fichiers et aux APi du système PC</li>
<li>un projet application Android nommé &laquo;&nbsp;AndroidApp&nbsp;&raquo; qui contiendra le premier formulaire et l&rsquo;accès aux fichiers et aux APi du système Android</li>
<li>un projet application Windows Phone nommé &laquo;&nbsp;WPApp&nbsp;&raquo; qui contiendra le premier formulaire et l&rsquo;accès aux fichiers et aux APi du système Windows Phone</li>
<li>un projet application Windows Phone nommé &laquo;&nbsp;iOSApp&nbsp;&raquo; qui contiendra le premier formulaire et l&rsquo;accès aux fichiers et aux APi du système iOS</li>
</ul>
<p>Sur le papier, en lisant des articles je me suis dit hourra, trop facile. <strong>La réalité est bien plus compliquée!</strong></p>
<p>Comme je vous l&rsquo;ai annoncé (vous avez le droit de ne pas me croire) pour faire du multi plateforme, il faut être décoléré du système cible.<br />
Vous devez vous concentrer sur une notion: &laquo;&nbsp;Ne t&rsquo;occupes pas de comment accéder aux API systèmes, part du principe qu&rsquo;ils ne sont pas accessibles&nbsp;&raquo;.<br />
En gros, ne comptes pas sur le système pour t&rsquo;aider, tu es le seul à pouvoir y accéder et cela par tes propres moyens.</p>
<p>Je m&rsquo;explique: prenez l&rsquo;exemple d&rsquo;un test d&rsquo;existence d&rsquo;un fichier.</p>
<ul>
<li>Sous Windows, Android, iOS
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">File.Exists(nomFichier);</div></div>
</li>
<li>Sous Windows Phone:
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">StorageFolder appFolder = ApplicationData.Current.LocalFolder;<br />
var files = Task.Run(async () =&amp;gt; await appFolder.GetFilesAsync()).GetAwaiter().GetResult();<br />
var file = files.Where(t =&amp;gt; t.Name == nomFichier).FirstOrDefault();<br />
result = file != null;</div></div>
</li>
</ul>
<p>Mais pourquoi Microsoft nous a pondu une merde pareil sur Windows Phone, je sais pas, c&rsquo;est chiant mais vu que l&rsquo;on fait du PCL on s&rsquo;en moque!</p>
<p>En effet, qui dit library PCL, dit impossibilité d&rsquo;accéder à File.Exists ou à StorageFolder /StorageFile. il faut passer par sont propres systèmes de dépendances via des pointeurs qui références des objets liés à chaque plateforme.</p>
<p><em><strong>Xamarin.Forms</strong></em><br />
Le frameWork Xamarin.Forms est tout nouveau, créé mi 2014 par la société Xamarin (enfin créé par un développeur puis récupéré par Xamarin&#8230;).<br />
Il ambitionne de révolutionner la manière dont vous écrivez des interfaces graphiques pour le développement mobile.<br />
Ecrivez une fois (pour iOS) et visualisez partout (WinPhone/Android/iOS).<br />
<a href="http://xamarin.com/forms" title="Xamarin.Forms" target="_blank">Xamarin.Forms</a></p>
<p>Il y a un gros Hic tout de même, Xamarin.Forms permet de faire de belles choses mais il est loin d&rsquo;être parfait et toujours en chantier actuellement. Des versions sortent toutes les semaines.<br />
Des bugs apparaissent, d&rsquo;autres disparaissent mais on peut toujours s&rsquo;en sortir en laissant certaines choses de temporairement de cotées. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Découvrons Xamarin.Forms</title>
		<link>https://blog.developpez.com/insideqt/p12810/xamarin-forms/decouvrons-xamarin-forms</link>
		<comments>https://blog.developpez.com/insideqt/p12810/xamarin-forms/decouvrons-xamarin-forms#comments</comments>
		<pubDate>Sun, 28 Dec 2014 11:42:05 +0000</pubDate>
		<dc:creator><![CDATA[Aktaour]]></dc:creator>
				<category><![CDATA[Xamarin.Forms]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/insideqt/?p=11</guid>
		<description><![CDATA[Suite à 2 années de travail acharné sur une application de vente et d&#8217;aide à la vente pour le retail sous Xamarin.iOS (iOS 5.1 et supérieur). Je ne suis pas indépendant, je travaille pour une société éditrice de logicielle liée au retail. iStoreAssistant L&#8217;application en question s’exécute sous iOS et utilise différents matériels essentiellement pour des besoins spécifiques liés à l&#8217;activité du retail. un pinpad monétique : l&#8217;iSMP (paiement monétique). des imprimantes de caisses de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Suite à 2 années de travail acharné sur une application de vente et d&rsquo;aide à la vente pour le retail sous Xamarin.iOS (iOS 5.1 et supérieur).<br />
Je ne suis pas indépendant, je travaille pour une société éditrice de logicielle liée au retail.<br />
<a href="http://www.cylande.com/web/blog/article/l-encaissement-mobile--une-evidence-en-magasin./70049" title="iStoreAssistant">iStoreAssistant</a></p>
<p>L&rsquo;application en question s’exécute sous iOS et utilise différents matériels essentiellement pour des besoins spécifiques liés à l&rsquo;activité du retail.</p>
<ul>
<li>un pinpad monétique : l&rsquo;iSMP (paiement monétique).</li>
<p><a href="http://blog.developpez.com/insideqt/files/2014/12/ismp_w605.jpg"><img src="http://blog.developpez.com/insideqt/files/2014/12/ismp_w605-300x179.jpg" alt="ismp" width="300" height="179" class="alignnone size-medium wp-image-13" /></a></p>
<li>des imprimantes de caisses de type Epson POS</li>
<p><a href="http://blog.developpez.com/insideqt/files/2014/12/shopping.jpg"><img src="http://blog.developpez.com/insideqt/files/2014/12/shopping-300x300.jpg" alt="tm-t88V" width="300" height="300" class="alignnone size-medium wp-image-14" /></a></p>
<li>un lecteur de code barre (soit iSMP, soit Captuvo SL22) </li>
<p><a href="http://blog.developpez.com/insideqt/files/2014/12/captuvosl22v5_01_large.png"><img src="http://blog.developpez.com/insideqt/files/2014/12/captuvosl22v5_01_large-300x300.png" alt="captuvosl22" width="300" height="300" class="alignnone size-medium wp-image-12" /></a>
</ul>
<p>Le but des différents billets qui vont suivre est d&rsquo;appliquer les différentes méthodes qui m&rsquo;ont permis de créer ce logiciel monoplateforme (sous iOS) pour en faire un logiciel multiplateforme (mobile iOS, Android, Windows phone et PC).<br />
Pour cela, je m&rsquo;oriente aujourd&rsquo;hui vers <strong>Xamarin.Forms</strong>.</p>
<p><strong>Xamarin.Forms</strong> est une surcouche graphique multiplateforme mobile garantissant un rendu graphique similaire sous iOS, Android et Windows phone.</p>
<p>Très intéressant sur le papier, vous écrivez en code C# ou en Xaml (fichier XML d&rsquo;interface) et vous obtenez votre interface graphique.</p>
<p>Si vous avez déjà écrit des logiciels WPF, vous ne serez pas &laquo;&nbsp;trop&nbsp;&raquo; dépaysé.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
