Création de votre première application Windows universelle

Les applications Windows universelles vous permettent de cibler tous les périphériques Windows dans une solution. Vous développez une fois, partagez la majeure partie de votre code et déployez sur Windows, Windows Phone ou Xbox..

L'objectif est de maximiser la réutilisation du code. Vous pouvez partager du code, des contrôles utilisateur, des styles, des chaînes et d'autres actifs entre les projets Windows Phone et Windows 8 dans Visual Studio. Cela réduit les efforts nécessaires à la création et à la maintenance d'une application pour chaque type d'appareil..

introduction

Du point de vue du développeur, une application Windows universelle n'est pas un simple binaire qui s'exécute sur plusieurs plates-formes. Cela prend plutôt la forme d'une solution Visual Studio contenant plusieurs projets, un projet pour chaque plate-forme ciblée, en plus d'un projet partagé contenant du code et des ressources partagées entre les plates-formes. De nombreux codes peuvent être partagés entre les projets lorsque Windows Phone 8.1 implémente la plupart des API WinRT implémentées par Windows 8.1..

Vous pouvez créer une application Windows Phone à l'aide du runtime Silverlight (version 8.0 ou 8.1) ou du runtime WinRT (celui des applications Windows universelles). Le runtime WinRT vous permet de créer une application qui s'exécutera sous Windows, Windows Phone et même Xbox One..

Nous utilisons le framework XAML pour développer une application pour plusieurs plates-formes. Dans la version actuelle, la convergence des API est de 90%, mais un petit ensemble n'a pas encore convergé. Les fonctionnalités Windows Phone uniquement disponibles dans la structure Silverlight sont les suivantes:

  • Support d'objectif
  • Support VoIP
  • Tâche de capture de caméra
  • API Presse-papiers
  • Verrouiller l'API de fond d'écran

Dans ce didacticiel, je vais utiliser un modèle d'application Windows universel pour créer une application Hex Clock, une horloge chromatique hexadécimale précise. Il passe par toute la gamme de couleurs de 24 heures, de # 000000 à # 235959. À chaque coup d'horloge, l'arrière-plan de l'application devient la couleur correspondant à l'heure actuelle convertie en hexadécimal. Il utilise la même implémentation que Hex Color JS Clock pour générer le code hexadécimal de l’heure actuelle..

La conception a été inspirée par un tutoriel d'application d'horloge Windows Phone 7 sur Tuts +. Bien que l'application Horloge ne cible que Windows Phone, nous utiliserons son design pour créer une application similaire pour Windows Phone 8.1 et Windows 8.1. La capture d'écran ci-dessous montre ce que nous allons construire.

Dans ce didacticiel, nous aborderons les sujets suivants concernant le développement d'applications Windows universelles:

  • la structure des applications Windows universelles
  • changement de projet de démarrage dans Visual Studio
  • commutateur de contexte pour les applications Windows universelles dans l'éditeur Visual Studio
  • comment écrire du code multiplateforme dans le projet partagé
  • comment ajouter un support pour Windows ou Windows Phone à un projet existant
  • construire une application Windows universelle à partir de zéro

1. Structure des applications Windows universelles

Une application Windows universelle est un ensemble de trois projets contenus dans un dossier de solutions facultatif. Les projets Windows et Windows Phone sont des projets de plateforme. Ils sont chargés de créer les packages d'application (.appx), en ciblant les plateformes respectives. Ces projets contiennent des actifs spécifiques à la plateforme ciblée..

Le projet partagé est un conteneur de code qui s'exécute sur les deux plates-formes. Ils n'ont pas de sortie binaire, mais leur contenu est importé par les projets de la plateforme et utilisé dans le cadre du processus de construction pour générer les packages d'application (.appx)..

La capture d'écran ci-dessous montre la solution créée par Visual Studio lorsque vous choisissez le modèle de projet pour une application vide (Universal Apps)..

Visual Studio 2013 Update 2 introduit la nouvelle fonctionnalité qui est les applications Windows universelles. Téléchargez et installez cette mise à jour avant de commencer à créer des applications Windows universelles..

2. Changement de projets de démarrage

