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..
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:
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:
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..
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 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..
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..
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.
Vous pouvez déplacer le code que vous souhaitez partager entre les applications dans le projet partagé. Par exemple, vous pouvez déplacer le Commun, Modè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.
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:
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");
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.
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..
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é..
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
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.
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);
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..
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.