Freigeben über


Migration d’un contrôle Windows 8.0 vers Windows 8.1 et Windows Phone 8.1

Bonjour à tous;

L’année dernière, j’ai créé un contrôle Carrousel, pour montrer un peu comment fonctionne la création de composant Modern UI (WinRT en somme).

Pour rappel, l’article en question est ici : https://blogs.msdn.com/b/mim/archive/2013/03/19/create-a-custom-user-control-using-xaml-and-c-for-windows-8.aspx (En anglais)

image

Lors de l’annonce du rapprochement des plateformes WP et WIN8 et l’intégration de WinRT dans Windows Phone 8.1, je me suis demandé si mon contrôle pouvait être porté facilement sur Windows Phone “as is”

Solution de départ

La solution de départ est un simple projet Windows 8.0

image

Evidemment j’aurai déjà pu à l’époque séparer la couche Interface utilisateur et le contrôle en le créant directement dans un projet Custom Control.

Nouvelle Solution

Pour cette nouvelle solution, j’ai bien sûr utilisé un projet Portable Class Library for Universals.

Il est évident que le Template Universals avec le répertoire Shared n’aurait pas fait mon affaire, puisque le principe c’est d’avoir un composant redistribuable.

image

Après l’ajout de 2 projets (Windows 8.1 et Windows Phone 8.1) je me retrouve avec la solution suivante :

image

Il ne me reste plus qu’à copier – coller les 2 fichiers sources me servant à créer mon Carrousel et tenter une première compilation.

Je me retrouve avec deux types d’erreurs, lié à la projection du type IEnumerable<T> , ou IList<T> :

Erreur sur Windows Phone 8.1 :

image

Erreur sur Windows 8.1 :

image

Vous trouverez plus d’informations sur

https://stackoverflow.com/questions/9285752/how-to-use-listt-or-dictionaryt-t2-in-c-sharp-winrt-component

J’ai donc changé ma propriété DataSource et j’ai au final repris le même schéma qu’un ItemsControl qui ne fait qu’exposer un type Object :image

Voilà au final le seul morceau de code que j’ai dû modifier :

  1 /// <summary>
 2 /// Items source : Better if ObservableCollection :)
 3 /// </summary>
 4 public IEnumerable<Object> ItemsSource
 5 {
 6     get { return (IEnumerable<Object>)GetValue(ItemsSourceProperty); }
 7     set { SetValue(ItemsSourceProperty, value); }
 8 }
 9 
10 // Using a DependencyProperty as the backing store for ItemsSource.  
11 //This enables animation, styling, binding, etc...
12 public static readonly DependencyProperty ItemsSourceProperty =
13     DependencyProperty.Register("ItemsSource",
14                 typeof(IEnumerable<Object>),
15                 typeof(LightStone),
16                 new PropertyMetadata(0, ItemsSourceChangedCallback));

Le contrôle marche maintenant sur Windows Phone, en mode Portrait et Paysage :

image

 

image

Et Bien sûr il fonctionne toujours sous Windows 8.1 :

image

Les sources du projet ici : https://www.dotmim.com/sitefiles/LightStoneWinRT.zip