Lorsque vous exécutez la solution, le projet qui s'exécute est celui sélectionné comme projet de démarrage. Pour définir le projet de démarrage, cliquez avec le bouton droit sur le nœud du projet dans la liste. Explorateur de solution et choisissez l'option Définir comme projet de démarrage. Vous pouvez rapidement basculer le projet de démarrage du Cible de débogage liste déroulante qui énumère maintenant tous les projets possibles de la solution.

Le projet que vous choisissez apparaît en gras dans le Explorateur de solution. Les cibles de débogage disponibles changent lors du changement de projet de démarrage.

  • Lorsque le projet Windows est le projet de démarrage, le Cible de débogage menu déroulant affiche les options pour Windows Simulateur ou Machine locale.
  • Lorsque le projet Windows Phone est le projet de démarrage, la liste déroulante affiche les options pour Dispositif ainsi que divers émulateurs.

3. Changeur de contexte dans l'éditeur de code

Lorsque vous écrivez du code dans un projet partagé, vous pouvez utiliser le sélecteur de contexte de projet dans la barre de navigation pour sélectionner la plate-forme que vous ciblez activement, ce qui permet de personnaliser l'expérience IntelliSense dans l'éditeur de code..

Si vous utilisez une API dans un code partagé qui n'est pas pris en charge sur les deux plates-formes, un message d'erreur identifiera cette API lors de la génération du projet. Il n'est pas nécessaire de générer le projet pour confirmer que vous utilisez des API multiplates-formes..

La capture d'écran suivante montre un exemple des icônes d'avertissement et d'IntelliSense pour un type pris en charge uniquement dans les applications Windows Phone..

4. Code multiplateforme dans un projet partagé

Dans le projet partagé, vous écrivez généralement du code commun aux deux plates-formes. Pour isoler des sections de code spécifiques à une plate-forme, utilisez la commande #ifdef directif. Les constantes WINDOWS_APP et WINDOWS_PHONE_APP sont prédéfinis pour vous.

Voici les constantes de compilation conditionnelles que vous pouvez utiliser pour écrire du code spécifique à la plate-forme:

C # WINDOWS_APP
WINDOWS_PHONE_APP
C++
WINAPI_FAMILY_PC_APP
WINAPI_FAMILY_PHONE_APP

Lorsque vous écrivez du code dans le projet partagé, l'éditeur de code Visual Studio utilise un contexte qui cible une plate-forme ou une autre. En C #, l’IntelliSense que vous voyez en cours d’écriture est spécifique au contexte de l’éditeur de code, c’est-à-dire spécifique à Windows ou à Windows Phone..

5. Ajout du support pour Windows / Windows Phone

Si vous avez déjà une application Windows 8.1 existante, vous pouvez utiliser le Ajouter Windows Phone 8.1 commande pour ajouter un nouveau projet Windows Phone 8.1 et un projet partagé à la solution. Une option similaire est également disponible si vous possédez une application Windows Phone 8.1 et souhaitez ajouter une prise en charge de Windows 8.1..

Pour ajouter le support pour un type d'appareil ou un autre, dans le Explorateur de solution, faites un clic droit sur le projet et choisissez Ajouter Windows Phone 8.1 ou Ajouter Windows 8.1.

Ici, Visual Studio ajoute un nouveau projet Windows Phone ou Windows à la solution. Un projet partagé est également créé automatiquement pour vous..

La capture d'écran suivante montre une solution après l'ajout d'un projet Windows Phone à un projet Windows existant. Le projet partagé ajouté à la solution est initialement vide.

Notez que si vous créez une application à l'aide d'un modèle d'application Windows universel, le projet partagé contient déjà le App.xaml fichier.

Étape 1: déplacer des fichiers vers le projet partagé

Vous pouvez déplacer le code que vous souhaitez partager entre les applications dans le projet partagé. Par exemple, vous pouvez déplacer le CommunModèle de données, et Les cordes dossiers du projet partagé. Vous pouvez même bouger App.xaml au projet partagé.

