A la quête du pixel-perfect : Windows Runtime (Windows Store Apps)

Posted by & filed under Non classé.

Au menu du jour, je vous propose un petit helper tout simple pour vous aider à faire du pixel perfect dans vos applications Windows Store.
Il permet via la classe DisplayInformation de déterminer le ratio courant de mise à l’échelle de l’UI (c-a-d le ratio entre les pixels logiques utilisés dans le XAML et les pixels physiques sur l’écran du device final).

Il permet de convertir une taille logique en taille physique. Je m’en sers par exemple dans mes applications pour demander des images aux webservices qui font pile poil la bonne taille en fonction de l’écran de l’utilisateur final.
Un user avec un écran 800×480 fera des économies de bande passante en téléchargeant de plus petites images alors que le possesseur d’un écran 1920×1080 profitera pleinement de la finesse de son écran.

Ajouter des références binaires spécifiques à une plateforme dans un csproj

Posted by & filed under Dev'.

Voici comment ajouter dans un projet une dépendance (référence) sur une libraire compilée dépendante de la plateforme.

En effet, lorsque l’on travaille en interaction avec des librairies natives en particulier dans le cas des applications du Windows Store / Windows Phone Store, on va se retrouver avec deux versions du même binaire à inclure dans son projet, en fonction de l’architecture du CPU qui va faire tourner l’application :

  • x86
    • Windows : Les PC/Tablettes sous Windows 8.x (Surface Pro, …)
    • Windows Phone : l’émulateur
  • ARM
    • Windows : Les tablettes sous Windows RT 8.x (Surface classique, …)
    • Windows Phone : tous les smartphones du marché

Visual Studio, via son menu Add Reference… ne permet pas de faire cette manipulation, il faudra pour cela modifier manuellement le fichier .csproj

La variable concernant la plateforme dans les projets Windows Phone se nomme ‘$(Platform)’ et vaut soit ‘x86’ soit ‘ARM’.

Ouvrez votre fichier .csproj et repérez l’ItemGroup où sont déclarées vos références, voici un exemple :

<ItemGroup>
  <Reference Include="Newtonsoft.Json">
    <HintPath>..\packages\Newtonsoft.Json.6.0.3\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll</HintPath>
  </Reference>
  <Reference Include="System.Net.Http">
    <HintPath>..\packages\Microsoft.Net.Http.2.2.22\lib\sl4-windowsphone71\System.Net.Http.dll</HintPath>
  </Reference>
  <Reference Include="System.Net.Http.Extensions">
    <HintPath>..\packages\Microsoft.Net.Http.2.2.22\lib\sl4-windowsphone71\System.Net.Http.Extensions.dll</HintPath>
  </Reference>
  <Reference Include="System.Net.Http.Primitives">
    <HintPath>..\packages\Microsoft.Net.Http.2.2.22\lib\sl4-windowsphone71\System.Net.Http.Primitives.dll</HintPath>
  </Reference>
</ItemGroup>

En dessous, ajoutez deux nouveaux ItemGroup conditionnés par la plateforme courante et contentant les références vers vos binaires spécifiques :

<!-- Platform dependant libraries references -->
<ItemGroup Condition=" '$(Platform)' == 'ARM' ">
  <Reference Include="MyLibrary">
    <HintPath>..\Libs\ARM\Release\MyLibrary.dll</HintPath>
  </Reference>
</ItemGroup>
<ItemGroup Condition=" '$(Platform)' == 'x86' ">
  <Reference Include="MyLibrary">
    <HintPath>..\Libs\x86\Release\MyLibrary.dll</HintPath>
  </Reference>
</ItemGroup>

Enregistrez le tout et réouvrez le projet dans Visual Studio, le tour est joué 🙂