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)
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
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.
Après l’ajout de 2 projets (Windows 8.1 et Windows Phone 8.1) je me retrouve avec la solution suivante :
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 :
Erreur sur Windows 8.1 :
Vous trouverez plus d’informations sur
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 :
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 :
Et Bien sûr il fonctionne toujours sous Windows 8.1 :
Les sources du projet ici : https://www.dotmim.com/sitefiles/LightStoneWinRT.zip