Vous pouvez toutefois recevoir des erreurs de compilation concernant le code que vous avez déplacé dans le projet partagé. Vous pouvez résoudre ces erreurs en configurant votre nouveau projet d'application avec le même ensemble de références que votre projet initial..

La capture d'écran suivante montre la même référence d'assemblage ajoutée aux deux projets..

Si votre code partagé utilise des API spécifiques à Windows, utilisez la commande #ifdef directive avec le WINDOWS_APP constante pour isoler cette section de code. Utilisez le WINDOWS_PHONE_APP constante pour isoler des sections de code spécifiques à Windows Phone 8.1.

Étape 2: Partagez App.xaml

Lorsque vous créez une nouvelle solution pour une application Windows universelle, Visual Studio place App.xaml dans le projet partagé. Si vous convertissez un projet existant en application Windows universelle, vous pouvez déplacer App.xaml au projet partagé manuellement. Vous devrez définir la propriété d'action de construction de la page sur ApplicationDefinition après avoir déplacé le fichier. Voici les étapes à suivre:

  • dans le Explorateur de solution, dans le projet partagé, sélectionnez le App.xaml fichier.
  • Sélectionnez le Vue > Propriétés la fenêtre.
  • dans le Propriétés fenêtre, dans le Construire l'action liste déroulante, sélectionnez ApplicationDefinition.

Vous devez également décider comment vous souhaitez ouvrir la première page de votre application. Si vous partagez le App.xaml fichier et souhaitez utiliser une page de démarrage différente pour chaque application, vous devez ajouter #ifdef directives comme indiqué ci-dessous.

#if WINDOWS_APP if (! rootFrame.Navigate (typeof (HubPage))) #endif #if WINDOWS_PHONE_APP if (! rootFrame.Navigate (typeof (WindowsPhoneStartPage))) #endif lance une nouvelle exception ("Echec de la création de la page initiale"); 

6. Commencez à écrire une application Windows universelle

Étape 1: Configuration du projet

Tout d’abord, choisissez un modèle de projet pour une application Windows universelle dans le Nouveau projet boite de dialogue. La capture d'écran suivante montre les modèles de projet d'applications Windows universelles actuellement disponibles pour C #..

Donnez un nom au projet. j'utiliserai Hex Clock Pro pour mon projet.

Étape 2: Construction de l'interface utilisateur

Pour la plupart, le travail d’interface utilisateur a lieu dans les projets spécifiques à la plate-forme, ce qui vous permet de concevoir une interface utilisateur qui a fière allure sur un PC, une tablette et un téléphone, mais qui partage des données, des ressources, des composants et même des vues communes. des modèles.

Au lieu de créer des interfaces utilisateur distinctes pour les versions Windows Phone 8.1 et Windows 8.1 de Hex Clock Pro, je définis une conception commune dans le projet partagé. Je dois juste faire quelques changements dans l'application XAML de l'horloge sur Tuts + pour que cela fonctionne pour les deux plates-formes..

                       

Étape 3: partage du code

Comme indiqué précédemment, le code commun aux deux plates-formes peut être placé dans le projet partagé. Le code qui utilise des API spécifiques à la plate-forme doit être placé dans l'un des projets spécifiques à la plate-forme. Vous pouvez même utiliser #ifdef directives pour inclure du code spécifique à la plateforme dans un fichier partagé.

Comme l'application Hex Clock Pro n'utilise aucune API spécifique à une plate-forme, je peux mettre tout le code dans le projet partagé..

Cacher la barre d'état

Dans MainPage.xaml.cs dans le projet partagé, nous avons utilisé le #ifdef directive pour isoler le code spécifique à Windows Phone. Le code inclus dans #ifdef masque la barre d'état sur Windows Phone.

public MainPage () this.InitializeComponent (); #if WINDOWS_PHONE_APP ApplicationView.GetForCurrentView (). SetDesiredBoundsMode (ApplicationViewBoundsMode.UseCoreWindow); #fin si 

Affichage de l'heure actuelle

J'ai utilisé le DispatcherTimer classe d'appeler une coche initiale lorsque la LayoutRoot la grille est chargée. le minuteur objet appelle le timer_Tick fonctionner à chaque tick de l'horloge. 

