Archive

Posts Tagged ‘tip&trick’

Xamarin.Forms et les ressources graphiques embarquées – Tip & Tricks & Warning

Lors de la création d’une solution Xamarin.Forms ( 3 projets spécifiques à chaque plateforme mobile, et un projet commun) , la gestion des images et des ressources embarquées (Embedded Resources) est un peu déroutante (même les forums Xamarin ne sont pas d’une aide énorme 😦 et témoigne d’un certain flou sur ce sujet).

Dans tout projets mobiles, il a des ressource graphiques (image, icône, vidéo, audio) qui doivent être insérées dans votre projet.

Quand on fait du spécifique , on ne se pose pas de question. Avec les Xamarin.Forms, il y a plusieurs possibilités et plusieurs manières de gérer les ressources, avec des variations sur leur utilisation dans le code.

La première question à se poser :

  • Est ce un élément spécifique à une plateforme mobile ? Ex : l’image de splashscreen d’une application Windows Phone
    ==> l’élément doit être placé dans le projet propre à la plateforme , et les différent option de compilation spécifique utilisé (Content pour Windows Phone, Android Resource, Bundle pour Android) …
  • Est ce un élément commun utilisé par la partie Xamaring.Forms de l’application ? ex : des images qui compose les écrans, …
    ==> l’élément doit être placé dans le projet commun ( le projet PCL ou le Shared Project) et l’option de compilation positionné à « Embedded Resource« 

Ensuite, l’utilisation de cette ressource embarquée (Embedded Resource) passe par l’utilisation de son nom de ressource. Or, dans ce le cas de Xamarin pour Visual Studio, il n’est pas possible de connaître dans l’IDE le nom de la ressource.

Un petit coup de JustDecompile permet de comprendre la règle de nommage des ressources embarquées (dans le cas d’un projet Portable)  :

  • NomDuProjet.Folder1.Folder2.NomDuFichier

 

XaraminFormsResourcesWithPCLProject

Ainsi pour une image appelée ( SplashScreen_720x1280.JPG), placée à la racine du projet « MonProjetDemoXF », son nom de ressource sera « MonProjetDemoXF.SplashScreen_720x1280.JPG« , et pour une images « Logo.JPG » placé dans le dossier « Images » du même projet, son nom de ressource sera « MonProjetDemoXF.Images.Logo.JPG« 

 

La création d’une view Image utilisant cette image se fera avec le bout de code suivant :

    new Image() {
         Source = ImageSource.FromResource(« MonProjetDemoXF.SplashScreen_720x1280.jpg »)
            }

 

MAIS ATTENTION : il s’agit de la règle générale (prendre le nom du projet en préfixe et les sous dossiers). Dans le cas d’un projet commun de type « Portable Class Library », le cas présenté ci avant est exact. Lors de la compilation, le projet PCL génère sa propre assembly et les règles de nommage découle de cette assembly.

MAIS dans le cas d’un « shared project », il n’y a pas de compilation du shared project en tant que tel (pas d’assembly généré), mais une fusion des sources du ‘shared project’ avec les sources du projet le référençant, puis la compilation du résultat de cette ‘fusion’. Ce comportement implique que le nom du projet utilisé pour générer le nom de la ressource est celui du projet référenceur. Or, les projets mobiles ont des noms différents pour chaque plateforme : « MonProjet.WinPhone », « MonProjet.iOS » et « MonProjet.Android », ce qui implique que la ressource issue du ‘shared project’ a un nom différent pour chaque plateforme !!!

De plus, les noms des sous dossiers ne sont pas repris dans le nom de la ressources !!

XaraminFormsResourcesWithSharedProject

 

Voilà : à l’usage on verra quelle solution est la plus performante, mais en terme de réutilisabilité et de testabilité le projet PCL permet d’éliminer les aléas de nommages des ressources.

Xamarin 3 Rocks ! (quand même 🙂 ).

 

Catégories :.NET, Mobilité, Visual Studio, Xamarin Étiquettes : , , , ,