try DispatcherTimer timer = new DispatcherTimer (); timer.Tick + = timer_Tick; timer.Interval = new TimeSpan (0, 0, 0, 1); timer.Start (); timer_Tick (null, null); // Appeler un tick initial catch 

le timer_Tick fonction met à jour l'heure affichée dans l'application et, en même temps, met à jour la couleur de fond.

Mise à jour de la couleur de fond

La couleur d'arrière-plan est définie sur une couleur hexadécimale qui correspond à l'heure actuelle.  

Couleur HexColor = nouvelle couleur Hex (hexTime); SolidColorBrush bgBrush = nouveau SolidColorBrush (Color.FromArgb (color.A, color.R, color.G, color.B)); LayoutRoot.Background = bgBrush;

Un objet du HexColour La classe est initialisée avec l'heure actuelle et renvoie les valeurs RVB correspondantes. Le constructeur du HexColour classe définit les valeurs A, R, G, B pour la couleur spécifiée.

public HexColour (string hexCode) if (hexCode == null) lance le nouvel ArgumentNullException ("hexCode");  if (! Regex.IsMatch (hexCode, HEX_PATTERN)) lance un nouvel ArgumentException ("Le format doit être # 000000 ou # FF000000 (aucun espace supplémentaire)", "hexCode");  // enlève le symbole '#' symbole hexCode = hexCode.TrimStart ('#'); // si aucune valeur alpha n'est spécifiée, supposons l'absence de transparence (0xFF) if (hexCode.Length! = LENGTH_WITH_ALPHA) hexCode = String.Format ("FF 0", hexCode); _color = new Color (); _color.A = byte.Parse (hexCode.Substring (0, 2), NumberStyles.AllowHexSpecifier); si (_couleur.A < 50) _color.A = 50; _color.R = byte.Parse(hexCode.Substring(2, 2), NumberStyles.AllowHexSpecifier); _color.G = byte.Parse(hexCode.Substring(4, 2), NumberStyles.AllowHexSpecifier); _color.B = byte.Parse(hexCode.Substring(6, 2), NumberStyles.AllowHexSpecifier); 

Ajouter des animations et des effets

J'ai imité l'animation initiale utilisée dans l'application d'horloge précédente sur Tuts + et elle est initialisée lorsque le LayoutRoot est chargé.

Storyboard sb = (Storyboard) this.Resources ["IntialAnimation"]; sb.BeginTime = TimeSpan.FromSeconds (0.1); sb.Begin ();

C'est tout ce dont nous avons besoin pour créer l'application Hex Clock Pro. L'application utilise 100% de code partagé. Il vous suffit de générer des packages d'applications distincts pour les deux plates-formes. L'application est très similaire sur Windows Phone et utilise le même code XAML pour son interface utilisateur.

Notez que j'ai ajouté tout le code XAML et C # dans le projet partagé, mais lorsque je déploie l'application Windows ou l'application Windows Phone, le code du projet partagé est fusionné en interne avec les projets spécifiques à la plate-forme..

Conclusion

La plupart du code de l'application Windows et de l'application Windows Phone est partagé. Bien que les interfaces utilisateur soient distinctes, elles sont suffisamment similaires pour que la création des deux nécessite moins de travail que la création de deux interfaces utilisateur à partir de zéro..

Si j'avais construit une version Windows Phone de Hex Clock Pro pour Windows Phone 7 ou 8, cela aurait été beaucoup plus laborieux, car Windows Phone 7 ne contient aucune API WinRT et Windows Phone 8 ne contient qu'un petit sous-ensemble..

Avec Windows 10, nous verrons plus de convergence, ce qui signifie une API - l’API WinRT - pour plusieurs plates-formes et un degré élevé de fidélité entre les éléments d’interface utilisateur pour chaque plate-forme, ce qui n’empêche pas les développeurs d’utiliser des éléments spécifiques à la plate-forme pour présenter la meilleure expérience possible sur chaque appareil. N'hésitez pas à télécharger les fichiers source du didacticiel à utiliser comme référence. Hex Clock Pro est également disponible sur le marché pour Windows Phone 8.1 et Windows 8.1.