Professional Documents
Culture Documents
télécharger l’exemple
Le livre création d’applications mobiles avec Xamarin.Forms par Charles Petzold est un guide
pour apprendre à écrire des applications Xamarin.Forms. La seule condition requise est la base
de connaissances de la C# langage de programmation. Ce livre fournit une exploration complète
dans l’interface utilisateur de Xamarin.Forms et couvre également l’animation, MVVM,
déclencheurs, les comportements, des dispositions personnalisées, des convertisseurs
personnalisés et bien plus encore.
Le livre a été publié dans le ressort de 2016 et n’a pas été mis à jour depuis. Il existe une grande partie dans le
carnet qui seront utiles reste, mais certains le matériau est obsolète, et certaines rubriques ne sont plus
entièrement correcte ou terminée.
Exemples
Les exemples sont disponible sur githubet incluent des projets pour iOS, Android et la plateforme universelle
Windows (UWP ). (Xamarin.Forms ne gère plus de Windows 10 Mobile, mais les applications Xamarin.Forms
seront exécutera sur le bureau Windows 10).
NOTE
Notes sur chaque page indiquent où Xamarin.Forms est différente de la matière présentée dans le livre.
Exemples
Dans le xamarin-forms-livre-samples référentiel GitHub, le code d’origine à partir de livre branche contient
des exemples de programme cohérents avec le livre. Le master branche contient des projets qui ont été mis à
niveau pour supprimer les API déconseillées et refléter API améliorées. En outre, les projets Android dans le
master branche ont été mis à niveau pour Android Material Design via AppCompat et s’affichent généralement
texte noir sur un arrière-plan blanc.
Liens associés
Blog de MS Press
Exemple de code de livre
Résumé du chapitre 1. Comment Xamarin.Forms est-il
intégré ?
11/01/2019 • 10 minutes to read • Edit Online
télécharger l’exemple
NOTE
Notes sur cette page indiquent des zones où Xamarin.Forms est différente de la matière présentée dans le livre.
Une des tâches plus désagréables de programmation consiste à porter un code de base à partir d’une plateforme à
l’autre, en particulier si cette plateforme implique un langage de programmation différents. Il est tentant, lorsque le
portage du code pour refactoriser d’également, mais si les deux plateformes doivent être conservées en parallèle,
puis les différences entre les deux bases de code seront compliquer une maintenance ultérieure.
La solution c# et .NET
Bien que Objective-C, Java et c# sont toutes dérivées de langage de programmation C, ils ont évolué en chemins
d’accès très différentes. C# est la plus récente de ces langages et a été maturation de façons très utile. En outre, c#
est étroitement associé à une infrastructure de programmation entière, appelée .NET, qui prend en charge la
mathématiques, le débogage, la réflexion, collections, globalisation, d’e/s de fichier, mise en réseau, sécurité,
threading, services web, gestion des données et XML et JSON de lecture et l’écriture.
Xamarin fournit actuellement des outils pour cibler le Mac, iOS et Android API à l’aide de c# et .NET native. Ces
outils sont appelés Xamarin.Mac, Xamarin.iOS et Xamarin.Android, collectivement regroupés sous la plateforme
Xamarin. Il s’agit des bibliothèques et des liaisons qui expriment les API natives de ces plateformes avec les
langages .NET.
Les développeurs peuvent utiliser la plateforme Xamarin pour écrire des applications en c# qui cible Mac, iOS ou
Android. Mais si vous ciblez plusieurs plateformes, il est judicieux de partager une partie du code entre les
plateformes cibles. Cela implique la séparation du programme en code dépend de la plateforme (généralement
impliquant l’interface utilisateur) et de code indépendant de la plateforme, ce qui nécessite généralement
uniquement base .NET framework. Ce code indépendant de la plateforme peut résider dans une bibliothèque de
classes Portable (PCL ), ou un projet partagé, souvent appelé projet de ressource partagé ou SAP.
NOTE
Bibliothèques de classes portables ont été remplacés par des bibliothèques .NET Standard. Exemples de code à partir de
l’ouvrage a été converti pour utiliser les bibliothèques .NET standard.
Présentation de Xamarin.Forms
Lorsque vous ciblez plusieurs plateformes mobiles, Xamarin.Forms permet le partage de code encore plus. Un seul
programme écrit pour Xamarin.Forms peut cibler ces plateformes :
iOS pour les programmes qui s’exécutent sur l’iPhone, iPad et iPod touch
Android pour les programmes qui s’exécutent sur les téléphones et tablettes Android
la plateforme Windows universelle pour cible Windows 10
NOTE
Xamarin.Forms ne gère plus de Windows 8.1, Windows Phone 8.1 ou Windows 10 Mobile, mais les applications
Xamarin.Forms s’exécutent sur le bureau Windows 10. Il est également prise en charge de la version préliminaire de la Mac,
WPF, GTK #, et Tizen plateformes.
La majeure partie d’un programme de Xamarin.Forms existe dans une bibliothèque ou un SAP. Chacune des
plateformes se compose d’un stub de petite application qui appelle ce code partagé.
Les APIs Xamarin.Forms mapper à des contrôles natifs sur chaque plateforme, afin que chaque plateforme gère
son apparence caractéristique :
Installation
Avant de créer et de création d’une application Xamarin.Forms, vous devriez créer et créer séparément une
application iOS, une application Android et une application UWP, selon les plateformes que vous souhaitez cible et
votre environnement de développement.
Les sites web de Xamarin et Microsoft contiennent des informations sur la façon de procéder :
Bien démarrer avec iOS
Bien démarrer avec Android
Centre de développement Windows
Une fois que vous pouvez créer et n’exécuter des projets pour ces plateformes individuelles, vous devez avoir
aucun problème de création et exécution d’une application Xamarin.Forms.
Liens connexes
Chapitre 1 de texte intégral (PDF )
Exemple de chapitre 1
Résumé du chapitre 2. Anatomie d’une application
31/01/2019 • 15 minutes to read • Edit Online
télécharger l’exemple
NOTE
Notes sur cette page indiquent des zones où Xamarin.Forms est différente de la matière présentée dans le livre.
Dans une application Xamarin.Forms, les objets qui occupent l’espace sur l’écran sont appelés éléments visuels, il
est encapsulé par le VisualElement classe. Éléments visuels peuvent être divisées en trois catégories
correspondant à ces classes :
Page
Disposition
Affichage
Un Page dérivé occupe tout l’écran, ou presque tout l’écran. Souvent, l’enfant d’une page est un Layout dérivé
pour organiser les éléments visuels enfants. Les enfants de la Layout peut être autre Layout classes ou View
dérivés (souvent appelé éléments), qui sont des objets familiers tels que le texte, images bitmap, curseurs, boutons,
zones de liste et ainsi de suite.
Ce chapitre montre comment créer une application en se concentrant sur la Label , qui est le View dérivée qui
affiche du texte.
Saluez
Sur la plateforme Xamarin est installée, vous pouvez créer une solution Xamarin.Forms dans Visual Studio ou
Visual Studio pour Mac. Le Hello solution utilise une bibliothèque de classes Portable pour le code commun.
NOTE
Bibliothèques de classes portables ont été remplacés par des bibliothèques .NET Standard. Exemples de code à partir de
l’ouvrage a été converti pour utiliser les bibliothèques .NET standard.
Cet exemple montre une solution Xamarin.Forms créée dans Visual Studio sans aucune modification. La solution
se compose de six projets :
Hello, une bibliothèque de classes Portable (PCL ) partagés par les autres projets
Hello.Droid, un projet d’application pour Android
Hello.iOS, un projet d’application pour iOS
Hello.UWP, un projet d’application pour la plateforme Windows universelle (Windows 10 et Windows 10
Mobile)
Hello.Windows, un projet d’application pour Windows 8.1
Hello.WinPhone, un projet d’application pour Windows Phone 8.1
NOTE
Xamarin.Forms ne gère plus de Windows 8.1, Windows Phone 8.1 ou Windows 10 Mobile, mais les applications
Xamarin.Forms s’exécutent sur le bureau Windows 10.
Vous pouvez apporter l’une de ces projets d’application du projet de démarrage, puis générer et exécuter le
programme sur un appareil ou un simulateur.
Dans la plupart de vos programmes de Xamarin.Forms, vous ne modifient les projets d’application. Souvent, ils
restent minuscules stubs simplement pour lancer le programme. La majeure partie de votre objectif sera de la
bibliothèque commune à toutes les applications.
NOTE
Les modèles de solution Visual Studio pour Xamarin.Forms créent une page avec un fichier XAML. XAML n’est pas abordé
dans cet ouvrage jusqu'à chapitre 7.
Le références section de la Hello projet PCL inclut les assemblys Xamarin.Forms suivants :
Xamarin.Forms.Core
Xamarin.Forms.Xaml
Xamarin.Forms.Platform
Le références sections des projets de cinq application incluent des assemblys supplémentaires qui s’appliquent à
chaque plate-forme :
Xamarin.Forms.Platform.Android
Xamarin.Forms.Platform.iOS
Xamarin.Forms.Platform.UWP
Xamarin.Forms.Platform.WinRT
Xamarin.Forms.Platform.WinRT.Tablet
Xamarin.Forms.Platform.WinRT.Phone
NOTE
Le références sections de ces projets répertorient ne sont plus les assemblys. Au lieu de cela, le fichier projet contient un
PackageReference étiquettes référençant le package Xamarin.Forms NuGet. Le références section dans les listes de Visual
Studio le Xamarin.Forms package plutôt que les assemblys Xamarin.Forms.
Chacun des projets d’application contient un appel à la méthode statique Forms.Init méthode dans le
Xamarin.Forms espace de noms. Ce code initialise la bibliothèque Xamarin.Forms. Une version différente de
Forms.Init est défini pour chaque plateforme. Vous trouverez les appels à cette méthode dans les classes
suivantes :
iOS : AppDelegate
Android : MainActivity
UWP : App (classe), OnLaunched (méthode)
En outre, chaque plateforme doit instancier la App classe emplacement dans la bibliothèque partagée. Cela se
produit dans un appel à LoadApplication dans les classes suivantes :
iOS : AppDelegate
Android : MainActivity
UWP : MainPage
Sinon, ces projets d’application sont des programmes de « ne rien faire » normal.
NOTE
Bibliothèques de classes portables a été remplacée par des bibliothèques .NET Standard. Exemples de code à partir de
l’ouvrage a été converti pour utiliser les bibliothèques .NET standard. Sinon, les bibliothèques .NET Standard et de
bibliothèque de classes portable sont conceptuellement très similaires.
Les regroupements d’approche de bibliothèque tous les courantes de code dans un projet de bibliothèque
référencé par les projets d’application de plateforme. Avec l’approche SAP, le code commun existe dans tous les
projets d’application de plateforme efficacement et est partagé entre eux.
La plupart des développeurs Xamarin.Forms préfère l’approche de la bibliothèque. Dans cet ouvrage, la plupart
des solutions utilisent une bibliothèque. Ceux qui utilisent SAP incluent un Sap suffixe du nom de projet.
L’approche SAP le code dans le projet partagé permet d’exécuter un code différent pour les différentes
plateformes à l’aide de directives de préprocesseur c# ( #if , # elif , et #endif ) avec ces prédéfinis des
identificateurs :
iOS : __IOS__
Android : __ANDROID__
UWP : WINDOWS_UWP
Dans une bibliothèque partagée, vous pouvez déterminer la plateforme que vous exécutez lors de l’exécution,
comme vous le verrez plus loin dans ce chapitre.
Étiquettes de texte
Le Greetings solution montre comment ajouter un nouveau fichier c# à la Greetings projet. Ce fichier définit une
classe nommée GreetingsPage qui dérive de ContentPage . Dans cet ouvrage, la plupart des projets contiennent
une seule ContentPage dérivé dont le nom est le nom du projet avec le suffixe Page ajouté.
Le GreetingsPage constructeur instancie un Label vue, qui est la vue Xamarin.Forms qui affiche du texte. Le Text
propriété est définie sur le texte affiché par le Label . Ce programme définit la Label à la Content propriété du
ContentPage . Le constructeur de la App classe instancie ensuite GreetingsPage et lui affecte son MainPage
propriété.
Le texte est affiché dans le coin supérieur gauche de la page. Sur iOS, cela signifie qu’il chevauche barre d’état de
la page. Il existe plusieurs solutions à ce problème :
Solution 1. Inclure la marge intérieure dans la page
Définir un Padding propriété sur la page. Padding est de type Thickness , une structure avec quatre propriétés :
Left
Top
Right
Bottom
Padding définit une zone à l’intérieur d’une page où le contenu est exclu. Cela permet la Label pour éviter le
remplacement de la barre d’état iOS.
Solution 2. Inclure la marge intérieure simplement pour iOS (SAP uniquement)
Définir une propriété « Marge » uniquement sur iOS à l’aide d’un SAP avec une directive de préprocesseur c#.
Cela est illustré dans le GreetingsSap solution.
Solution 3. Inclure la marge intérieure simplement pour iOS (bibliothèque de classes portable ou SAP)
Dans la version de Xamarin.Forms utilisé pour le livre, un Padding propriété spécifique à iOS dans une
bibliothèque de classes portable ou une SAP peut être sélectionnée à l’aide de la Device.OnPlatform ou
Device.OnPlatform<T> méthode statique. Ces méthodes sont désormais déconseillés.
Le Device.OnPlatform méthodes sont utilisées pour exécuter du code de plateforme spécifique ou pour
sélectionner les valeurs spécifiques à la plateforme. En interne, elles rendent utilisent le Device.OS en lecture seule
propriété statique, qui retourne un membre de la TargetPlatform énumération :
iOS
Android
Windows pour les appareils UWP.
Le Device.Idiom propriété en lecture seule statique est liée. Cela retourne un membre de la TargetIdiom , ce qui a
ces membres :
Desktop
Tablet
Phone
Unsupported n’est pas utilisé
Pour iOS et Android, la limite entre Tablet et Phone est une largeur de portrait de 600 unités. Pour la plateforme
Windows, Desktop indique une application UWP s’exécutant sous Windows 10, et Phone indique une application
UWP s’exécutant sous Windows 10 application.
Un Alignment propriété de type LayoutAlignment , une énumération avec quatre membres : Start , ce qui
signifie que gauche ou supérieur en fonction de la orientation, Center , End , ce qui signifie que le droit ou
inférieur selon l’orientation, et Fill .
Un Expands propriété de type bool .
Généralement ces propriétés ne sont pas utilisées directement. Au lieu de cela, les combinaisons de ces deux
propriétés sont fournies par huit propriétés en lecture seule statiques de type LayoutOptions :
LayoutOptions.Start
LayoutOptions.Center
LayoutOptions.End
LayoutOptions.Fill
LayoutOptions.StartAndExpand
LayoutOptions.CenterAndExpand
LayoutOptions.EndAndExpand
LayoutOptions.FillAndExpand
HorizontalOptions et VerticalOptions sont des propriétés les plus importantes dans la disposition de
Xamarin.Forms et sont décrits plus en détail dans chapitre 4. Défilement de la pile.
Voici le résultat avec la HorizontalOptions et VerticalOptions propriétés de Label toutes deux définies sur
LayoutOptions.Center :
Ces deux propriétés sont définies uniquement par Label , tandis que le HorizontalAlignment et VerticalAlignment
propriétés sont définies par View et héritée par toutes les View dérivés. Les résultats visuels peuvent sembler
similaires, mais ils sont très différents, comme illustré dans le chapitre suivant.
Liens connexes
Chapitre 2, texte intégral (PDF )
Exemples de chapitre 2
Chapitre 2 F# exemples
Bien démarrer avec Xamarin.Forms
Résumé du chapitre 3. Détails du texte
11/01/2019 • 12 minutes to read • Edit Online
télécharger l’exemple
Ce chapitre explore le Label vue plus en détail, y compris les couleurs, polices et la mise en forme.
Plusieurs méthodes d’instance permettent la modification d’une couleur existante pour créer une nouvelle couleur :
AddLuminosity
MultiplyAlpha
WithHue
WithLuminosity
WithSaturation
Enfin, deux propriétés statiques en lecture seule définissent la valeur de couleur spécial :
Color.Default , la valeur tous les canaux –1
Color.Accent
Color.Default Permet d’appliquer le modèle de couleurs de la plateforme, et par conséquent a une signification
différente dans différents contextes sur différentes plateformes. Par défaut, les jeux de couleurs de plateforme
sont :
iOS : Texte sombre sur un arrière-plan clair
Android : Texte sur un arrière-plan foncé (dans le livre) ou texte sombre sur un arrière-plan clair de lumière
(pour Material Design via AppCompat dans le master branche de l’exemple de référentiel de code)
UWP : Texte sombre sur un arrière-plan clair
Le Color.Accent valeur les résultats dans une couleur spécifique à la plateforme (et parfois sélectionnables par
l’utilisateur) qui est visible sur un arrière-plan sombre ou clair.
Le NamedFontSizes programme utilise un seul Label et un FormattedString objet pour afficher toutes les tailles
de police nommé pour chaque plateforme.
Liens connexes
Chapitre 3 de texte intégral (PDF )
Exemples de chapitre 3
Chapitre 3 F# exemples
Label
Utilisation des couleurs
Résumé du chapitre 4. Défilement de la pile
08/12/2018 • 11 minutes to read • Edit Online
télécharger l’exemple
Ce chapitre est principalement consacré au introduisant le concept de disposition, qui est le terme général pour les
classes et les techniques de Xamarin.Forms utilise pour organiser l’affichage visuel de plusieurs vues sur la page.
Disposition implique plusieurs classes qui dérivent de Layout et Layout<T> . Ce chapitre se concentre sur
StackLayout .
NOTE
Le FlexLayout introduite dans Xamarin.Forms 3.0 peut être utilisé de manière similaire à StackLayout , mais avec plus de
souplesse.
A également introduit dans ce chapitre sont les ScrollView , Frame , et BoxView classes.
Piles de vues
StackLayout dérive de Layout<View> et hérite d’un Children propriété de type IList<View> . Vous ajoutez
plusieurs éléments d’affichage à cette collection, et StackLayout les affiche dans une pile horizontale ou verticale.
Définir le Orientation propriété du StackLayout à un membre de la StackOrientation énumération, soit
Vertical ou Horizontal . La valeur par défaut est Vertical .
Définir le Spacing propriété du StackLayout à un double valeur à spécifier un espacement entre les enfants. La
valeur par défaut est 6.
Dans le code, vous pouvez ajouter des éléments à la Children collection de StackLayout dans un for ou
foreach boucle comme illustré dans le ColorLoop exemple, ou vous pouvez initialiser le Children collection
avec une liste des vues individuelles comme illustré dans ColorList. Les enfants doivent dériver de View mais
peut inclure d’autres StackLayout objets.
L’option se développe
Lorsqu’un StackLayout piles ses enfants, chacun d’eux occupe une position particulière au sein de la hauteur totale
de la StackLayout qui varie selon la taille de l’enfant et les paramètres de son HorizontalOptions et
VerticalOptions propriétés. Ces propriétés sont attribuées aux valeurs de type LayoutOptions .
La discussion suivante implique un StackLayout avec une orientation verticale par défaut. Horizontal StackLayout
est analogue.
Pour un vertical StackLayout , le HorizontalOptions paramètre détermine la façon dont un enfant est positionné
horizontalement dans la largeur de la StackLayout . Un Alignment paramètre Start , Center , ou End provoque
l’enfant d’être horizontalement sans contrainte. L’enfant détermine sa propre largeur et est positionné sur la
gauche, centre ou à droite de la StackLayout . Le Fill option entraîne l’enfant à limiter horizontalement et remplit
la largeur de la StackLayout .
Pour un vertical StackLayout , chaque enfant est verticalement sans contrainte et obtient un vertical de
l’emplacement en fonction de la hauteur de l’enfant, auquel cas la VerticalOptions paramètre n’est pas pertinent.
Si vertical StackLayout lui-même est sans contrainte—autrement dit si son VerticalOptions paramètre est Start
, Center , ou End , puis la hauteur de la StackLayout est la hauteur totale de ses enfants.
Toutefois, si la verticale StackLayout est contraint verticalement—si son VerticalOptions paramètre est Fill —
puis la hauteur de la StackLayout sera la hauteur de son conteneur, ce qui peut être supérieure au total hauteur de
ses enfants. Si tel est le cas, et si au moins un enfant a un VerticalOptions avec un Expands indicateur de true ,
puis l’espace supplémentaire dans le StackLayout est répartis équitablement entre tous les enfants avec un
Expands indicateur de true . La hauteur totale des enfants sera ensuite égale à la hauteur de la StackLayout et le
Alignment dans le cadre de la VerticalOptions paramètre détermine la façon dont l’enfant est positionnée
verticalement dans son emplacement.
Cela est illustré dans le VerticalOptionsDemo exemple.
Frame et BoxView
Ces deux vues rectangulaires servent souvent à des fins de présentation.
Le Frame affiche un cadre rectangulaire autour d’une autre vue, ce qui peut être une disposition comme
StackLayout . Frame hérite une Content propriété à partir de ContentView que vous définissez à la vue à afficher
dans le Frame . Le Frame est transparent par défaut. Définissez les trois propriétés suivantes pour personnaliser
l’apparence de l’image :
Le OutlineColor propriété pour le rendre visible. Il est courant de définir OutlineColor à Color.Accent lorsque
vous ne connaissez pas le jeu de couleurs sous-jacent.
Le HasShadow propriété peut être définie sur true pour afficher une ombre noir sur les appareils iOS.
Définir le Padding propriété un Thickness le contenu de valeur à laisser un espace entre l’image et l’image. La
valeur par défaut est de 20 unités de tous les côtés.
Le Frame a la valeur par défaut HorizontalOptions et VerticalOptions les valeurs de LayoutOptions.Fill , ce qui
signifie que le Frame remplira son conteneur. Avec d’autres paramètres, la taille de la Frame est basée sur la taille
de son contenu.
Le Frame est illustrée dans le FramedText exemple.
Le BoxView affiche une zone rectangulaire de la couleur spécifiée par son Color propriété.
Si le est limité (son HorizontalOptions et VerticalOptions propriétés ont leurs paramètres par défaut de
BoxView
LayoutOptions.Fill ), le BoxView remplit l’espace disponible pour lui. Si le BoxView n’est pas limitée (avec
HorizontalOptions et LayoutOptions paramètres de Start , Center , ou End ), il a une dimension par défaut du
carré de 40 unités. Un BoxView peut être limité dans une dimension et sans contraintes dans l’autre.
Souvent, vous devez définir le WidthRequest et HeightRequest propriétés de BoxView afin de lui donner une taille
spécifique. Ceci est illustré par la SizedBoxView exemple.
Vous pouvez utiliser plusieurs instances de StackLayout pour combiner un BoxView et plusieurs Label instances
dans un Frame pour afficher une couleur particulière, puis placez chacun de ces vues dans une StackLayout dans
un ScrollView pour créer l’attrayante liste de couleurs affichées dans le ColorBlocks exemple :
Liens connexes
Chapitre 4 de texte intégral (PDF )
Exemples de chapitre 4
Chapitre 4 F# exemples
StackLayout
ScrollView
BoxView
Résumé du chapitre 5. Gestion des tailles
08/12/2018 • 7 minutes to read • Edit Online
télécharger l’exemple
NOTE
Notes sur cette page indiquent des zones où Xamarin.Forms est différente de la matière présentée dans le livre.
NOTE
Xamarin.Forms ne gère plus n’importe quel téléphone basée sur Windows ou un appareil mobile.
En résumé, un programmeur Xamarin.Forms ciblant les téléphones et tablettes peut supposer que toutes les
unités de mesure sont basées sur le critère suivant :
160 unités par pouce, équivalent à
64 unités pour le centimètre
En lecture seule Width et Height propriétés définies par VisualElement ont par défaut les valeurs de « simuler »
–1. Uniquement lorsqu’un élément a été dimensionné et prise en charge dans la disposition de ces propriétés
reflètent la taille réelle de l’élément dans les unités indépendantes du périphérique. Cette taille inclut au moins un
Padding défini sur l’élément, mais pas le Margin .
Un élément visuel se déclenche le SizeChanged événement lors de son Width ou Height a changé. Le WhatSize
exemple utilise cet événement pour afficher la taille de l’écran de programme.
Tailles SURMONTANT
Le MetricalBoxView utilise WidthRequest et HeightRequest pour afficher un BoxView un pouce en hauteur et
l’autre centimètre large.
Problèmes d’accessibilité
Le EstimatedFontSize programme et le FitToSizeClock programme les deux contiennent un subtil défaut : si
l’utilisateur modifie les paramètres d’accessibilité du téléphone sur Android ou Windows 10 Mobile, le programme
n’est plus peut estimer la taille du texte est rendu en fonction de la taille de police. Le AccessibilityTest exemple
illustre ce problème.
Pour un Label , le premier argument doit être de la largeur du conteneur (pour permettre le retour à la ligne),
tandis que le second argument doit être défini à Double.PositiveInfinity pour que la hauteur sans contrainte. Le
EmpiricalFontSize exemple illustre cette technique.
Liens connexes
Chapitre 5 de texte intégral (PDF )
Exemples de chapitre 5
Chapitre 5 F# exemples
Résumé du chapitre 6. Clics de bouton
08/12/2018 • 8 minutes to read • Edit Online
télécharger l’exemple
Le Button est la vue qui permet aux utilisateurs de lancer une commande. Un Button est identifié par le texte (et
éventuellement une image comme illustré dans chapitre 13, Bitmaps). Par conséquent, Button définit un grand
nombre des propriétés du mêmes comme Label :
Text
FontFamily
FontSize
FontAttributes
TextColor
Button définit également trois propriétés qui régissent l’apparence de sa bordure, mais la prise en charge de ces
propriétés et leur indépendance mutuelle est spécifiques à la plateforme :
BorderColor de type Color
BorderWidth de type Double
BorderRadius de type Double
Button hérite également toutes les propriétés de VisualElement et View , y compris BackgroundColor ,
HorizontalOptions , et VerticalOptions .
La première étape consiste à identifier toutes les variables dans la page que vous souhaitez rendre persistantes
lorsque le programme se termine. Si vous connaissez tous les endroits où ces variables changer, vous pouvez
simplement les ajouter à la Properties dictionnaire à ce stade. Dans le constructeur de la page, vous pouvez
définir les variables à partir de la Properties dictionnaire si la clé existe.
Un programme plus vaste devrez probablement à traiter les événements de cycle de vie d’application. La plus
importante est la OnSleep (méthode). Un appel à cette méthode indique que le programme a quitté le premier
plan. Peut-être l’utilisateur a appuyé sur le accueil bouton sur l’appareil, ou affiche toutes les applications ou
s’arrête le téléphone. Un appel à OnSleep est la seule notification qu’un programme reçoit avant d’être arrêté. Le
programme doit saisir cette occasion pour vous assurer que le Properties dictionnaire est à jour.
Un appel à OnResume indique que le programme ne s’est pas achevé après le dernier appel à OnSleep mais est
maintenant en cours d’exécution au premier plan à nouveau. Le programme peut utiliser cette opportunité pour
actualiser les connexions internet (par exemple).
Un appel à OnStart se produit lors du démarrage du programme. Il n’est pas nécessaire d’attendre jusqu'à ce que
l’appel de cette méthode pour accéder à la Properties dictionnaire, car le contenu a déjà été restaurée lorsque le
App constructeur est appelé.
Le PersistentKeypad exemple est très similaire à SimplestKeypad , à ceci près que le programme utilise le
OnSleep remplacement pour enregistrer l’entrée de clavier en cours, et le constructeur de la page pour restaurer
ces données.
NOTE
Une autre approche pour l’enregistrement des paramètres de programme est fournie par le Xamarin.Essentials préférences
classe.
Liens connexes
Chapitre 6 de texte intégral (PDF )
Exemples de chapitre 6
Chapitre 6 F# exemples
Bouton de Xamarin.Forms
Résumé du chapitre 7. XAML et code
08/12/2018 • 10 minutes to read • Edit Online
télécharger l’exemple
NOTE
Notes sur cette page indiquent des zones où Xamarin.Forms est différente de la matière présentée dans le livre.
Xamarin.Forms prend en charge un langage de balisage basé sur XML appelé l’Extensible Application Markup
Language ou le XAML (prononcé « zammel »). XAML offre une alternative à c# dans la définition de la disposition
de l’interface utilisateur d’une application Xamarin.Forms et dans la définition des liaisons entre les éléments
d’interface utilisateur et les données sous-jacentes.
Deux fichiers sont créés : un fichier XAML avec la .xaml d’extension de nom de fichier et un fichier c# avec
l’extension. xaml.cs. Le fichier c# est souvent appelé le code-behind du fichier XAML. Le fichier code-behind est
une définition de classe partielle qui dérive de ContentPage . Au moment de la génération, le XAML est analysé et
une autre définition de classe partielle est générée pour la même classe. Cette classe générée inclut une méthode
nommée InitializeComponent qui est appelée à partir du constructeur du fichier code-behind.
Pendant l’exécution, à la fin de la InitializeComponent appeler, tous les éléments du fichier XAML ont été
instanciés et initialisés comme si elles avaient été créées dans le code c#.
L’élément racine dans le fichier XAML est ContentPage . La balise racine contient au moins deux déclarations
d’espace de noms XML, un pour les éléments de Xamarin.Forms et l’autre définition d’un x préfixe pour les
éléments et attributs intrinsèques à toutes les implémentations XAML. La balise racine contient également un
x:Class attribut qui indique l’espace de noms et le nom de la classe qui dérive de ContentPage . Cela correspond à
l’espace de noms et le nom dans le fichier code-behind.
La combinaison de XAML et de code est illustrée par la CodePlusXaml exemple.
Le compilateur XAML
Xamarin.Forms a un compilateur XAML, mais son utilisation est facultative en fonction de l’utilisation d’un
XamlCompilationAttribute . Si le XAML n’est pas compilé, le XAML est analysé au moment de la génération et le
fichier XAML est incorporé dans la bibliothèque PCL, où il est également analysé lors de l’exécution. Si le XAML
est compilé, le processus de génération convertit le XAML dans un format binaire et le traitement de l’exécution
est plus efficace.
Quand une chaîne multiligne est définie sur le Text propriété, les caractères de fin de ligne sont convertis en
caractères d’espace, mais les caractères de fin de ligne sont conservées quand une chaîne multiligne apparaît en
tant que contenu de la Label ou Label.Text balises :
Liens connexes
Chapitre 7 de texte intégral (PDF )
Exemples de chapitre 7
Chapitre 7 F# exemple
Notions de base XAML
Résumé du chapitre 8. Code et XAML en harmonie
08/12/2018 • 5 minutes to read • Edit Online
télécharger l’exemple
Ce chapitre explore XAML de façon plus approfondie, et en particulier comment code et XAML interagissent.
L’attribut x : Name
Le x:Name attribut permet à un objet instancié dans XAML à donner un nom. Les règles pour ces noms sont les
mêmes que pour les noms de variables c#. Après le retour de la InitializeComponent appeler le constructeur, le
fichier code-behind peut faire référence à ces noms pour accéder à l’élément XAML correspondant. Les noms sont
convertis en fait par l’analyseur XAML dans les champs privés de la classe partielle générée.
Le XamlClock exemple illustre l’utilisation de x:Name pour permettre au fichier de code-behind de conserver deux
Label éléments définis dans XAML mis à jour avec la date et heure actuelles.
Le même nom ne peut pas être utilisé pour plusieurs éléments dans la même page. Il s’agit d’un problème
particulier si vous utilisez OnPlatform pour créer en parallèle des objets nommés pour chaque plateforme. Le
PlatformSpecificLabele exemple illustre un meilleur moyen de faire quelque chose de similaire.
L’accès à la ColorView classe dans XAML nécessite une autre déclaration d’espace de noms XML, généralement
nommée local pour les classes dans le même assembly.
Événements et gestionnaires
Événements peuvent être affectés aux gestionnaires d’événements dans XAML, mais le Gestionnaire d’événements
doit être implémenté dans le fichier code-behind. Le XamlKeypad montre comment créer une interface utilisateur
de clavier dans XAML et comment implémenter le Clicked gestionnaires dans le fichier code-behind.
Liens connexes
Chapitre 8 de texte intégral (PDF )
Exemples du chapitre 8
Chapitre 8 F# exemple
Passage des Arguments dans XAML
Résumé du chapitre 9. Appels d’API spécifiques à la
plateforme
08/12/2018 • 3 minutes to read • Edit Online
télécharger l’exemple
NOTE
Notes sur cette page indiquent des zones où Xamarin.Forms est différente de la matière présentée dans le livre.
Il est parfois nécessaire d’exécuter du code qui varie par plateforme. Ce chapitre explore les techniques.
Une bibliothèque ne peut pas accéder normalement les classes dans les projets d’application. Cette restriction
semble pour empêcher la technique démontrée dans PlatInfoSap2 d’être utilisé dans une bibliothèque. Toutefois,
Xamarin.Forms contient une classe nommée DependencyService qui utilise la réflexion .NET pour accéder à des
classes publiques dans le projet d’application à partir de la bibliothèque.
La bibliothèque doit définir un interface avec les membres qu’il a besoin pour chaque plateforme. Ensuite,
chacune des plateformes contient une implémentation de cette interface. La classe qui implémente l’interface doit
être identifiée avec un DependencyAttribute sur le niveau de l’assembly.
La bibliothèque utilise ensuite le générique Get méthode de DependencyService pour obtenir une instance de la
classe de plateforme qui implémente l’interface.
Cela est illustré dans le DisplayPlatformInfo exemple.
Liens connexes
Chapitre 9 de texte intégral (PDF )
Exemples du chapitre 9
Service de dépendance
Résumé du chapitre 10. Extensions de balisage XAML
08/12/2018 • 7 minutes to read • Edit Online
télécharger l’exemple
Normalement, l’analyseur XAML convertit n’importe quelle chaîne définie comme valeur d’attribut sur le type de la
propriété en fonction de conversion des types de données .NET de base, standard ou un TypeConverter dérivé est
attaché à la propriété ou son type avec un TypeConverterAttribute .
Mais il est parfois utile de définir un attribut à partir d’une autre source, par exemple, un élément dans un
dictionnaire, ou la valeur d’une propriété statique ou d’un champ, ou d’un calcul quelconque.
Il s’agit du travail d’un extension de balisage XAML. Malgré son nom, les extensions de balisage XAML sont pas
une extension au format XML. XAML est toujours juridique XML.
L’infrastructure de code
Une extension de balisage XAML est une classe qui implémente le IMarkupExtension interface. Une telle classe
comporte souvent le mot Extension à la fin de son nom, mais s’affiche généralement dans XAML sans ce suffixe.
Les extensions de balisage XAML suivantes sont prises en charge par toutes les implémentations de XAML :
x:Static prise en charge par StaticExtension
x:Reference prise en charge par ReferenceExtension
x:Type prise en charge par TypeExtension
x:Null prise en charge par NullExtension
x:Array prise en charge par ArrayExtension
Ces quatre extensions de balisage XAML sont prises en charge par de nombreuses implémentations du XAML, y
compris Xamarin.Forms :
StaticResource prise en charge par StaticResourceExtension
DynamicResource prise en charge par DynamicResourceExtension
Binding prise en charge par BindingExtension —abordés dans chapitre 16. Liaison de données
TemplateBinding prise en charge par TemplateBindingExtension —non traitées dans le livre
Une extension de balisage XAML supplémentaire est incluse dans Xamarin.Forms en lien avec RelativeLayout :
ConstraintExpression —non couvertes dans le livre
Dictionnaires de ressources
Le VisualElement classe définit une propriété nommée Resources que vous pouvez définir pour un objet de type
ResourceDictionary . Dans XAML, vous pouvez stocker les éléments dans ce dictionnaire et les identifier avec le
x:Key attribut. Les éléments stockés dans le dictionnaire de ressources sont partagées entre toutes les références
à l’élément.
StaticResource pour la plupart des cas
Dans la plupart des cas, vous utiliserez le StaticResource extension de balisage pour référencer un élément du
dictionnaire de ressources, comme illustré dans le ResourceSharing exemple . Vous pouvez utiliser un
StaticResourceExtension élément ou StaticResource entre accolades :
Le HslColorExtension classe satisfait ces exigences. Il crée une valeur de type Color en fonction des valeurs de
propriétés nommées H , S , L , et A . Cette classe est le premier élément dans une bibliothèque Xamarin.Forms
nommée Xamarin.FormsBook.Toolkit qui est développée et utilisé au cours de ce livre.
Le CustomExtensionDemo exemple montre comment référencer cette bibliothèque et d’utiliser l’extension de
balisage personnalisée.
Liens connexes
Chapitre 10 de texte intégral (PDF )
Chapitre 10 échantillons
Extensions de balisage XAML
Résumé du chapitre 11. Infrastructure Bindable
08/12/2018 • 8 minutes to read • Edit Online
télécharger l’exemple
Tous les programmeurs c# est familiarisé avec c# propriétés. Les propriétés contiennent une définir accesseur
et/ou un obtenir accesseur. Elles sont souvent appelées propriétés CLR pour le Common Language Runtime.
Xamarin.Forms définit une définition de propriété améliorée appelée un propriété pouvant être liée encapsulé par
le BindableProperty classe et pris en charge par le BindableObject classe. Ces classes sont associés mais bien
distincts : le BindableProperty est utilisé pour définir la propriété proprement dite ; BindableObject est similaire à
object : c’est une classe de base des classes qui définissent les propriétés pouvant être liées.
Une application peut définir ou obtenir le Text propriété du Label normalement, ou l’application peut définir le
Text en appelant le SetValue méthode définie par BindableObject avec un Label.TextProperty argument. De
même, une application peut obtenir la valeur de la Text propriété en appelant le GetValue (méthode), en utilisant
un Label.TextProperty argument. Cela est illustré par la PropertySettings exemple.
En effet, le Text propriété CLR est entièrement implémentée à l’aide de la SetValue et GetValue méthodes
définies par BindableObject conjointement avec le Label.TextProperty propriété statique.
BindableObject et BindableProperty prennent en charge pour :
Ce qui donne les valeurs de propriétés par défaut
Stockage de leurs valeurs actuelles
Offrant des mécanismes de valider les valeurs de propriété
Maintenir la cohérence entre les propriétés associées dans une classe unique
Répondre aux modifications de propriétés
Déclencher des notifications lorsqu’une propriété est sur le point de changer ou a changé
Prise en charge de la liaison de données
Prise en charge des styles
Prise en charge des ressources dynamiques
Chaque fois qu’une propriété qui est associée à la modification d’une propriété pouvant être liée, BindableObject
se déclenche un PropertyChanged événement qui identifie la propriété qui a changé. Cet événement n’est pas
déclenché lorsque la propriété est définie sur la même valeur.
Certaines propriétés ne sont pas soutenues par les propriétés pouvant être liées et certaines classes de
Xamarin.Forms — comme Span — ne dérivent pas de BindableObject . Seule une classe qui dérive de
BindableObject peut prendre en charge les propriétés pouvant être liées, car BindableObject définit le SetValue
et GetValue méthodes.
Étant donné que Span ne dérive pas de BindableObject , aucune de ses propriétés — comme Text — sont
soutenus par une propriété pouvant être liée. C’est pourquoi un DynamicResource définition sur le Text propriété
du Span lève une exception dans le DynamicVsStatic exemple dans le chapitre précédent. Le
DynamicVsStaticCode exemple montre comment définir une ressource dynamique dans le code à l’aide du
SetDynamicResource méthode définie par Element . Le premier argument est un objet de type BindableProperty .
De même, le SetBinding méthode définie par BindableObject a un premier argument de type BindableProperty .
Cela est illustré dans le AltLabel classe dans le Xamarin.FormsBook.Toolkit bibliothèque. La classe dérivée de
Label et vous permet de spécifier une taille de police en points. Il est montré dans le PointSizedText exemple.
Étant donné que defaultValue est de type object , le compilateur doit être en mesure de déterminer le type de la
valeur par défaut. Par exemple, si le returnType est double , la defaultValue doit être défini sur quelque chose
comme 0.0 plutôt que simplement 0, ou l’incompatibilité de type déclenchera une exception lors de l’exécution.
Il est également très courant pour une propriété pouvant être liée à inclure :
propertyChanged : une méthode statique appelée lorsque la propriété change de valeur. Le premier argument
est l’instance de la classe dont la propriété a été modifiée.
Les autres arguments de BindableProperty.Create ne sont pas aussi courantes :
defaultBindingMode : utilisé dans le cadre de la liaison de données (comme indiqué dans chapitre 16. Liaison
de données)
validateValue : un rappel pour rechercher une valeur valide
propertyChanging : un rappel pour indiquer le moment où la propriété va être modifiée
coerceValue : un rappel pour forcer une valeur définie à une autre valeur
defaultValueCreate : un rappel pour créer une valeur par défaut qui ne peut pas être partagée entre des
instances de la classe (par exemple, une collection)
La propriété peut être liée en lecture seule
Une propriété peut être en lecture seule. Création d’une propriété en lecture seule, vous devez appeler la méthode
statique BindableProperty.CreateReadOnly pour définir un champ statique privé en lecture seule de type
BindablePropertyKey .
Ensuite, définissez la propriété CLR set accesseur d’en tant que private pour appeler un SetValue surcharge
avec le BindablePropertyKey objet. Ainsi, la propriété est définie en dehors de la classe.
Cela est illustré dans le CountedLabel classe utilisée dans le BaskervillesCount exemple.
Liens connexes
Chapitre 11 de texte intégral (PDF )
Exemples de chapitre 11
Propriétés pouvant être liées
Résumé du chapitre 12. Styles
08/12/2018 • 8 minutes to read • Edit Online
télécharger l’exemple
Dans Xamarin.Forms, les styles permettent plusieurs vues partager une collection de paramètres de propriété. Cela
réduit le balisage et que vous permet de maintenir cohérentes thèmes visuels.
Les styles sont presque toujours définis et utilisés dans le balisage. Un objet de type Style est instancié dans un
dictionnaire de ressources et la Style propriété d’un élément visuel en utilisant un StaticResource ou
DynamicResource balisage extension.
Le Style de base
Un Style nécessite que son TargetType être définie sur le type de l’objet visuel, il s’applique à. Quand un Style
est instancié dans un dictionnaire de ressources (comme c’est commun) il requiert également un x:Key attribut.
Le Style a une propriété de type de contenu Setters , qui est une collection de Setter objets. Chaque Setter
associe un Property avec un Value .
Dans XAML les Property paramètre est le nom d’une propriété CLR (comme le Text propriété de Button ), mais
la propriété de style doit reposer sur une propriété pouvant être liée. En outre, la propriété doit être définie dans la
classe indiquée par le TargetType paramètre ou héritées par cette classe.
Vous pouvez spécifier le Value définition à l’aide de l’élément de propriété <Setter.Value> . Cela vous permet de
définir Value à un objet qui ne peuvent pas être exprimé dans une chaîne de texte, ou à un OnPlatform de l’objet,
ou à un objet instancié à l’aide de x:Arguments ou x:FactoryMethod . Le Value propriété peut également être
définie avec un StaticResource expression à un autre élément dans le dictionnaire.
Le BasicStyle programme illustre la syntaxe de base et indique comment référencer la Style avec un
StaticResource extension de balisage :
Le Style objet et tout objet créé dans le Style objet comme un Value paramètre sont partagés entre toutes les
vues faisant référence à cette Style . Le Style ne peut pas contenir tout ce qui ne peut pas être partagée, comme
un View dérivé.
Impossible de définir des gestionnaires d’événements dans un Style . Le GestureRecognizers propriété ne peut
pas être définie dans un Style , car il n’est pas associé à une propriété pouvant être liée.
Styles de code
Bien qu’il n’est pas courant, vous pouvez instancier et initialiser Style objets dans le code. Cela est illustré par la
BasicStyleCode exemple.
Héritage de style
Style a un BasedOn propriété que vous pouvez définir pour un StaticResource extension de balisage faisant
référence à un autre style. Ainsi, les styles hériter des styles précédentes et ajouter ou remplacer les paramètres de
propriété. Le StyleInheritance illustre cela.
Si Style2 repose sur Style1 , le TargetType de Style2 doit être le même que Style1 ou dérivé Style1 . Le
dictionnaire de ressources dans lequel Style1 est stocké doit être le même dictionnaire de ressources en tant que
Style2 ou un dictionnaire de ressources plus haut dans l’arborescence visuelle.
Styles implicites
Si un Style dans une ressource dictionnaire n’a pas un x:Key attribut de paramètre, il est affecté
automatiquement, une clé de dictionnaire et Style objet devient un style implicite. Une vue sans un Style
paramètre et dont le type correspond à la TargetType exactement trouverez ce style, comme le ImplicitStyle
illustre.
Un style implicite peut dériver un Style avec un x:Key paramètre mais pas l’inverse. Vous ne pouvez pas
référencer explicitement un style implicite.
Vous pouvez implémenter les trois types de hiérarchie avec des styles et BasedOn :
À partir de styles définis sur le Application et Page jusqu'à styles définis sur les dispositions plus bas dans
l’arborescence visuelle.
À partir de styles définis pour les classes de base telles que VisualElement et View pour les styles définis pour
les classes spécifiques.
À partir de styles avec des clés de dictionnaire explicite pour les styles implicites.
Ces hiérarchies sont illustrées dans le StyleHierarchy exemple.
Styles dynamiques
Un style dans un dictionnaire de ressources peut être référencé par DynamicResource plutôt que StaticResource .
Cela rend le style un style dynamique. Si ce style est remplacé dans le dictionnaire de ressources par un autre style
avec la même clé, les vues référençant ce style avec DynamicResource change automatiquement. En outre, l’absence
d’une entrée de dictionnaire avec la clé spécifiée entraîne StaticResource pour lever une exception, mais pas
DynamicResource .
Vous pouvez utiliser cette technique pour modifier dynamiquement un style ou thèmes comme le DynamicStyles
montre des exemples.
Toutefois, vous ne pouvez pas définir le BasedOn propriété à un DynamicResource extension de composition, car
BasedOn n’est pas sauvegardé par une propriété pouvant être liée. Pour dériver un style dynamiquement, ne
définissez pas BasedOn . Au lieu de cela, définissez la BaseResourceKey propriété à la clé du style que vous souhaitez
dériver à partir du dictionnaire. Le DynamicStylesInheritance exemple illustre cette technique.
Styles d’appareils
Le Device.Styles classe imbriquée définit 12 champs en lecture seule statiques pour les six styles avec une
TargetType de Label que vous pouvez utiliser pour les types courants d’utilisations de texte.
Six de ces champs sont de type Style que vous pouvez définir directement à un Style propriété dans le code :
BodyStyle
TitleStyle
SubtitleStyle
CaptionStyle
ListItemTextStyle
ListItemDetailTextStyle
Les six autres champs sont de type string et est utilisable comme clés de dictionnaire pour les styles dynamiques :
BodyStyleKey égal à « BodyStyle »
TitleStyleKey égal à « TitleStyle »
SubtitleStyleKey égal à « SubtitleStyle »
CaptionStyleKey égal à « CaptionStyle »
ListItemTextStyleKey égal à « ListItemTextStyle »
ListItemDetailTextStyleKey égal à « ListItemDetailTextStyle »
Liens connexes
Chapitre 12 de texte intégral (PDF )
Exemples de chapitre 12
Styles
Résumé du chapitre 13. Bitmaps
08/12/2018 • 20 minutes to read • Edit Online
télécharger l’exemple
NOTE
Notes sur cette page indiquent des zones où Xamarin.Forms est différente de la matière présentée dans le livre.
Xamarin.Forms Image élément affiche une bitmap. Toutes les plateformes de Xamarin.Forms prend en charge les
formats de fichier JPEG, PNG, GIF et BMP.
Bitmaps dans Xamarin.Forms proviennent de quatre endroits :
Sur le web tel que spécifié par une URL
Incorporé comme ressource dans la bibliothèque partagée
Incorporé comme ressource dans les projets d’application de plateforme
À partir de n’importe quel endroit qui peuvent être référencées par un .NET Stream de l’objet, y compris
MemoryStream
Ressources bitmap dans la bibliothèque partagée sont indépendant de la plateforme, tandis que les ressources de
bitmap dans les projets de plateforme sont spécifiques à la plateforme.
NOTE
Le texte du livre fait référence aux bibliothèques de classes portables, qui ont été remplacés par des bibliothèques .NET
Standard. Exemples de code à partir de l’ouvrage a été converti pour utiliser les bibliothèques .NET standard.
La bitmap est spécifiée en définissant le Source propriété du Image à un objet de type ImageSource , une classe
abstraite avec trois dérivés :
UriImageSource Pour accéder à une image bitmap sur le web basé sur un Uri objet défini sa Uri propriété
FileImageSource Pour accéder à une image bitmap stockée dans un projet d’application de plateforme basée
sur un chemin d’accès de dossier et le fichier défini sur sa File propriété
StreamImageSource pour charger une bitmap à l’aide de .NET Stream objet spécifié en retournant un Stream à
partir d’un Func définie sur sa Stream propriété
Vous pouvez également (et plus fréquemment), vous pouvez utiliser les méthodes statiques suivantes de la
ImageSource de classe, qui retournent toutes ImageSource objets :
ImageSource.FromUri Pour accéder à une image bitmap sur le web basé sur un Uri objet
ImageSource.FromResource Pour accéder à une image bitmap stockée en tant que ressource incorporée dans
l’application de bibliothèque de classes portable ; ImageSource.FromResource ou ImageSource.FromResource pour
accéder à une image bitmap dans un autre assembly source
ImageSource.FromFile Pour accéder à une image bitmap à partir d’un projet d’application de plateforme
ImageSource.FromStream pour charger une image bitmap selon un Stream objet
Il n’existe aucun équivalent de la classe de la Image.FromResource méthodes. Le UriImageSource classe est utile si
vous avez besoin de contrôler la mise en cache. Le FileImageSource classe est utile dans XAML.
StreamImageSource est utile pour le chargement asynchrone de Stream objets, tandis que ImageSource.FromStream
est synchrone.
Le WebBitmapXaml exemple est similaire, mais se contente de définir le Source URL à la propriété. La
conversion est contrôlée par le ImageSourceConverter classe.
Ajuster et remplissage
Vous pouvez contrôler la manière dont l’image bitmap est étirée en définissant le Aspect propriété de la Image à
un des membres suivants de la Aspect énumération :
AspectFit : respecte les proportions (valeur par défaut)
Fill : remplit la zone, ne respecte pas les proportions
AspectFill : remplit la zone mais respecte les proportions, faire partie de l’image bitmap de rognage
Ressources incorporées
Vous pouvez ajouter un fichier bitmap pour une bibliothèque de classes portable, ou dans un dossier dans la
bibliothèque PCL. Attribuez-lui un Action de génération de EmbeddedResource. Le ResourceBitmapCode
exemple montre comment utiliser ImageSource.FromResource pour charger le fichier. Le nom de ressource passé à
la méthode se compose du nom d’assembly, suivi d’un point, suivie du nom de dossier facultatif et un point, suivi
par le nom de fichier.
Les jeux de programme le VerticalOptions et HorizontalOptions propriétés de la Image à LayoutOptions.Center ,
ce qui rend le Image élément sans contrainte. Le Image et l’image bitmap ont la même taille :
Sur iOS et Android, le Image est la taille en pixels de la bitmap. Il existe une correspondance biunivoque entre
les pixels du bitmap et de pixels de l’écran.
Sur la plateforme Windows universelle, le Image est la taille en pixels de l’image bitmap en unités
indépendantes du périphérique. Sur la plupart des périphériques, chaque pixel de bitmap occupe plusieurs
pixels de l’écran.
Le StackedBitmap exemple met un Image dans un vertical StackLayout dans XAML. Une extension de balisage
nommée ImageResourceExtension permet de référencer la ressource incorporée dans XAML. Cette classe charge
uniquement des ressources à partir de l’assembly dans lequel il se trouve, donc il ne peut pas être placé dans une
bibliothèque.
Plus d’informations sur le dimensionnement
Il est souvent souhaitable de bitmaps de taille cohérente parmi toutes les plateformes. Expérimenter
StackedBitmap, vous pouvez définir un WidthRequest sur le Image élément dans un vertical StackLayout pour
que la taille cohérente entre les plateformes, mais vous pouvez réduire uniquement la taille à l’aide de cette
technique.
Vous pouvez également définir le HeightRequest pour rendre une image de tailles cohérente sur les plateformes,
mais la contrainte largeur de l’image bitmap limitera la polyvalence de cette technique. Pour une image dans un
vertical StackLayout , HeightRequest doit être évitée.
La meilleure approche consiste à commencer par une image bitmap plus large que la largeur de téléphone en
unités indépendantes du périphérique et définissez WidthRequest largeur souhaitée en unités indépendantes du
périphérique. Cela est illustré dans le DeviceIndBitmapSize exemple.
Le MadTeaParty affiche le chapitre 7, de Lewis Carroll aventures d’A lice au pays des merveilles avec les
illustrations d’origine par John Tenniel :
Navigation et en attente
Le ImageBrowser exemple permet à l’utilisateur de parcourir les images stockées sur le site web de Xamarin. Il
utilise le .NET WebRequest classe pour télécharger un fichier JSON avec la liste des images bitmap.
NOTE
Xamarin.Forms les programmes doivent utiliser HttpClient plutôt que WebRequest pour accéder aux fichiers via internet.
Le programme utilise une ActivityIndicator pour indiquer que quelque chose se passe. Comme chaque bitmap
est le chargement, en lecture seule IsLoading propriété du Image est true . Le IsLoading propriété repose sur
une propriété pouvant être liée, par conséquent, un PropertyChanged événement est déclenché lorsque cette
propriété est modifiée. Le programme attache un gestionnaire à cet événement et utilise le paramètre actuel de
IsLoaded pour définir le IsRunning propriété de la ActivityIndicator .
Les assemblys de plateforme contiennent déjà des bitmaps pour les icônes et écrans de démarrage :
Dans le projet iOS, dans le ressources dossier
Dans le projet Android, dans les sous-dossiers de le ressources dossier
Dans les projets Windows, dans le actifs dossier (bien que les plateformes Windows ne limitent pas les
bitmaps à ce dossier)
Le PlatformBitmaps exemple utilise du code pour afficher une icône dans les projets d’application de plateforme.
Résolutions de bitmap
Toutes les plateformes permettent de stocker plusieurs versions des images bitmap pour les résolutions de
périphérique différent. Lors de l’exécution, la version correcte est chargée en fonction de la résolution de l’appareil
de l’écran.
Sur iOS, ces bitmaps sont différenciées par le suffixe du nom de fichier :
Pas de suffixe pour les appareils de 160 DPI (1 pixel à l’unité indépendante du périphérique)
'@2x' suffixe pour les appareils de 320 DPI (2 pixels à le DIU )
'@3x' suffixe pour les appareils de 480 PPP (de 3 pixels pour le DIU )
Une image bitmap destinée à être affiché sous forme d’un pouce carré existerait dans trois versions :
MyImage.jpg à 160 pixels carrés
MyImage@2x.jpg à 320 pixels carrés
MyImage@3x.jpg à 480 pixels carrés
Le programme fait référence à cette image bitmap en tant que MyImage.jpg, mais la version correcte est
récupérée pendant l’exécution en fonction de la résolution de l’écran. Quand elles sont libres, l’image bitmap
restitue toujours à 160 unités indépendantes du périphérique.
Pour Android, les bitmaps sont stockés dans différents sous-dossiers situés de le ressources dossier :
drawable-ldpi (faible PPP ) pour les appareils de 120 DPI (0,75 pixels pour le DIU )
drawable-mdpi (moyenne) pour les appareils de 160 DPI (1 pixel à la DIU )
drawable-hdpi (élevé) pour les appareils de 240 DPI (1,5 pixels pour le DIU )
drawable-xhdpi (très élevée) pour les appareils de 320 DPI (2 pixels à le DIU )
drawable-xxhdpi (très très élevée) pour les appareils de 480 PPP (de 3 pixels pour le DIU )
drawable-xxxhdpi (trois points forts supplémentaires) pour les appareils de 640 PPP (4 pixels pour le DIU )
Pour une image bitmap destinée à être rendu à un pouce carré, les différentes versions de l’image bitmap auront
le même nom mais une taille différente et être stockées dans ces dossiers :
drawable-ldpi/MyImage.jpg à 120 pixels carrés
drawable-mdpi/MyImage.jpg à 160 pixels carrés
drawable-hdpi/MyImage.jpg à 240 pixels carrés
drawable-xhdpi/MyImage.jpg à 320 pixels carrés
drawable-xxhdpi/MyImage.jpg à 480 pixels carrés
drawable-xxxhdpi/MyImage.jpg à 640 pixels carrés
La bitmap est toujours le rendu à 160 unités indépendantes du périphérique. (Le modèle de solution
Xamarin.Forms standard inclut uniquement le hdpi, xhdpi et les dossiers xxhdpi.)
Le projet UWP prend en charge un schéma d’affectation de noms bitmap comprenant un facteur d’échelle en
pixels indépendants du périphérique unitaire sous forme de pourcentage, par exemple :
MyImage.scale-200.jpg à 320 pixels carrés
Seuls certains pourcentages sont valides. Les exemples de programmes de ce livre d’incluent uniquement les
images avec mise à l’échelle-200 suffixes, mais les modèles de solution Xamarin.Forms actuels incluent mise à
l’échelle-100, mise à l’échelle-125, mise à l’échelle-150, et mise à l’échelle-400.
Lors de l’ajout de bitmaps pour les projets de plateforme, le Action de génération doit être :
iOS : BundleResource
Android : AndroidResource
UWP : contenu
Le ImageTap exemple crée deux objets de type bouton consistant en Image éléments avec un
TapGestureRecognizer installé. Il est prévu que les objets soient carré d’un pouce. Le Source propriété du Image
est définie à l’aide de OnPlatform et On objets à référencer les noms de fichiers potentiellement différents sur les
plateformes. Les images bitmap incluent les numéros d’indiquant leur taille en pixels, pour voir quelle bitmap de
taille est récupéré et affiché.
Barres d’outils et leurs icônes
Une des principales utilisations des bitmaps de spécifique à la plateforme est la barre d’outils de Xamarin.Forms,
qui est construite en ajoutant ToolbarItem des objets sur le ToolbarItems collection définie par Page .
ToobarItem dérive de MenuItem dont elle hérite des propriétés.
Le nombre de Primary éléments doivent être limités à trois ou quatre. Vous devez inclure un Text définissant
pour tous les éléments. Pour la plupart des plateformes, uniquement le Primary éléments nécessitent une Icon
mais nécessite Windows 8.1 une Icon pour tous les éléments. Les icônes doivent être des unités indépendantes
du périphérique 32 carrées. Le FileImageSource type indique qu’ils sont spécifiques à la plateforme.
Le ToolbarItemse déclenche un Clicked événement lorsque l’utilisateur appuie dessus, comme un Button .
ToolbarItem prend également en charge Command et CommandParameter propriétés souvent utilisées dans le cadre
de MVVM. (Consultez chapitre 18, MVVM ).
IOS et Android exigent qu’une page qui affiche une barre d’outils un NavigationPage ou une page faite par un
NavigationPage . Le ToolbarDemo jeux du programme le MainPage propriété de son App classe à la
NavigationPage constructeur avec un ContentPage argument et montre le Gestionnaire d’événements et de la
construction d’une barre d’outils.
Images de bouton
Vous pouvez également utiliser des images bitmap spécifiques à la plateforme pour définir le Image propriété de
Button à une image bitmap du carré 32 unités indépendantes du périphérique, tel qu’indiqué par le
ButtonImage exemple.
NOTE
L’utilisation d’images sur les boutons a été améliorée. Consultez à l’aide de bitmaps avec des boutons.
Liens connexes
Chapitre 13, texte intégral (PDF )
Exemples de chapitre 13
Utilisation d’images
À l’aide de bitmaps avec des boutons
Résumé du chapitre 14. Disposition absolue
08/12/2018 • 10 minutes to read • Edit Online
télécharger l’exemple
Comme StackLayout , AbsoluteLayout dérive Layout<View> et hérite d’un Children propriété. AbsoluteLayout
implémente un système de disposition qui exige que le programmeur spécifier les positions de ses enfants et,
éventuellement, de leur taille. La position est spécifiée par le coin supérieur gauche de l’enfant par rapport à l’angle
supérieur gauche de la AbsoluteLayout en unités indépendantes du périphérique. AbsoluteLayout implémente
également une fonctionnalité de dimensionnement et de positionnement proportionnel.
AbsoluteLayout doit être considérée comme un système de disposition de spécial à être utilisé uniquement quand
le programmeur peut imposer une taille sur les enfants (par exemple, BoxView éléments) ou lorsque la taille de
l’élément n’affecte pas le positionnement d’autres enfants. Le HorizontalOptions et VerticalOptions propriétés
n’ont aucun effet sur les enfants d’un AbsoluteLayout .
Ce chapitre présente également la fonctionnalité importante de attaché propriétés pouvant être liées qui autorisent
les propriétés définies dans une classe (dans ce cas AbsoluteLayout ) à joindre à une autre classe (un enfant de le
AbsoluteLayout ).
Vous pouvez combiner ces éléments avec le langage c# opérateur de bits OR.
Avec ces indicateurs définis, certaines propriétés de la Rectangle structure de limites de mise en page utilisée pour
positionner et dimensionner l’enfant sont interprétés proportionnellement.
Lorsque le WidthProportional indicateur est défini, un Width valeur 1 indique que l’enfant est la même largeur
que le AbsoluteLayout . Une approche similaire est utilisée pour la hauteur.
Le positionnement proportionnelle prend la taille en compte. Lorsque le XProportional indicateur est défini, le X
propriété de la Rectangle limites de disposition est proportionnelle. Une valeur de 0 signifie que l’enfant du bord
gauche est positionnée sur le bord gauche de la AbsoluteLayout , mais une position de 1 signifie que le bord droit
de l’enfant est positionné sur le bord droit de la AbsoluteLayout , pas au-delà du bord droit de la AbsoluteLayout
comme vous le feriez notre t. Un X l’enfant horizontalement dans les centres de propriété de 0,5 le
AbsoluteLayout .
DispositionAbsolue et XAML
Vous pouvez utiliser un AbsoluteLayout dans XAML et définissez les propriétés de peut être liées attachées sur les
enfants d’un AbsoluteLayout à l’aide de valeurs d’attribut de AbsoluteLayout.LayoutBounds et
AbsoluteLayout.LayoutFlags . Cela est illustré dans le AbsoluteXamlDemo et ChessboardXaml exemples. Le
programme de ce dernier contient 32 BoxView éléments mais utilise implicite Style qui inclut le
AbsoluteLayout.LayoutFlags propriété conserver le balisage jusqu’au minimum.
Est un attribut dans XAML se compose d’un nom de classe, un point et un nom de propriété toujours une propriété
jointe peut être liée.
Superpositions
Vous pouvez utiliser AbsoluteLayout pour construire un superposition, qui couvre la page avec d’autres contrôles,
peut-être pour protéger l’utilisateur d’interagir avec les contrôles normales sur la page.
Le SimpleOverlay exemple illustre cette technique et montre la ProgressBar , qui affiche l’étendue à laquelle un
programme a terminé une tâche.
Un peu de fantaisie
Le DotMatrixClock exemple affiche l’heure actuelle avec un affichage simulé matricielle 5 / 7. Chaque point est
un BoxView (il y 228 d'entre eux) dimensionné et positionné sur le AbsoluteLayout .
Le BouncingText programme anime deux Label objets à rebondit horizontalement et verticalement sur l’écran.
Liens connexes
Chapitre 14 de texte intégral (PDF )
Exemples de chapitre 14
AbsoluteLayout
Propriétés jointes
Résumé du chapitre 15. L’interface interactive
08/12/2018 • 15 minutes to read • Edit Online
télécharger l’exemple
Ce chapitre explore huit View dérivés qui permettent d’interagir avec l’utilisateur.
Les huit vues dans ce chapitre autoriser efficacement l’utilisateur d’interagir avec les types de données de base
.NET :
Boolean Switch
Vous pouvez considérer de ces vues en tant que représentations interactives visuelles des types de données sous-
jacente. Ce concept est expliquée plus dans le chapitre suivant, chapitre 16. Liaison de données.
Les vues de six restants sont traités dans les chapitres suivants :
WebView : Chapitre 16. Liaison de données
Picker : Chapitre 19. Vues de collection
ListView : Chapitre 19. Vues de collection
TableView : Chapitre 19. Vues de collection
Map : Chapitre 28. Emplacement et mappages
OpenGLView : Non traitée dans ce livre (et aucune prise en charge pour les plateformes Windows)
Les propriétés pouvant être liées qui assortir ces propriétés de vous assurer qu’elles sont cohérentes :
Pour toutes les trois propriétés, le coerceValue méthode spécifiée pour la propriété pouvant être liée garantit
que Value entre Minimum et Maximum .
Le validateValue méthode sur MinimumProperty retourne false si Minimum est définie sur une valeur
supérieure ou égale à Maximum et il est similaire pour MaximumProperty . Retour false à partir de la
validateValue causes de la méthode un ArgumentException à signaler.
Le TextFade exemple utilise deux Slider éléments à déplacer deux Label éléments entre un AbsoluteLayout et
fondu dans l’autre.
La différence de l’exécution pas à pas
Le Stepper définit les propriétés et les événements en tant que même Slider mais le Maximum propriété est
initialisée à 100 et Stepper définit une propriété quatrième :
Increment de type double , initialisé à 1
Visuellement, la Stepper se compose de deux boutons nommés – et +. En appuyant sur – diminue Value par
Increment à un minimum de Minimum . En appuyant sur + augmente Value par Increment à un maximum de
Maximum .
Saisie de texte
Xamarin.Forms définit trois vues qui permettent l’utilisateur d’entrer et de modifier le texte :
Entry pour une seule ligne de texte
Editor plusieurs lignes de texte
SearchBar pour une seule ligne de texte à des fins de recherche.
Entry et Editor dérivent InputView , qui dérive à son View . SearchBar dérive directement de View .
Clavier et le focus
Sur les téléphones et tablettes sans claviers physiques, le Entry , Editor , et SearchBar tous les éléments de
provoquent un clavier virtuel à la fenêtre contextuelle. La présence de ce clavier sur l’écran concerne le focus
d’entrée. Une vue doit avoir à la fois son IsVisible et IsEnabled propriétés définies sur true pour obtenir le
focus d’entrée.
Deux méthodes, une propriété en lecture seule et deux événements sont impliqués avec focus d’entrée. Elles sont
définies par VisualElement :
Le Focus méthode tente de définir le focus d’entrée à un élément et retourne true en cas de réussite
Le Unfocus méthode supprime le focus d’entrée à partir d’un élément
Le IsFocused propriété en lecture seule indique si l’élément a le focus d’entrée
Le Focused événements indique quand un élément obtient le focus d’entrée
Le Unfocused événements indique quand un élément perd le focus d’entrée
Choix du clavier
Le InputView classe à partir de laquelle Entry et Editor dériver ne définit qu’une seule propriété :
Keyboard de type Keyboard
Indique le type de clavier qui s’affiche. Certains claviers sont optimisés pour des URI ou des nombres.
Le Keyboard classe permet la définition d’un clavier avec un ligne statique Keyboard.Create méthode avec un
argument de type KeyboardFlags , une énumération avec les indicateurs de bits suivants :
None la valeur 0
CapitalizeSentence la valeur 1
Spellcheck la valeur est 2
Suggestions la valeur 4
All la valeur \xFFFFFFFF
Lors de l’utilisation de la propriété multiline Editor quand au moins un paragraphe de texte est attendu, l’appel
Keyboard.Create constitue une bonne approche à la sélection d’un clavier. Pour la ligne unique Entry , les
propriétés statiques suivantes en lecture seule de Keyboard sont utiles :
Default
Text
Chat
Url
Email
Telephone
Numeric pour les nombres positifs, avec ou sans virgule décimale.
Le KeyboardTypeConverter permet de spécifier ces propriétés dans XAML, comme illustré par la EntryKeyboards
programme.
Événements et propriétés de l’entrée
La ligne unique Entry définit les propriétés suivantes :
Text de type string , le texte qui apparaît dans le Entry
TextColor de type Color
FontFamily de type string
FontSize de type double
FontAttributes de type FontAttributes
IsPassword de type bool , ce qui entraîne des caractères à masquer
Placeholder de type string , pour les couleur atténuées texte qui apparaît dans le Entry avant que quoi que
ce soit est typé
PlaceholderColor de type Color
La plateforme spécifique Annuler bouton efface le texte. Le SearchBar comporte également un bouton de
recherche spécifiques à la plateforme. En appuyant sur un de ces boutons déclenche un des deux événements qui
SearchBar définit :
Time est de type TimeSpan plutôt que DateTime , indiquant le temps écoulé depuis minuit
Format de type string , la mise en forme de chaîne initialisée à « t », le modèle d’heure courte, ce qui entraîne
un affichage de l’heure comme « 1:45 PM » dans le fuseau horaire de .NET.
Le SetTimer programme montre comment utiliser le TimePicker pour spécifier une heure d’une minuterie. Le
programme ne fonctionne que si vous le conservez au premier plan.
SetTimer montre également comment utiliser le DisplayAlert méthode de Page pour afficher un message
d’alerte.
Liens connexes
Chapitre 15 de texte intégral (PDF )
Exemples de chapitre 15
Slider
Entrée
Éditeur
DatePicker
Résumé du chapitre 16. Liaison de données
08/12/2018 • 14 minutes to read • Edit Online
télécharger l’exemple
NOTE
Notes sur cette page indiquent des zones où Xamarin.Forms est différente de la matière présentée dans le livre.
Les programmeurs souvent se retrouvent écrire des gestionnaires d’événements qui détectent lorsqu’une
propriété d’un objet a changé et l’utilisent pour modifier la valeur d’une propriété dans un autre objet. Ce
processus peut être automatisé avec la technique de liaison de données. Liaisons de données sont généralement
définis dans XAML et font partie de la définition de l’interface utilisateur.
Très souvent, ces liaisons de données connecter des objets d’interface utilisateur aux données sous-jacentes. Il
s’agit d’une technique qui est expliquée plus en chapitre 18. MVVM. Toutefois, les liaisons de données peuvent
également connecter deux ou plusieurs éléments d’interface utilisateur. La plupart des premiers exemples de
liaison de données dans ce chapitre présentent cette technique.
Les deux classes suivantes prennent en charge les extensions de balisage XAML pour les liaisons :
BindingExtension prend en charge le Binding extension de balisage
ReferenceExtension prend en charge le x:Reference extension de balisage
Code et XAML
Le OpacityBindingCode exemple montre comment définir une liaison de données dans le code :
La source est le Value propriété d’un Slider
La cible est le Opacity propriété d’un Label
Les deux objets sont connectés en définissant le BindingContext de la Label de l’objet à le Slider objet. Les
deux propriétés sont connectées en appelant un SetBinding méthode d’extension sur le Label faisant référence
à la OpacityProperty propriété pouvant être liée et le Value propriété de la Slider exprimée sous la forme un
chaîne.
Manipulation de la Slider provoque ensuite la Label à apparaître et disparaître.
Le OpacityBindingXaml est le même programme avec la liaison de données définie dans XAML. Le
BindingContext du Label est définie sur une x:Reference extension de balisage faisant référence à la Slider et
le Opacity propriété de la Label est défini sur le Binding extension de balisage avec son Path propriété faisant
référence à la Value propriété de la Slider .
Source et BindingContext
Le BindingSourceCode exemple montre une autre approche dans le code. Un Binding objet est créé en
définissant le Source propriété le Slider objet et le Path la propriété « Valeur ». Le SetBinding méthode de
BindableObject est ensuite appelée sur le Label objet.
Le Binding constructeur pourrait également avoir été utilisé pour définir le Binding objet.
Le BindingSourceXaml exemple illustre la technique comparable dans XAML. Le Opacity propriété de la
Label est définie sur une Binding extension de balisage avec Path défini sur le Value propriété et Source
définie sur une Embedded x:Reference extension de balisage.
En résumé, il existe deux façons de référencer l’objet de source de liaison :
Via le BindingContext propriété de la cible
Via le Source propriété de la Binding objet lui-même
Si les deux sont spécifiés, la seconde est prioritaire. L’avantage de la BindingContext est qu’elle est propagée à
travers l’arborescence visuelle. Il s’agit de très pratique si plusieurs propriétés de la cible sont liées au même objet
source.
Le WebViewDemo programme illustre cette technique avec le WebView élément. Deux Button héritent des
éléments de navigation et en amont un BindingContext à partir de leur parent qui fait référence à la WebView . Le
IsEnabled propriétés des deux boutons ont puis simple Binding des extensions de balisage qui ciblent le bouton
IsEnabled propriétés basées sur les paramètres de la CanGoBack et CanGoForward propriétés en lecture seule de
la WebView .
Le mode de liaison
Définir le Mode propriété du Binding à un membre de la BindingMode énumération :
OneWay afin que les modifications dans la propriété source affectent la cible
OneWayToSource afin que les modifications dans la propriété cible affecte la source
TwoWay afin que les modifications dans la source et la cible affecte les uns des autres
Default Pour utiliser le DefaultBindingMode spécifié lorsque la cible BindableProperty a été créé. Si aucun n’a
été spécifié, la valeur par défaut est OneWay pour les propriétés pouvant être liées normales, et
OneWayToSource pour les propriétés pouvant être liées en lecture seule.
NOTE
Le BindingMode énumération maintenant inclut également OnTime pour appliquer une liaison uniquement lorsque le
contexte de liaison change et non lorsque la propriété source change.
Les propriétés qui sont susceptibles d’être des cibles de liaisons de données dans les scénarios MVVM en général
ont un DefaultBindingMode de TwoWay . Ces équivalents sont :
Value propriété de Slider et Stepper
IsToggled propriété de Switch
Text propriété de Entry , Editor , et SearchBar
Date propriété de DatePicker
Time propriété de TimePicker
Le BindingModes exemple montre les modes de quatre liaison avec une liaison de données où la cible est le
FontSize propriété d’un Label et la source est le Value propriété d’un Slider . Cela permet à chaque Slider
pour contrôler la taille de police correspondantes Label . Mais le Slider éléments ne sont pas initialisés, car le
DefaultBindingMode de la FontSize propriété est OneWay .
Le ReverseBinding exemple définit les liaisons sur le Value propriété de la Slider faisant référence à la
FontSize propriété de chaque Label . Cela semble être descendante, mais il fonctionne mieux dans l’initialisation
le Slider éléments, car le Value propriété de la Slider a un DefaultBindingMode de TwoWay .
Ce comportement est analogue à la façon dont les liaisons sont définies dans MVVM, et vous utiliserez ce type de
liaison fréquemment.
Liens connexes
Chapitre 16 de texte intégral (PDF )
Exemples de chapitre 16
Liaison de données
Résumé du chapitre 17. Maîtrise de la grille
08/12/2018 • 8 minutes to read • Edit Online
télécharger l’exemple
Le Grid est un mécanisme de disposition puissants qui réorganise ses enfants en lignes et colonnes de cellules. Le
code HTML similaire à la différence table élément, le Grid est destiné uniquement à des fins de disposition
plutôt que de présentation.
La grille de base
Grid dérive de Layout<View> , qui définit un Children propriété qui Grid hérite. Vous pouvez remplir cette
collection dans XAML ou de code.
La grille dans XAML
La définition d’un Grid dans XAML commence généralement par remplissage le RowDefinitions et
ColumnDefinitions collections de la Grid avec RowDefinition et ColumnDefinition objets. Voici comment vous
établissez le nombre de lignes et colonnes de la Grid et leurs propriétés.
RowDefinition a un Height propriété et ColumnDefinition a un Width propriété, tous deux de type GridLength ,
une structure.
Dans XAML, le GridLengthTypeConverter convertit les chaînes de texte simples dans GridLength valeurs. Dans les
coulisses, le GridLength constructeur crée le GridLength valeur basée sur un nombre et une valeur de type
GridUnitType , une énumération avec trois membres :
Absolute — la largeur ou la hauteur est spécifiée en unités indépendantes du périphérique (il s’agit d’un
nombre en XAML )
Auto — la largeur ou hauteur est redimensionnée automatiquement selon le contenu de la cellule (« Auto »
dans XAML )
Star — restes hauteur ou la largeur est allouée proportionnellement (un nombre avec «* », appelé en étoile,
dans XAML )
Chaque enfant de le Grid doit également être affecté une ligne et colonne (explicitement ou implicitement). Ligne
s’étend et étendues de colonne sont facultatifs. Ceux-ci sont spécifiées à l’aide des propriétés pouvant être liées
jointes — propriétés qui sont définies par le Grid mais définies sur les enfants de le Grid . Grid définit quatre
propriétés pouvant être liées attachées statiques :
RowProperty — la ligne de base zéro ; valeur par défaut est 0
ColumnProperty — la colonne de base zéro ; valeur par défaut est 0
RowSpanProperty — le nombre de lignes enfant s’étend sur ; valeur par défaut est 1
ColumnSpanProperty — le nombre de colonnes enfant s’étend sur ; valeur par défaut est 1
Dans le code, un programme peut utiliser les huit méthodes statiques pour définir et obtenir ces valeurs :
Grid.SetRow et Grid.GetRow
Grid.SetColumn et Grid.GetColumn
Grid.SetRowSpan et Grid.GetRowSpan
Grid.SetColumnSpan et Grid.GetColumnSpan
Dans XAML, vous utilisez les attributs suivants pour la définition de ces valeurs :
Grid.Row
Grid.Column
Grid.RowSpan
Grid.ColumnSpan
Le RowDefinitions et ColumnDefinitions collections ne sont pas strictement obligatoires. S’il est absent, le Grid
crée des lignes et des colonnes pour le Grid enfants et leur donne toutes les une valeur par défaut GridLength de
«*» (en étoile).
La grille dans le code
Le GridCodeDemo exemple montre comment créer et remplir un Grid dans le code. Vous pouvez définir les
propriétés jointes pour chaque enfant directement ou indirectement en appelant supplémentaires Add méthodes
telles que Add défini par le Grid.IGridList interface.
Le graphique à barres grille
Le GridBarChart exemple montre comment ajouter plusieurs BoxView éléments à un Grid à l’aide de la majeure
partie AddHorizontal (méthode). Par défaut, ces BoxView éléments ont la même largeur. La hauteur de chaque
BoxView peut ensuite être contrôlé et ressemble à un graphique à barres.
Le Grid dans le GridBarChart exemple partages un AbsoluteLayout parent avec initialement invisible Frame . Le
programme définit également un TapGestureRecognizer sur chaque BoxView à utiliser le Frame pour afficher des
informations sur la barre drainée.
Alignement de la grille
Le GridAlignment exemple montre comment utiliser le VerticalOptions et HorizontalOptions propriétés afin
d’aligner les enfants dans un Grid cellule.
Le SpacingButtons exemple tout aussi espaces Button éléments centrés dans Grid cellules.
Les bordures et les séparateurs de cellule
Le Grid n’inclut pas une fonctionnalité qui dessine les bordures ou des séparateurs de cellule. Toutefois, vous
pouvez créer vos propres.
Le GridCellDividers montre comment définir des lignes supplémentaires et colonne en particulier pour
dynamique BoxView éléments afin de reproduire les lignes de démarcation.
Le GridCellBorders programme ne crée pas de toutes les cellules, mais au lieu de cela aligne BoxView éléments
dans chaque cellule pour imiter une bordure de cellule.
Liens connexes
Chapitre 17 de texte intégral (PDF )
Exemples de chapitre 17
Grid
Résumé du chapitre 18. MVVM
08/12/2018 • 8 minutes to read • Edit Online
télécharger l’exemple
Un des meilleurs moyens de concevoir une application est en séparant l’interface utilisateur à partir du code sous-
jacent, ce qui est parfois appelé le logique métier. Plusieurs techniques existent, mais celui qui est adapté aux
environnements basés sur le XAML est appelé Model-View -ViewModel ou MVVM.
Relations MVVM
Une application MVVM a trois couches :
Le modèle fournit des données sous-jacentes, parfois dans les fichiers ou web accède à
La vue est l’utilisateur interface ou la couche présentation, généralement implémentée dans XAML
Le ViewModel connecte le modèle et la vue
Le modèle est ignorant la du ViewModel et le ViewModel est ignorant la de la vue. Généralement, ces trois
couches se connectent entre eux à l’aide des mécanismes suivants :
Dans de nombreux programmes plus petits (et ceux qui sont encore plus important), le modèle est souvent absent
ou sa fonctionnalité est intégrée dans le ViewModel.
Le MvvmClock exemple instancie ce ViewModel et utilise des liaisons de données au ViewModel pour afficher
les mises à jour informations de date et heure.
Propriétés interactives d’un ViewModel
Propriétés d’un ViewModel peuvent être plus interactives, tel qu’indiqué par le SimpleMultiplierViewModel
(classe), qui fait partie de la SimpleMultiplier exemple. Les liaisons de données fournissent des valeurs
multiplicande et le multiplicateur de deux Slider éléments et afficher le produit avec un Label . Toutefois, vous
pouvez modifier considérablement cette interface utilisateur dans XAML sans aucune modification à la suite de
ViewModel ou le fichier code-behind.
Un ViewModel de couleur
Le ColorViewModel dans le Xamarin.FormsBook.Toolkit bibliothèque intègre les modèles de couleurs RVB et
TSL. Il est montré dans le HslSliders exemple :
Rationalisation du ViewModel
Le code dans le ViewModel peut être rationalisé en définissant un OnPropertyChanged à l’aide de la méthode la
CallerMemberName attribut, qui obtient le nom de propriété appelant automatiquement. Le ViewModelBase classe
dans le Xamarin.FormsBook.Toolkit bibliothèque effectue cette et fournit une classe de base ViewModel.
L’interface de commande
MVVM fonctionne avec les liaisons de données et des liaisons de données fonctionnent avec des propriétés, afin
de MVVM semble déficientes lorsqu’il s’agit de la gestion d’un Clicked événement d’un Button ou un Tapped
événement d’un TapGestureRecognizer . Pour autoriser les ViewModels gérer ces événements, Xamarin.Forms
prend en charge la interface de commande.
L’interface de commande se présente sous la Button avec deux propriétés publiques :
Command de type ICommand (défini dans le System.Windows.Input espace de noms)
CommandParameter de type Object
Pour prendre en charge l’interface de commande, un ViewModel doit définir une propriété de type ICommand puis
les données liées à la Command propriété de la Button . Le ICommand interface déclare deux méthodes et un
événement :
Un Execute méthode avec un argument de type object
Un CanExecute méthode avec un argument de type object qui retourne bool
Un CanExecuteChanged événement
En interne, un ViewModel définit chaque propriété de type ICommand à une instance d’une classe qui implémente
le ICommand interface. Via la liaison de données, le Button appelle initialement le CanExecute (méthode) et se
désactive si la méthode retourne false . Il définit également un gestionnaire pour le CanExecuteChanged
événements et les appels CanExecute chaque fois que cet événement est déclenché. Si le Button est activé, il
appelle le Execute méthode chaque fois que le Button un clic sur.
Vous devrez peut-être certains ViewModels antérieures à Xamarin.Forms, et ceux-ci peuvent prennent déjà en
charge l’interface de commande. Pour les ViewModels nouveau destiné à être utilisé uniquement avec
Xamarin.Forms, Xamarin.Forms fournit un Command classe et un Command<T> classe qui implémentent le ICommand
interface. Le type générique est le type de l’argument à la Execute et CanExecute méthodes.
Exécutions de méthode simple
Le PowersOfThree exemple montre comment utiliser l’interface de commande dans un ViewModel. Le
PowersViewModel classe définit deux propriétés de type ICommand et définit également deux propriétés privées
qu’il transmet à la plus simple Command constructeur. Le programme contient des liaisons de données à partir de
ce ViewModel à la Command propriétés de deux Button éléments.
Le Button éléments peuvent être facilement remplacées avec TapGestureRecognizer objets dans XAML sans
aucune modification de code.
Une calculatrice, presque
Le AddingMachine exemple rend utilisez à la fois le Execute et CanExecute méthodes de ICommand . Il utilise un
AdderViewModel classe dans le Xamarin.FormsBook.Toolkit bibliothèque. Le ViewModel contient six propriétés
de type ICommand . Celles-ci sont initialisées à partir de la Command constructeur et Command constructeur de
Command et le Command<T> constructeur de Command<T> . Les touches numériques de la machine à additionner sont
liés à la propriété qui est initialisée avec Command<T> et un string l’argument de Execute et CanExecute identifie
la clé.
Liens connexes
Chapitre 18 de texte intégral (PDF )
Exemples de chapitre 18
Modèles d’Application d’entreprise à l’aide de livre électronique Xamarin.Forms
Résumé du chapitre 19. Vues de collection
08/12/2018 • 22 minutes to read • Edit Online
télécharger l’exemple
NOTE
Notes sur cette page indiquent des zones où Xamarin.Forms est différente de la matière présentée dans le livre.
Xamarin.Forms définit trois vues qui maintiennent des collections et affichent leurs éléments :
Picker est une liste relativement courte des éléments de type chaîne qui permet à l’utilisateur à choisir une
ListView est souvent une longue liste d’éléments généralement du même type et de mise en forme,
également autoriser l’utilisateur à choisir une
TableView est une collection de cellules (généralement de différents types et des apparences) pour afficher
des données ou gérer l’entrée utilisateur
Il est courant pour les applications MVVM le ListView pour afficher la collection d’objets sélectionnable.
NOTE
Xamarin.Forms Picker inclut désormais ItemsSource et SelectedItem propriétés qui prennent en charge la liaison de
données. Consultez sélecteur.
Puis appelez SetValue et SetBinding sur le DataTemplate objet à associer les valeurs avec le Cell propriétés,
ou pour définir des liaisons de données sur le Cell propriétés faisant référence à des propriétés des éléments
dans le ItemsSource collection. Cela est illustré dans le TextCellListCode exemple.
Comme chaque élément est affiché par le ListView , une petite arborescence visuelle est construite à partir du
modèle et des liaisons de données sont établies entre l’élément et les propriétés des éléments dans cette
arborescence d’éléments visuels. Vous pouvez obtenir une idée de ce processus en installant des gestionnaires
pour les ItemAppearing et ItemDisappearing événements de la ListView , ou à l’aide d’une alternative
DataTemplate constructeur qui utilise une fonction qui est appelée chaque fois qu’arborescence d’éléments visuels
d’un élément doit être créé.
Le TextCellListXaml montre un programme fonctionnellement identique entièrement dans XAML. Un
DataTemplate balise est définie sur le ItemTemplate propriété de la ListView , puis le TextCell est défini sur le
DataTemplate . Liaisons aux propriétés des éléments dans la collection sont définies directement sur le Text et
Detail propriétés de la TextCell .
Cellules personnalisées
Dans XAML, il est possible de définir un ViewCell à la DataTemplate , puis définissez une arborescence
d’éléments visuels personnalisé en tant que le View propriété du ViewCell . ( View est la propriété de contenu de
ViewCell la ViewCell.View balises ne sont pas nécessaires.) Le CustomNamedColorList exemple illustre cette
technique :
Obtenir la taille adaptées à toutes les plateformes peut être difficile. Le RowHeight propriété est utile, mais dans
certains cas, vous voudrez avoir recours à la HasUnevenRows propriété, qui est moins efficace, mais force le
ListView pour dimensionner les lignes. Pour iOS et Android, vous devez utiliser une de ces deux propriétés pour
obtenir le dimensionnement de la ligne appropriée.
Grouper les éléments de ListView
ListView prend en charge le regroupement d’éléments et de naviguer parmi ces groupes. Le ItemsSource
propriété doit être définie sur une collection de collections : l’objet qui ItemsSource a la valeur doit implémenter
IEnumerable , et chaque élément dans la collection doit également implémenter IEnumerable . Chaque groupe doit
inclure deux propriétés : une description du groupe et une abréviation à trois lettres.
Le NamedColorGroup classe dans le Xamarin.FormsBook.Toolkit bibliothèque crée sept groupes de NamedColor
objets. Le ColorGroupList exemple montre comment utiliser ces groupes avec le IsGroupingEnabled propriété
du ListView la valeur true et le GroupDisplayBinding et GroupShortNameBinding propriétés liées aux propriétés
dans chaque groupe.
En-têtes de groupe personnalisé
Il est possible de créer des en-têtes personnalisés pour le ListView groupes en remplaçant le
GroupDisplayBinding propriété avec le GroupHeaderTemplate définition d’un modèle pour les en-têtes.
ListView et l’interactivité
Généralement d’obtenir l’interaction utilisateur avec un ListView en attachant un gestionnaire à la ItemSelected
ou ItemTapped événement, ou en définissant une liaison de données sur le SelectedItem propriété. Mais certains
types de cellule ( EntryCell et SwitchCell ) autoriser l’interaction utilisateur, et il est également possible de créer
des cellules personnalisées qui elles-mêmes interagir avec l’utilisateur. Le InteractiveListView crée 100
instances de ColorViewModel et permet à l’utilisateur modifier chaque couleur à l’aide d’un trio de Slider
éléments. Le programme utilise également le ColorToContrastColorConverter dans le
Xamarin.FormsBook.Toolkit.
ListView et MVVM
ListView joue un rôle important dans les scénarios MVVM. Chaque fois qu’un IEnumerable collection existe
dans un ViewModel, il est souvent lié à un ListView . En outre, les éléments dans la collection souvent
implémentent INotifyPropertyChanged pour lier des propriétés dans un modèle.
Une collection de ViewModel
Pour cela, Explorer le SchoolOfFineArts bibliothèque crée plusieurs classes basées sur un fichier de données
XML et des images d’étudiants fictives de l’établissement fictif.
Le Student dérive de la classe ViewModelBase . Le StudentBody classe est une collection de Student objets et
dérive également de ViewModelBase . Le SchoolViewModel télécharge le fichier XML et les assemble tous les objets.
Le StudentList programme utilise une ImageCell pour afficher les étudiants et leurs images dans un ListView :
Le ListViewHeader exemple ajoute un Header propriété mais il ne s’affiche sur Android.
Sélection et le contexte de liaison
Le SelectedStudentDetail programme lie le BindingContext d’un StackLayout à la SelectedItem propriété de
la ListView . Cela permet au programme afficher des informations détaillées sur l’étudiant sélectionné.
Menus contextuels
Une cellule peut définir un menu contextuel qui est implémenté de manière spécifique à la plateforme. Pour créer
ce menu, ajoutez MenuItem des objets sur le ContextActions propriété de la Cell .
MenuItem définit les cinq propriétés :
Text de type string
Icon de type FileImageSource
IsDestructive de type bool
Command de type ICommand
CommandParameter de type object
Le Command et CommandParameter propriétés impliquent que le ViewModel pour chaque élément contient des
méthodes pour exécuter les commandes de menu souhaitée. Dans les scénarios non MVVM, MenuItem définit
également un Clicked événement.
Le CellContextMenu illustre cette technique. Le Command propriété de chaque MenuItem est liée à une propriété
de type ICommand dans la Student classe. Définir le IsDestructive propriété true pour un MenuItem qui
supprime ou l’objet sélectionné.
Faire varier les éléments visuels
Parfois, vous voudrez légères variantes dans les visuels des éléments dans le ListView basée sur une propriété.
Par exemple, lorsqu’un point de qualité moyenne se situe antérieures à 2.0, la ColorCodedStudents exemple
affiche le nom de cette étudiant en rouge. Cela s’effectue via l’utilisation d’un convertisseur de valeurs de liaison,
ThresholdToObjectConverter , dans le Xamarin.FormsBook.Toolkit bibliothèque.
L’actualisation du contenu
Le ListView prend en charge un mouvement déroulant pour actualiser ses données. Le programme doit définir
le IsPullToRefresh propriété true pour activer cette option. Le ListView répond à la liste déroulante en
définissant son IsRefreshing propriété true et en déclenchant le Refreshing événement et (pour les scénarios
MVVM ) appelant le Execute méthode de son RefreshCommand propriété.
Code de gestion de la Refresh événement ou la RefreshCommand éventuellement met à jour les données affichées
par le ListView et définit IsRefreshing à false .
Le RssFeed exemple montre comment utiliser un RssFeedViewModel qui implémente RefreshCommand et
IsRefreshing propriétés pour la liaison de données.
En bref, TableViewa un Root propriété que vous définissez pour un TableRoot objet, qui est une collection de
TableSection objets, chacun d’eux est une collection de Cell objets. Une table comporte plusieurs sections, et
chaque section comporte plusieurs cellules. La table elle-même peut avoir un titre, et chaque section peut
contenir un titre. Bien que TableView utilise Cell dérivés, il ne fait pas utiliser de DataTemplate .
Un formulaire prosaïque
Le EntryForm exemple définit un PersonalInformation modèle de vue, une instance de qui devient le
BindingContext de la TableView . Chaque Cell dérivés dans son TableSection peut ensuite avoir des liaisons
aux propriétés de la PersonalInformation classe.
Cellules personnalisées
Le ConditionalCells exemple s’appuie sur EntryForm. Le ProgrammerInformation classe inclut une propriété
booléenne qui détermine l’applicabilité des deux propriétés supplémentaires. Pour ces deux propriétés
supplémentaires, le programme utilise un personnalisé PickerCell selon un PickerCell.xaml et PickerCell.xaml.cs
dans le Xamarin.FormsBook.Toolkit bibliothèque.
Bien que le propriétés des deux PickerCell éléments sont liés à la propriété booléenne dans
IsEnabled
ProgrammerInformation , cette technique ne semble pas fonctionner, ce qui demande à l’exemple suivant.
Sections conditionnelles
Le ConditionalSection exemple place les deux éléments sont conditionnels sur la sélection de l’élément
booléenne dans une fonction TableSection . Le fichier code-behind supprime cette section à partir de la
TableView ou ajoute il selon la propriété booléenne.
Un menu TableView
Une autre utilisation d’un TableView est un menu. Le MenuCommands exemple illustre un menu qui vous
permet de déplacer un peu BoxView autour de l’écran.
Liens connexes
Chapitre 19 de texte intégral (PDF )
Exemples de chapitre 19
Picker
ListView
TableView
Résumé du chapitre 20. E/s de fichier et asynchrone
08/12/2018 • 15 minutes to read • Edit Online
télécharger l’exemple
NOTE
Notes sur cette page indiquent des zones où Xamarin.Forms est différente de la matière présentée dans le livre.
Une interface graphique utilisateur doit répondre aux événements d’entrée d’utilisateur séquentiellement. Cela
implique que tout le traitement des événements d’entrée de l’utilisateur doit se trouver dans un thread unique,
souvent appelé le thread principal ou thread d’interface utilisateur.
Les utilisateurs attendent des interfaces graphiques utilisateur d’être réactives. Cela signifie qu’un programme doit
traiter rapidement les événements d’entrée de l’utilisateur. Si cela n’est pas possible, le traitement puis doit être
relégué aux threads secondaires de l’exécution.
Plusieurs exemples de programmes dans ce livre ont utilisé le WebRequest classe. Dans cette classe le
BeginGetResponse méthode démarre un thread de travail, qui appelle une fonction de rappel lorsqu’il est terminé.
Toutefois, cette fonction de rappel s’exécute dans le thread de travail, le programme doit donc appeler
Device.BeginInvokeOnMainThread méthode pour accéder à l’interface utilisateur.
NOTE
Xamarin.Forms les programmes doivent utiliser HttpClient plutôt que WebRequest pour accéder aux fichiers via internet.
HttpClient prend en charge les opérations asynchrones.
Une approche plus moderne pour le traitement asynchrone est disponible dans .NET et c#. Cela implique le Task
et Task<TResult> classes et autres types dans le System.Threading et System.Threading.Tasks espaces de noms,
ainsi que le C# 5.0 async et await mots clés. C’est ce que ce chapitre se concentre sur.
Le Task objets indiquent que ces méthodes implémentent le modèle asynchrone basé sur une tâche, appelé TAP.
Ces Task objets sont retournés rapidement à partir de la méthode. Le Task<T> retournent des valeurs constituent
la « promesse » qui une valeur de type TResult seront disponibles lorsque la tâche se termine. Le Task valeur
renvoyée indique une action asynchrone sera terminée, mais aucune valeur n’est retournée.
Dans tous ces cas, le Task est terminée lorsque l’utilisateur ferme la fenêtre d’alerte.
Une alerte avec des rappels
Le AlertCallbacks exemple montre comment gérer Task<bool> retournent des objets et
Device.BeginInvokeOnMainThread appels à l’aide de méthodes de rappel.
Une alerte avec les expressions lambda
Le AlertLambdas exemple illustre l’utilisation des fonctions lambda anonyme pour la gestion des Task et
Device.BeginInvokeOnMainThread appels.
Fichier d’entrée/sortie
En règle générale, le .NET System.IO espace de noms a été la source de prise en charge d’e/s de fichier. Bien que
certaines méthodes dans cet espace de noms prennent en charge les opérations asynchrones, la plupart ne le faites
pas. L’espace de noms prend également en charge plusieurs appels de méthode simple qui exécutent des fonctions
d’e/s de fichier sophistiquées.
Une bonne et mauvaise nouvelle
Toutes les plateformes prises en charge par Xamarin.Forms prise en charge le stockage local application —
stockage privé pour l’application.
Les bibliothèques Xamarin.iOS et Xamarin.Android incluent une version du .NET Xamarin a expressément
adaptées à ces deux plateformes. Ceux-ci incluent des classes provenant System.IO que vous pouvez utiliser pour
effectuer des e/s de fichier avec le stockage local des applications dans ces deux plateformes.
Toutefois, si vous recherchez ces System.IO classes dans une bibliothèque de classes portable Xamarin.Forms,
vous ne trouverez pas les. Le problème est ce fichier d’e/s de Microsoft complètement repensée pour l’API de
Runtime de Windows. Programmes qui ciblent Windows 8.1, Windows Phone 8.1 et la plateforme Windows
universelle n’utilisent pas System.IO d’e/s de fichier.
Cela signifie que vous devrez utiliser le DependencyService (abordé en chapitre 9. Appels d’API spécifiques à la
plateforme pour implémenter des e/s de fichier.
NOTE
Les bibliothèques de classes portable ont été remplacés par les bibliothèques .NET Standard 2.0, et prend en charge de .NET
Standard 2.0 System.IO types pour toutes les plateformes de Xamarin.Forms. Il n’est plus nécessaire d’utiliser un
DependencyService pour la plupart des tâches d’e/s de fichier. Consultez gestion des fichiers dans Xamarin.Forms pour une
approche plus moderne d’e/s de fichier.
Pour utiliser ces bibliothèques, une solution d’application doit inclure tous les projets de la
Xamarin.FormsBook.Platform solution et chacun des projets d’application doivent avoir une référence à la
bibliothèque correspondante dans Xamarin.FormsBook.Platform.
Le TextFileAsync solution montre comment utiliser le Xamarin.FormsBook.Platform bibliothèques. Chacun
des projets a un appel à Toolkit.Init . L’application se sert de l’e/s de fichier asynchrone fonctions.
En conservant en arrière -plan
Méthodes dans les bibliothèques qui effectuent des appels à plusieurs méthodes asynchrones — tels que le
WriteFileAsync et ReadFileASync méthodes dans le Runtime Windows FileHelper classe — peut être effectuée
quelque plus efficace à l’aide de la ConfigureAwait méthode afin d’éviter de basculer vers le thread d’interface
utilisateur.
Ne pas bloquer le thread d’interface utilisateur !
Parfois, il est tentant afin d’éviter l’utilisation de ContinueWith ou await à l’aide de la Result propriété sur les
méthodes. Cela doit être évitée pour qu’il peut bloquer le thread d’interface utilisateur ou même bloquer
l’application.
Le MandelbrotSet exemple comporte un CalculateMandeblotAsync méthode dans son fichier code-behind qui
calcule l’ensemble de Mandelbrot base noir et blanc et utilise BmpMaker placer sur une image bitmap.
Marquage de progression
Pour signaler la progression à partir d’une méthode asynchrone, vous pouvez instancier un Progress<T> classe et
de définir votre méthode asynchrone pour avoir un argument de type IProgress<T> . Cela est illustré dans le
MandelbrotProgress exemple.
Annulation de la tâche
Vous pouvez également écrire une méthode asynchrone pour être annulable. Commencer avec une classe
nommée CancellationTokenSource . Le Token propriété est une valeur de type CancellationToken . Ces données
sont transmises à la fonction asynchrone. Un programme appelle la Cancel méthode de CancellationTokenSource
(généralement en réponse à une action de l’utilisateur) pour annuler la fonction asynchrone.
La méthode asynchrone peut vérifier périodiquement la IsCancellationRequested propriété du CancellationToken
et quitter si la propriété est true , ou simplement appeler le ThrowIfCancellationRequested (méthode), dans auquel
cas la méthode se termine par un OperationCancelledException .
Le MandelbrotCancellation exemple illustre l’utilisation d’une fonction pouvant être annulée.
Un ensemble de Mandelbrot MVVM
Le MandelbrotXF exemple a une interface utilisateur plus étendue, et il est principalement basé sur un
MandelbrotModel et MandelbrotViewModel classes :
Dans le web
Le WebRequest classe utilisée dans certains exemples utilise un ancienne protocole asynchrone appelé modèle de
programmation asynchrone ou APM. Vous pouvez convertir une telle classe au protocole TAP modern à l’aide d’un
de le FromAsync méthodes dans le TaskFactory classe. Le ApmToTap illustre cela.
Liens connexes
Chapitre 20 de texte intégral (PDF )
Chapitre 20 échantillons
Utilisation de fichiers
Résumé du chapitre 21. Transformations
08/12/2018 • 11 minutes to read • Edit Online
télécharger l’exemple
Xamarin.Forms s’affiche sur l’écran dans un emplacement et une taille déterminée par son parent, qui est
généralement un Layout ou Layout<View> dérivé. Le transformer est une fonctionnalité de Xamarin.Forms qui
peut modifier cet emplacement, taille ou même l’orientation.
Xamarin.Forms prend en charge trois types de transformations :
Traduction — déplacer un élément horizontalement ou verticalement
Mise à l’échelle — modifier la taille d’un élément
Rotation — activer un élément autour d’un point ou d’un axe
Dans Xamarin.Forms, la mise à l’échelle est Isotrope ; elle affecte la largeur et la hauteur uniforme. Rotation est pris
en charge à la fois sur la surface à deux dimensions de l’écran et dans l’espace 3D. Il existe aucune transformation
d’inclinaison (ou élevée) et aucune transformation de matrice généralisée.
Transformations sont prises en charge avec huit propriétés de type double défini par le VisualElement classe :
TranslationX
TranslationY
Scale
Rotation
RotationX
RotationY
AnchorX
AnchorY
Toutes ces propriétés sont assorties de propriétés pouvant être liées. Ils peuvent être la cible de liaison de données
et un style. Chapitre 22. Animation montre comment ces propriétés peuvent être animées, mais certains
exemples de ce chapitre indiquent comment vous pouvez animer à l’aide de Xamarin.Forms minuteur.
Transformer les propriétés affectent uniquement la façon dont l’élément est rendu et faire pas affectent la façon
dont l’élément est perçu dans mise en page.
La transformation de traduction
Des valeurs différentes de zéro de la TranslationX et TranslationY propriétés déplacer un élément
horizontalement ou verticalement.
Le TranslationDemo programme vous permet de faire des essais avec ces propriétés avec deux Slider éléments
qui contrôlent la TranslationX et TranslationY propriétés d’un Frame . La transformation affecte également tous
les enfants de cet Frame .
Effets de texte
Une utilisation courante des propriétés de la traduction est pour décaler légèrement le rendu du texte. Cela est
illustré dans le TextOffsets exemple :
Un autre effet consiste à rendre plusieurs copies d’un Label pour ressembler à un bloc 3D, comme illustré dans le
BlockText exemple.
Sauts et animations
Le ButtonJump exemple utilise la traduction pour déplacer un Button chaque fois qu’il est activé par un clic, mais
son principal objectif est de démontrer que le Button reçoit l’entrée d’utilisateur à l’emplacement où le bouton est
restitué.
Le ButtonGlide exemple est similaire, mais utilise une horloge pour animer la Button d’un point vers un autre.
La transformation d’échelle
Le Scale transformation peut augmenter ou diminuer la taille rendue de l’élément. La valeur par défaut est 1. La
valeur 0 entraîne l’élément à être invisible. Valeurs négatives, l’élément semblent être pivotée de 180 degrés. Le
Scale propriété n’affecte pas la Width ou Height propriétés de l’élément. Ces valeurs restent les mêmes.
La transformation de rotation
Le Rotation propriété est spécifiée en degrés et indique une rotation autour d’un point de l’élément défini par
AnchorX et AnchorY . Le PlaneRotationDemo vous permet de faire des essais avec ces trois propriétés.
Effets de texte pivoté
Le BoxViewCircle exemple illustre les calculs nécessaires pour dessiner un cercle à l’aide de 64 minuscule
paysage BoxView éléments.
Le RotatedText exemple affiche plusieurs Label éléments avec la même chaîne de texte pivoté apparaît comme
membres spokes.
Le CircularText exemple affiche une chaîne de texte qui apparaît à la ligne dans un cercle.
Une horloge analogique
Le Xamarin.FormsBook.Toolkit bibliothèque contient un AnalogClockViewModel classe qui calcule les angles pour
entre les mains d’une horloge. Pour éviter les dépendances de plateforme dans le ViewModel, la classe utilise
Task.Delay au lieu d’un minuteur pour rechercher un nouveau DateTime valeur.
Le MinimalBoxViewClock utilise trois rotation BoxView éléments pour dessiner une horloge analogique.
Le BoxViewClock utilise BoxView pour les graphiques plus étendues, y compris les graduations marque autour
de la face de l’horloge et remet autrement faire pivoter une distance peu à partir de leurs principaux :
Liens connexes
Chapitre 21 de texte intégral (PDF )
Exemples de chapitre 21
Résumé du chapitre 22. Animation
08/12/2018 • 16 minutes to read • Edit Online
télécharger l’exemple
Vous avez vu que vous pouvez créer vos propres animations à l’aide de la minuterie Xamarin.Forms ou
Task.Delay , mais il est généralement plus simple, avec les fonctionnalités d’animation fournies par
Xamarin.Forms. Trois classes implémentent ces animations :
ViewExtensions , l’approche de haut niveau
Animation , plus polyvalent, mais il est plus difficile
AnimationExtension , le plus polyvalente plus bas niveau approche
En règle générale, les animations cibler les propriétés qui sont assorties de propriétés pouvant être liées. Cela n’est
pas obligatoire, mais ce sont les seules propriétés dynamiquement réagissent aux modifications.
Il n’existe aucune interface XAML pour ces animations, mais vous pouvez intégrer des animations dans XAML à
l’aide des techniques présentées dans chapitre 23. Déclencheurs et comportements.
Le RotateTo de la méthode change le Rotation propriété de la Button comprise entre 0 et 360 au cours de la
seconde un quart (par défaut). Si le Button l’appui sur là encore, toutefois, elle ne fait rien, car le Rotation
propriété est déjà 360 degrés.
Définition de la durée de l’animation
Le deuxième argument de RotateTo est la durée en millisecondes. Si la valeur est une valeur élevée, en appuyant
sur la Button pendant une animation démarre un nouveau commencement d’animation à l’angle actuel.
Animations relatives
Le RelRotateTo méthode effectue une rotation relative en ajoutant une valeur spécifiée à la valeur existante. Cette
méthode permet le Button à drainer plusieurs fois et pour chaque heure augmente la Rotation propriété de 360
degrés.
En attente d’animations
Toutes les méthodes d’animation dans ViewExtensions retourner Task<bool> objets. Cela signifie que vous
pouvez définir une série d’animations séquentielles à l’aide de ContinueWith ou await . Le bool achèvement
valeur de retour est false si l’animation est terminée sans interruption ou true si elle a été annulée par le
CancelAnimation (méthode), ce qui annule toutes les animations initiées par le autre méthode dans
ViewExtensions qui sont définies sur le même élément.
Animations composite
Vous pouvez combiner des animations attendues et non attendu pour créer des animations composites. Voici les
animations dans ViewExtensions qui ciblent le TranslationX , TranslationY , et Scale propriétés de
transformation :
TranslateTo
ScaleTo
RelScaleTo
Notez que TranslateTo affecte potentiellement tous deux le TranslationX et TranslationY propriétés.
Task.WhenAll et Task.WhenAny
Il est également possible de gérer des animations simultanées à l’aide de Task.WhenAll , ce qui signale lorsque
plusieurs tâches tous terminés, et Task.WhenAny , qui signale quand la première de plusieurs tâches a terminé.
Rotation et les points d’ancrage
Lorsque vous appelez le ScaleTo , RelScaleTo , RotateTo , et RelRotateTo méthodes, vous pouvez définir le
AnchorX et AnchorY propriétés pour indiquer le Centre de mise à l’échelle et la rotation.
Le CircleButton illustre cette technique par révolution un Button autour du centre de la page.
Fonctions d’accélération
En règle générale, les animations sont linéaires à partir d’une valeur de début pour une valeur de fin. Fonctions
d’accélération peuvent provoquer des animations accélérer ou ralentir leur cours. Le dernier argument facultatif
pour les méthodes d’animation est de type Easing , une classe qui définit les 11 en lecture seule les champs
statiques de type Easing :
Linear , la valeur par défaut
SinIn , SinOut , et SinInOut
CubicIn , CubicOut , et CubicInOut
BounceIn et BounceOut
SpringIn et SpringOut
Le In suffixe indique que l’effet se trouve au début de l’animation, Out signifie à la fin, et InOut signifie qu’il est
au début et à la fin de l’animation.
Le BounceButton exemple illustre l’utilisation de fonctions d’accélération.
Vos propres fonctions d’accélération
Vous pouvez également définir vous propres fonctions d’accélération en passant un Func<double, double> à la
Easing constructeur. Easing définit également une conversion implicite de Func<double, double> à Easing .
L’argument à la fonction d’accélération est toujours dans la plage de 0 à 1 comme l’animation se poursuit de façon
linéaire à partir du début à la fin. La fonction généralement retourne une valeur dans la plage de 0 à 1, mais peut
être brièvement négatif ou supérieur à 1 (comme c’est le cas avec le SpringIn et SpringOut fonctions) ou
endommage les règles si vous savez ce que vous faites.
Le UneasyScale exemple illustre une fonction d’accélération personnalisée, et CustomCubicEase montre un
autre.
Le SwingButton montre également une fonction d’accélération personnalisée et également une technique
consistant à changer la AnchorX et AnchorY propriétés au sein d’une séquence d’animations de rotation.
Le Xamarin.FormsBook.Toolkit bibliothèque possède un JiggleButton la fonction de classe qui utilise une
accélération personnalisée à jiggle un bouton lorsque vous cliquez dessus. Le JiggleButtonDemo illustre cela.
Animations d’entrée
Un seul type populaires d’animation se produit lorsqu’une page s’affiche tout d’abord. Une animation de ce type
peut être démarrée le OnAppearing la substitution de la page. Pour ces animations, de son mieux pour configurer
le XAML de la manière dont la page affichage après l’animation, initialiser et animer la disposition à partir du
code.
Le FadingEntrance exemple utilise le FadeTo méthode d’extension pour le fondu dans le contenu de la page.
Le SlidingEntrance exemple utilise le TranslateTo méthode d’extension à la diapositive dans le contenu de la
page sur les côtés.
Le SwingingEntrance exemple utilise le RotateYTo méthode d’extension pour animer la RotationY propriété. Un
RotateXTo méthode est également disponible.
Animations indéfiniment
À l’autre extrême, « forever » les animations s’exécutent jusqu'à ce que le programme se termine.Elles sont
généralement destinées à des fins de démonstration.
Le FadingTextAnimation exemple utilise FadeTo animation à deux parties de texte disparaître en fondu.
PalindromeAnimation affiche un palindrome et ensuite séquentiellement fait pivoter les lettres individuelles à
180 degrés afin qu’elles soient toutes envers. Puis la chaîne entière est retournée par 180 degrés pour lire la
même que la chaîne d’origine.
Le CopterAnimation exemple fait pivoter une simple BoxView hélicoptère lors de la révolution il autour du
centre de l’écran.
RotatingSpokes tourne BoxView rayons autour du centre de l’écran, puis fait pivoter chaque membre spoke lui-
même pour créer des modèles intéressants :
Toutefois, augmentant progressivement la Rotation propriété d’un élément peut faillir à long terme, comme le
RotationBreakdown montre des exemples.
Le SpinningImage exemple utilise RotateTo , RotateXTo , et RotateYTo pour donner l’impression que si une
image bitmap fait tourner dans l’espace 3D.
Animer la propriété bounds
La seule méthode d’extension de ViewExtensions pas encore montré est LayoutTo , qui anime efficacement en
lecture seule Bounds propriété en appelant le Layout (méthode). Cette méthode est appelée normalement par
Layout dérivés que nous aborderons dans chapitre 26. CustomLayouts.
Le LayoutTo méthode doit être limitée à des usages spéciaux. Le BouncingBox programme l’utilise pour
compresser et décompresser un BoxView comme il rebondit sur les côtés d’une page.
Le XamagonXuzzle exemple utilise LayoutTo pour déplacer des vignettes disponibles dans une implémentation
de classique puzzle de 15-16 qui affiche une image brouillée plutôt que les vignettes numérotées :
Classe d’animation
Le Animation classe a un constructeur avec cinq arguments pour définir le rappel et les méthodes terminés et les
paramètres de l’animation.
Animations enfants peuvent être ajoutées avec Add , Insert , WithConcurrent et la surcharge de WithConcurrent
.
L’objet d’animation est ensuite démarré avec un appel à la Commit (méthode).
Classe de AnimationExtensions
Le AnimationExtensions classe contient principalement des méthodes d’extension. Il existe plusieurs versions d’un
Animate (méthode) et les génériques Animate méthode est donc polyvalente pour qu’il est vraiment de la
fonction d’animation uniquement que vous avez besoin.
Utilisation de AnimationExtensions
Un seul type d’animation manquant à partir de la collection standard est une animation de couleur. Le problème
est qu’il n’existe aucun moyen de droite pour interpoler entre deux Color valeurs. Il est possible d’interpoler les
valeurs RVB individuelles, mais simplement comme étant valides interpoler les valeurs TSL.
Pour cette raison, le MoreViewExtensions classe dans le Xamarin.FormsBook.Toolkit bibliothèque contient deux
Color méthodes d’animation : RgbColorAnimation et HslColorAnimation . ( Il existe également deux méthodes
d’annulation : CancelRgbColorAnimation et CancelHslColorAnimation ).
Les deux méthodes utilisent ColorAnimation , qui effectue l’animation en appelant le générique étendu Animate
méthode dans AnimationExtensions .
Le ColorAnimations exemple illustre l’utilisation de ces deux types d’animations de couleur.
Liens connexes
Chapitre 22 de texte intégral (PDF )
Exemples de chapitre 22
Animation
Résumé du chapitre 23. Déclencheurs et
comportements
08/12/2018 • 15 minutes to read • Edit Online
télécharger l’exemple
Déclencheurs et comportements sont similaires, car ils sont tous les deux destinés à être utilisé dans les fichiers
XAML pour simplifier les interactions d’élément au-delà de l’utilisation des liaisons de données et pour étendre
les fonctionnalités des éléments XAML. Déclencheurs et comportements sont presque toujours utilisés avec les
objets d’interface utilisateur visual.
Pour prendre en charge les déclencheurs et les comportements, les deux VisualElement et Style prennent en
charge les deux propriétés de collection :
VisualElement.Triggers et Style.Triggers de type IList<TriggerBase>
VisualElement.Behaviors et Style.Behaviors de type IList<Behavior>
Déclencheurs
Un déclencheur est une condition (une modification de propriété ou le déclenchement d’un événement) qui
génère une réponse (un autre changement de propriété ou en cours d’exécution du code). Le Triggers propriété
du VisualElement et Style est de type IList<TriggersBase> . TriggerBase est une classe abstraite dont dérivent
les classes sealed quatre :
Trigger pour les réponses en fonction des modifications de propriété
EventTrigger pour les réponses en fonction de déclenchement d’événement
DataTrigger pour les réponses en fonction des liaisons de données
MultiTrigger pour les réponses selon plusieurs déclencheurs
Le déclencheur est toujours défini sur l’élément dont la propriété est en cours de modification par le déclencheur.
Le déclencheur de la plus simple
Le Trigger recherche un changement d’une valeur de propriété de classe et répond en définissant une autre
propriété du même élément.
Trigger définit trois propriétés :
Property de type BindableProperty
Value de type Object
Setters de type IList<SetterBase> , la propriété de contenu de Trigger
En outre, Trigger nécessite que la propriété suivante héritée TriggerBase être définies :
TargetType pour indiquer le type de l’élément sur lequel le Trigger est attaché
Le Property et Value constituent la condition et le Setters collection est la réponse. Lorsque l’indiquée
Property a la valeur indiquée par Value , le Setter des objets dans le Setters collection sont appliquées.
Lorsque le Property a une valeur différente, les accesseurs Set sont supprimés. Setter définit deux propriétés
qui sont les mêmes que les deux premières propriétés de Trigger :
Property de type BindableProperty
Value de type Object
Le EntryPop exemple montre comment un Trigger appliqué à un Entry peut augmenter la taille de la Entry
via la Scale propriété lorsque la IsFocused propriété de la Entry est true .
Bien qu’il n’est pas courant, la Trigger peut être défini dans le code, comme le EntryPopCode montre des
exemples.
Le StyledTriggers exemple montre comment la Trigger peuvent être définies dans un Style à appliquer à
plusieurs Entry éléments.
Déclencher des actions et les animations
Il est également possible d’exécuter un peu de code basé sur un déclencheur.Ce code peut être une animation qui
cible une propriété. Une façon courante consiste à utiliser un EventTrigger , qui définit deux propriétés :
Event de type string , le nom d’un événement
Actions de type IList<TriggerAction> , une liste d’actions à exécuter en réponse.
Pour l’utiliser, vous devez écrire une classe qui dérive de TriggerAction<T> , généralement
TriggerAction<VisualElement> . Vous pouvez définir les propriétés de cette classe. Il s’agit des propriétés CLR
normales plutôt que des propriétés pouvant être liées, car TriggerAction ne dérive pas de BindableObject . Vous
devez substituer la Invoke méthode est appelée lorsque l’action est appelée. L’argument est l’élément cible.
Le ScaleAction classe dans le Xamarin.FormsBook.Toolkit bibliothèque est un exemple. Il appelle le ScaleTo
propriété à animer le Scale propriété d’un élément. Étant donné qu’un de ses propriétés est de type Easing , le
EasingConverter classe vous permet d’utiliser la norme Easing champs statiques dans XAML.
Le EntrySwell exemple montre comment appeler le ScaleAction à partir de EventTrigger objets qui surveille le
Focused et Unfocused événements.
Le CustomEasingSwell exemple montre comment définir une fonction d’accélération personnalisée pour
ScaleAction dans un fichier code-behind.
Vous pouvez également appeler des actions à l’aide un Trigger (distinguished de EventTrigger ). Cela nécessite
que vous êtes conscient que TriggerBase définit deux collections :
EnterActions de type IList<TriggerAction>
ExitActions de type IList<TriggerAction>
Le EnterExitSwell exemple montre comment utiliser ces collections.
Plusieurs déclencheurs d’événements
Le ScaleUpAndDownAction classe dans le Xamarin.FormsBook.Toolkit appels à des bibliothèques ScaleTo à deux
reprises pour descendre en puissance. Le ButtonGrowth utilise cela dans un style EventTrigger pour fournir des
commentaires visuels lorsqu’un Button est enfoncé. Cette animation double est également possible à l’aide de
deux actions dans la collection de type DelayedScaleAction
Le ShiverAction classe dans le Xamarin.FormsBook.Toolkit bibliothèque définit une action shiver
personnalisable. Le ShiverButtonDemo illustre cela.
Le NumericValidationAction classe dans le Xamarin.FormsBook.Toolkit bibliothèque est limitée à Entry
éléments et des jeux le TextColor propriété if rouge le Text propriété n’est pas un double . Le
TriggerEntryValidation illustre cela.
Déclencheurs de données
Le DataTrigger est similaire à la Trigger , sauf qu’au lieu de la surveillance d’une propriété pour les
modifications de valeur, il surveille une liaison de données. Ainsi, une propriété dans un seul élément pour affecter
une propriété dans un autre élément.
DataTrigger définit trois propriétés :
Binding de type BindingBase
Value de type Object
Setters de type IList<SetterBase>
Le GenderColors exemple requiert le SchoolOfFineArt bibliothèque et définit les couleurs des noms des
étudiants en bleu ou rose selon le Sex propriété :
Le ButtonEnabler exemples de jeux le IsEnabled propriété d’un Entry à False si le Length propriété de la
Text propriété de la Entry est égal à 0. Notez que le Text propriété est initialisée avec une chaîne vide ; par
défaut, il est null et le DataTrigger ne fonctionnent pas correctement.
Combinaison de conditions dans le MultiTrigger
Le MultiTrigger est une collection de conditions. Lorsqu’ils sont tous les true , puis les accesseurs Set est
appliquées. La classe définit deux propriétés :
Conditions de type IList<Condition>
Setters de type IList<Setter>
Condition est une classe abstraite et dispose de deux classes descendants :
PropertyCondition , qui a Property et Value propriétés telles que Trigger
BindingCondition , qui a Binding et Value propriétés telles que DataTrigger
Dans le conditionsd exemple, un BoxView est coloré uniquement lorsqu’il y a quatre Switch éléments sont tous
activés.
Le OrConditions exemple montre comment vous pouvez effectuer un BoxView une couleur lorsque n’importe
quel de quatre Switch éléments sont sous tension. Cela nécessite une application de la loi de Morgan à
l’Allemagne et en inversant toute la logique.
Combinaison de AND et ou logique n’est pas si facile et nécessite généralement invisible Switch éléments des
résultats intermédiaires. Le XorConditions exemple montre comment un Button peut être activée si une de deux
Entry éléments ont du texte tapé, mais pas s’ils ont tous deux du texte tapé dans.
comportements
Tout ce que vous pouvez faire avec un déclencheur, vous pouvez également faire avec un comportement, mais les
comportements nécessitent toujours une classe qui dérive de Behavior<T> et remplace les deux méthodes
suivantes :
OnAttachedTo
OnDetachingFrom
L’argument est l’élément auquel le comportement est associé à. En règle générale, le OnAttachedTo méthode
attache des gestionnaires d’événements, et OnDetachingFrom détache les. Étant donné qu’une telle classe
enregistre généralement un état, il généralement ne peut pas être partagé dans un Style .
BehaviorEntryValidation exemple est similaire à TriggerEntryValidation sauf qu’elle utilise un comportement
— le NumericValidationBehavior classe dans le Xamarin.FormsBook.Toolkit bibliothèque.
Comportements avec des propriétés
Behavior<T> dérive de Behavior , qui dérive à son BindableObject , de sorte que les propriétés pouvant être liées
peuvent être définies sur un comportement. Ces propriétés peuvent être actives dans les liaisons de données.
Cela est illustré dans le EmailValidationDemo programme et qui utilisent le ValidEmailBehavior classe dans le
Xamarin.FormsBook.Toolkit bibliothèque. ValidEmailBehavior a une propriété en lecture seule et sert de
source dans les liaisons de données.
Le EmailValidationConv exemple utilise ce même comportement pour afficher un autre type d’indicateur pour
signaler qu’une adresse de messagerie est valide.
Le EmailValidationTrigger exemple est une variante de l’exemple précédent. ButtonGlide utilise un DataTrigger
en association avec ce comportement.
Active/désactive et les cases à cocher
Il est possible d’encapsuler le comportement d’un bouton bascule dans une classe comme ToggleBehavior dans le
Xamarin.FormsBook.Toolkit bibliothèque, puis définissez toutes les les éléments visuels pour le bouton bascule
entièrement dans XAML.
Le ToggleLabel exemple utilise le ToggleBehavior avec un DataTrigger à utiliser un Label avec deux chaînes de
texte pour le bouton bascule.
Le FormattedTextToggle exemple étend ce concept en basculant entre deux FormattedString objets.
Le ToggleBase classe dans le Xamarin.FormsBook.Toolkit dérive de la bibliothèque ContentView , définit un
IsToggled propriété et incorpore un ToggleBehavior pour le bouton bascule logique. Cela rend plus facile de
définir le bouton bascule dans XAML, comme illustré par la TraditionalCheckBox exemple.
Le SwitchCloneDemo inclut un SwitchClone classe qui dérive de ToggleBase et utilise un TranslateAction
classe pour construire un bouton bascule qui ressemble à la Xamarin.Forms Switch .
Un RotateAction dans le Xamarin.FormsBook.Toolkit fournit une animation utilisée pour effectuer un levier
animé dans la LeverToggle exemple.
Réponse aux clics
L’inconvénient de EventTrigger est que vous ne pouvez pas attacher un TapGestureRecognizer pour répondre aux
clics. Pour contourner ce problème est l’objectif de TapBehavior dans le Xamarin.FormsBook.Toolkit
Le BoxViewTapShiver exemple utilise TapBehavior à utiliser l’ancien ShiverAction pour l’appui sur BoxView
éléments.
Le ShiverViews exemple montre comment réduire le balisage en encapsulant un ShiverView classe.
Cases d’option
Le Xamarin.FormsBook.Toolkit bibliothèque possède également un RadioBehavior classe pour effectuer des
cases d’option qui sont regroupées par un string nom du groupe.
Le RadioLabels programme utilise des chaînes de texte de sa case. Le RadioStyle exemple utilise un Style
pour la différence d’aspect entre les boutons checked et unchecked. Le RadioImages exemple utilise des images
boxed pour ses boutons radio :
Le TraditionalRadios exemple dessine traditionnel boutons radio qui apparaît avec un point à l’intérieur d’un
cercle.
Effectuer des fondus et l’orientation
L’exemple final, MultiColorSliders vous permet de basculer entre trois modes de sélection de couleur différente
à l’aide de cases d’option. Les trois vues de fondu et arrière à l’aide un FadeEnableAction dans le
Xamarin.FormsBook.Toolkit bibliothèque.
Le programme répond également aux modifications de l’orientation portrait ou paysage à l’aide un
GridOrientationBehavior dans le Xamarin.FormsBook.Toolkit bibliothèque.
Liens connexes
Chapitre 23 de texte intégral (PDF )
Exemples de chapitre 23
Utilisation des déclencheurs
Comportements de Xamarin.Forms
Résumé du chapitre 24. Navigation entre les pages
08/12/2018 • 18 minutes to read • Edit Online
télécharger l’exemple
De nombreuses applications sont constituées de plusieurs pages parmi lesquels l’utilisateur navigue. L’application
always a un principal page ou domestique page, et à partir de là, l’utilisateur navigue vers d’autres pages, qui sont
conservées dans une pile de navigation vers l’arrière. Options de navigation supplémentaires sont couverts dans
chapitre 25. Page variétés.
Les deux méthodes acceptent une Page instance en tant qu’argument et retournent un Task objet. Les deux
méthodes suivantes accédez à la page précédente :
PopAsync
PopModalAsync
Si l’interface utilisateur possède son propre retour bouton (comme les téléphones Android et Windows), il n’est
pas nécessaire pour l’application d’appeler ces méthodes.
Bien que ces méthodes sont disponibles à partir d’un VisualElement , elles sont généralement appelées à partir la
Navigation propriété du courant Page instance.
Les applications utilisent généralement des pages modales quand l’utilisateur est requis pour fournir des
informations sur la page avant de retourner à la page précédente. Les pages qui ne sont pas modales sont parfois
appelés non modales ou hiérarchique. Rien dans la page elle-même distingue en tant que modale ou non modale ;
Il est soumise à la place la méthode utilisée pour naviguer jusqu'à lui. Pour fonctionner sur toutes les plateformes,
une page modale doit fournir sa propre interface utilisateur pour revenir à la page précédente.
Le ModelessAndModal exemple vous permet d’Explorer la différence entre les pages non modales et modales.
Toute application qui utilise la navigation entre les pages doive passer sa page d’accueil pour le NavigationPage
constructeur, généralement dans le programme App classe. Un bonus est que vous n’avez plus besoin de définir
un Padding sur la page pour iOS.
Vous découvrirez que pour les non modales pages, la page Title propriété s’affiche. IOS, Android et les
plateformes de tablette et bureau Windows fournissent un élément d’interface utilisateur pour revenir à la page
précédente. Des cours, Android et Windows, les téléphones ont une norme retour bouton revenir en arrière.
Pour les pages modales, la page Title n’est pas affichée, et aucun élément d’interface utilisateur n’est fournie pour
revenir à la page précédente. Bien que vous pouvez utiliser la norme de téléphone Android et Windows retour
bouton pour revenir à la page précédente, la page modale sur d’autres plateformes doit fournir son propre
mécanisme pour revenir en arrière.
Transitions de page animés
Autres versions des différentes méthodes de navigation sont fournies avec un deuxième argument booléen que
vous définissez pour true si vous souhaitez que la transition de page à inclure une animation :
PushAsync
PushModalAsync
PopAsync
PopModalAsync
Toutefois, les méthodes de navigation de page standard incluent l’animation par défaut, afin qu’ils soient
uniquement un outil précieux pour la navigation vers une page particulière au démarrage (comme indiqué à la fin
de ce chapitre) ou lorsque vous fournissez votre propre animation d’entrée (comme indiqué dans Chapter22.
Animation).
Variations de visuels et fonctionnelles
NavigationPage inclut deux propriétés que vous pouvez définir lorsque vous instanciez la classe dans votre App
méthode :
BarBackgroundColor
BarTextColor
NavigationPage inclut également les quatre propriétés jointes pouvant être liées qui affectent la page spécifique
sur lequel elles sont définies :
SetHasBackButton et GetHasBackButton
SetHasNavigationBar et GetHasNavigationBar
SetBackButtonTitle et GetBackButtonTitle Professionnel sur iOS uniquement
SetTitleIcon et GetTitleIcon Professionnel sur iOS et Android uniquement
Explorer la mécanique
Les méthodes de navigation de page sont toutes asynchrones et doit être utilisés avec await . La saisie semi-
automatique n’indique pas que navigation entre les pages est terminée, mais uniquement qu’il est sécurisé
examiner la pile de navigation entre les pages.
Lorsqu’une page accède à un autre, la première page obtienne généralement un appel à son OnDisappearing
(méthode) et la deuxième page reçoit un appel à son OnAppearing (méthode). De même, quand une page est
retournée à l’autre, la première page reçoit un appel à son OnDisappearing (méthode) et la deuxième page obtient
généralement un appel à son OnAppearing (méthode). L’ordre de ces appels (et l’achèvement des méthodes
asynchrones qui appelle le volet de navigation) est dépendant de la plate-forme. L’utilisation du mot
« généralement » dans les deux instructions ci-dessus est en raison de la navigation modale-page Android, dans
lequel ces appels de méthode ne se produisent.
En outre, les appels à la OnAppearing et OnDisappearing méthodes n’indiquent pas nécessairement navigation
entre les pages.
Le INavigation interface inclut deux propriétés de collection qui vous permettent d’examiner la pile de navigation :
NavigationStack de type IReadOnlyList<Page> pour la pile non modale
ModalStack de type IReadOnlyList<Page> pour la pile modale
Il est plus sûr d’accéder à ces piles à partir de la Navigation propriété de la NavigationPage (qui doit être le App la
classe MainPage propriété). Il n’est plus sûr examiner ces piles une fois que les méthodes de navigation de page
asynchrone est terminé. Le CurrentPage propriété de la NavigationPage n’indique pas la page actuelle si la page
actuelle est une page modale, mais indique à la place la dernière page non modale.
Le SinglePageNavigation exemple vous permet d’Explorer la navigation entre les pages et les piles et les types
juridiques de navigation de page :
Une page non modale peut naviguer vers une autre page non modale ou une page modale
Une page modale peut uniquement naviguer vers une autre page modale
En appliquant la modalité
Une application utilise une page modale lorsqu’il est nécessaire obtenir des informations à partir de l’utilisateur.
L’utilisateur doit être interdit de retourner à la page précédente jusqu'à ce que cette information est fournie. Sur
iOS, il est facile de fournir un retour bouton et activez-la uniquement lorsque l’utilisateur a fini avec la page. Mais
pour les appareils Android et Windows phone, l’application doit remplacer le OnBackButtonPressed méthode et
retournez true si le programme a géré le retour bouton lui-même, comme illustré dans le ModalEnforcement
exemple.
Le MvvmEnforcement exemple illustre comment cela fonctionne dans un scénario MVVM.
Variations de navigation
Si une page modale particulier peut être accédée à plusieurs fois, il doit conserver les informations afin que
l’utilisateur peut modifier les informations au lieu de taper tous dans une nouvelle fois. Vous pouvez le gérer en
conservant l’instance particulière de la page modale, mais une meilleure approche (en particulier sur iOS )
conserve les informations contenues dans un modèle de vue.
Rendre un menu de navigation
Le ViewGalleryType exemple montre comment utiliser un TableView pour répertorier les éléments de menu.
Chaque élément est associé un Type objet pour une page particulière. Lorsque cet élément est sélectionné, le
programme instancie la page et navigue vers elle.
Le ViewGalleryInst exemple est un peu différente car le menu contient des instances de chaque page plutôt que
des types. Cela permet de conserver les informations à partir de chaque page, mais toutes les pages doivent être
instanciés au démarrage du programme.
Manipulation de la pile de navigation
StackManipulation montre plusieurs fonctions définies par INavigation qui vous permettent de manipuler la
pile de navigation de manière structurée :
RemovePage
InsertPageBefore
PopToRootAsync et PopToRootAsync avec animation facultative
Génération de page dynamique
Le BuildAPage exemple illustre la construction d’une page lors de l’exécution en fonction de l’entrée d’utilisateur.
Liens connexes
Chapitre 24 de texte intégral (PDF )
Exemples de chapitre 24
Navigation hiérarchique
Pages modales
Résumé du chapitre 25. Types de page
08/12/2018 • 8 minutes to read • Edit Online
télécharger l’exemple
Jusqu'à présent, vous avez vu deux classes qui dérivent de Page : ContentPage et NavigationPage . Ce chapitre
présente deux autres :
MasterDetailPage gère les deux pages, un serveur maître et un détail
TabbedPage gère plusieurs pages enfants accédés via les onglets
Ces types de page fournissent les options de navigation plus sophistiquées que la NavagationPage abordés dans
chapitre 24. Navigation entre les pages.
Maître / détail
Le MasterDetailPage définit deux propriétés de type Page : Master et Detail . En règle générale, vous définissez
chacune de ces propriétés pour un ContentPage . Le MasterDetailPage affiche et permet de basculer entre ces deux
pages.
Il existe deux méthodes fondamentales pour basculer entre ces deux pages :
Fractionner où maître et détail sont côte à côte
menu où la page de détails couvre ou couvre partiellement le contrôleur de page
Il existe plusieurs variantes de la menu approche (diapositive, se chevauchent, et échange), mais il s’agit
généralement de plateforme dépendants. Vous pouvez définir le MasterDetailBehavior propriété du
MasterDetailPage à un membre de la MasterBehavior énumération :
Default
Split
SplitOnLandscape
SplitOnPortrait
Popover
Toutefois, cette propriété n’a aucun effet sur les téléphones. Les téléphones ont toujours un comportement de
menu. Seuls les tablettes et les postes de travail windows peuvent avoir un comportement de fractionnement.
Analyse des comportements
Le MasterDetailBehaviors exemple vous permet de faire des essais avec le comportement par défaut sur
différents appareils. Le programme contient deux distinct ContentPage dérivés pour maître et détail (avec un
Title propriété définie sur les deux) et une autre classe qui dérive de MasterDetailPage qui combine les. La page
de détails est placée dans un NavigationPage , car le programme UWP ne fonctionnerait pas sans lui.
Les plateformes Windows 8.1 et Windows Phone 8.1 exigent qu’une image bitmap soit définie sur le Icon
propriété de la page maître.
Retour à l’école
Le SchoolAndDetail exemple adopte une approche un peu différente à construire le programme affiche les
étudiants à partir de la SchoolOfFineArt bibliothèque.
Le Master et Detail propriétés sont définies avec des arborescences d’éléments visuels dans le
SchoolAndDetailPage.xaml fichier, qui dérive de MasterDetailPage . Ceci permet des liaisons de données à définir
entre les pages maître et détail.
Que les fichiers XAML définit également la IsPresented propriété du MasterDetailPage à True . Cela entraîne la
page maître à afficher au démarrage. par défaut, la page de détails s’affiche. Le SchoolAndDetailPage.xaml.cs
fichier définit IsPresented à false lorsqu’un élément est sélectionné à partir de la ListView dans la page maître.
La page de détails s’affiche ensuite :
TabbedPage
Le TabbedPage est une collection de pages que vous pouvez passer à l’aide des onglets. Il dérive MultiPage<Page>
et ne définit aucun propriétés ou méthodes publiques qui lui sont propres. MultiPage<T> , toutefois, définit une
propriété :
Children propriété de type IList<T>
Toutefois, cette approche ne fonctionne pas correctement sur iOS lors de la collection contient plusieurs éléments.
MultiPage<T> définit les propriétés vous permettent d’effectuer le suivi de page qui est actuellement affichée :
CurrentPage de type T , qui fait référence à la page
SelectedItem de type Object , qui fait référence à l’objet dans le ItemsSource collection
Le StudentNotes exemple comporte une page d’accueil qui répertorie tous les étudiants. Lors de l’appui sur un
étudiant, il accède à un TabbedPage dérivé, StudentNotesDataPage , qui intègre trois ContentPage objets dans son
arborescence d’éléments visuels, un d'entre eux permet d’entrer des remarques pour que les élèves.
À l’aide d’un modèle ItemTemplate
Le MultiTabbedColor exemple utilise le NamedColor classe dans le Xamarin.FormsBook.Toolkit bibliothèque.
Le MultiTabbedColorsPage.xaml fichier définit les DataTemplate propriété de TabbedPage vers un début de
l’arborescence d’éléments visuels avec ContentPage qui contient des liaisons aux propriétés de NamedColor (y
compris une liaison à la Title propriété).
Toutefois, cela peut être problématique sur iOS. Quelques-uns des éléments peuvent être affichées, et il n’existe
aucun bon moyen de leur donner des icônes.
Liens connexes
Chapitre 25 de texte intégral (PDF )
Exemples du chapitre 25
Page maître / détails
Page à onglets
Résumé du chapitre 26. Dispositions personnalisées
08/12/2018 • 15 minutes to read • Edit Online
télécharger l’exemple
Xamarin.Forms inclut plusieurs classes dérivées de Layout<View> :
StackLayout ,
Grid ,
AbsoluteLayout et
RelativeLayout .
Ce chapitre explique comment créer vos propres classes qui dérivent de Layout<View> .
Avant la Layout appeler, Height et Width comportent des valeurs fictifs –1.
Un appel à Layout déclenche également des appels aux méthodes protégées suivantes :
SizeAllocated , qui appelle
OnSizeAllocated , qui peut être substitué.
Une fois que le livre a été publié, le GetSizeRequest méthode a été déconseillée et remplacée par
Measure
Le Measure méthode prend en compte la Margin propriété et comprend un argument de type MeasureFlag , qui a
deux membres :
IncludeMargins
None Pour ne pas inclure les marges
Pour de nombreux éléments, GetSizeRequest ou Measure Obtient la taille native de l’élément à partir de son
convertisseur. Les deux méthodes ont des paramètres pour la largeur et la hauteur contraintes. Par exemple, un
Label utilisera la contrainte de largeur pour déterminer comment encapsuler plusieurs lignes de texte.
Les deux GetSizeRequest et Measure retournent une valeur de type SizeRequest , qui a deux propriétés :
Request de type Size
Minimum de type Size
Très souvent ces deux valeurs sont identiques et le Minimum valeur peut généralement être ignorée.
VisualElement définit également une méthode protégée similaire à GetSizeRequest qui est appelée à partir de
GetSizeRequest :
Chaque classe qui dérive de Layout ou Layout<T> doit substituer OnSizeRequest ou OnMeasure . Il s’agit d’où une
classe de disposition détermine sa propre taille, qui est généralement basé sur la taille de ses enfants, il obtient en
appelant GetSizeRequest ou Measure sur les enfants. Avant et après l’appel OnSizeRequest ou OnMeasure ,
GetSizeRequest ou Measure apporte des ajustements basés sur les propriétés suivantes :
Le PhotoWrap exemple met un WrapLayout dans un ScrollView pour l’affichage des photos en stock.
Aucune dimension sans contrainte autorisée !
Le UniformGridLayout dans le Xamarin.FormsBook.Toolkit bibliothèque est destinée à afficher tous ses enfants
en lui-même. Par conséquent, il ne peut pas traiter avec des dimensions sans contrainte et lève une exception si un
est rencontré.
Le PhotoGrid illustre UniformGridLayout :
Le Layout classe définit deux méthodes qui vous permettent de déplacer un enfant au sein de la collection :
LowerChild Pour déplacer un enfant au début de la collection
RaiseChild Pour déplacer un enfant à la fin de la collection
Pour les enfants qui se chevauchent, enfants à la fin de la collection s’affichent visuellement au-dessus enfants au
début de la collection.
Le OverlapLayout classe dans le Xamarin.FormsBook.Toolkit bibliothèque définit une propriété jointe pour
indiquer l’ordre de rendu et permettra ainsi à un de ses enfants à afficher sur les autres. Le StudentCardFile
illustre cela :
Plus attaché propriétés pouvant être liées
Le CartesianLayout classe dans le Xamarin.FormsBook.Toolkit bibliothèque définit des propriétés pouvant être
liées attachées pour spécifier deux Point valeurs et un valeur d’épaisseur et manipule BoxView éléments qui
ressemble à celle des lignes.
Le UnitCube exemple qui utilise pour dessiner un cube 3D.
Mise en page et LayoutTo
Un Layout<T> dérivé peut appeler LayoutTo plutôt que Layout pour animer la disposition. Le
AnimatedCartesianLayout classe pour cela et le AnimatedUnitCube illustre cela.
Liens connexes
Chapitre 26 de texte intégral (PDF )
Exemples de chapitre 26
Création de dispositions personnalisées
Résumé du chapitre 27. Renderers personnalisés
08/12/2018 • 7 minutes to read • Edit Online
télécharger l’exemple
NOTE
Notes sur cette page indiquent des zones où Xamarin.Forms est différente de la matière présentée dans le livre.
Un élément Xamarin.Forms comme Button est rendu avec un bouton spécifique à la plateforme encapsulé dans
une classe nommée ButtonRenderer . Voici le version iOS de ButtonRenderer , le version Android du
ButtonRenderer et le version UWP de ButtonRenderer .
Ce chapitre explique comment vous pouvez écrire vos propres convertisseurs pour créer des vues personnalisées
qui mappent aux objets spécifiques à la plateforme.
NOTE
Le WinRT mentionnés dans le livre des assemblys ne font plus partie de cette solution.
Le PlatformClassHierarchy exemple affiche une hiérarchie de classes pour les assemblys qui sont valides pour la
plateforme en cours d’exécution.
Vous remarquerez une classe importante nommée ViewRenderer . Il s’agit de la classe que vous dérivez de lors de
la création d’un convertisseur spécifique à la plateforme. Il existe en trois versions différentes, car il est lié au
système de vue de la plateforme cible :
IOS ViewRenderer<TView, TNativeView> a des arguments génériques :
TView limité à Xamarin.Forms.View
TNativeView limité à UIKit.UIView
Lorsque vous écrivez un convertisseur, vous serez dérivant une classe de View , puis en écrivant plusieurs
ViewRenderer des classes, une pour chaque plateforme prise en charge. Chaque implémentation propre à la
plateforme référencera une classe native qui dérive du type que vous spécifiez comme le TNativeView ou
TNativeElement paramètre.
Tous les le ViewRendererdérivés contiennent un ExportRenderer attribut sur le niveau de l’assembly qui associe le
HelloView classe avec le particulier HelloViewRenderer classe. Voici comment Xamarin.Forms localise les
convertisseurs dans les projets de plateforme individuels :
Les types de ces propriétés sont déterminés par les paramètres génériques à ViewRenderer . Dans cet exemple,
Element est de type EllipseView .
Le OnElementPropertyChanged remplacement peut transférer par conséquent la Color valeur de la Element natif
Control objet, probablement avec un type de conversion. Les convertisseurs de trois sont :
iOS : EllipseViewRenderer , qui utilise un EllipseUIView classe pour l’ellipse.
Android : EllipseViewRenderer , qui utilise un EllipseDrawableView classe pour l’ellipse.
UWP : EllipseViewRenderer , qui peut utiliser le Windows native Ellipse classe.
Le EllipseDemo classe affiche plusieurs de ces EllipseView objets :
Les convertisseurs de détecter les modifications apportées au contrôle natif, puis appelez SetValueFromRenderer ,
qui fait référence à une propriété définie dans le StepSlider , une modification apportée à ce qui conduit le
StepSlider pour déclencher un ValueChanged événement.
Liens connexes
Chapitre 27 de texte intégral (PDF )
Exemples de chapitre 27
Renderers personnalisés
Résumé du chapitre 28. Emplacement et mappages
08/12/2018 • 18 minutes to read • Edit Online
télécharger l’exemple
NOTE
Notes sur cette page indiquent des zones où Xamarin.Forms est différente de la matière présentée dans le livre.
Xamarin.Forms prend en charge un Map élément dérivé View . En raison des exigences de plate-forme spéciales
liées à l’utilisation de cartes, elles sont implémentées dans un assembly distinct, Xamarin.Forms.Maps,
impliquent l’intervention d’un autre espace de noms : Xamarin.Forms.Maps .
NOTE
Les applications Xamarin.Forms peuvent utiliser à la place la Geolocation classe inclus dans Xamarin.Essentials.
Utilisation de Xamarin.Forms.Maps
Plusieurs conditions requises sont impliqués dans à l’aide de la Map classe.
Le package NuGet
Le Xamarin.Forms.Maps bibliothèque NuGet doit être ajouté à la solution d’application. Le numéro de version
doit être le même que le Xamarin.Forms package actuellement installé.
L’initialisation de l’ensemble de cartes
Les projets d’application doivent appeler la Xamarin.FormsMaps.Init méthode après avoir effectué un appel à
Xamarin.Forms.Forms.Init .
Le MapTypesPage.xaml fichier montre comment utiliser un bouton radio pour sélectionner le type de carte. Il
utilise le RadioButtonManager classe dans le Xamarin.FormsBook.Toolkit bibliothèque et une classe basée sur le
MapTypeRadioButton.xaml fichier.
Coordonnées de la carte
Un programme peut obtenir la zone actuelle qui le Map affiche via les VisibleRegion propriété. Cette propriété
est pas soutenu par une propriété pouvant être liée, et il n’existe aucun mécanisme de notification pour indiquer
quand elle a changé, donc un programme qui souhaite surveiller la propriété doit probablement utiliser un
minuteur à cet effet.
VisibleRegion est de type MapSpan , une classe avec quatre propriétés en lecture seule :
Center de type Position
LatitudeDegrees de type double , indiquant la hauteur de la zone affichée de la carte
LongitudeDegrees de type double , indiquant la largeur de la zone affichée de la carte
Radius de type Distance , indiquant la taille de la plus grande surface circulaire visible sur la carte
Position et Distance sont les deux structures. Position définit deux propriétés en lecture seule définies via la
Position constructeur:
Latitude
Longitude
Distance vise à fournir une distance centrée sur l’unité par la conversion entre les métriques et les unités en
anglais. Un Distance valeur permettre être créée de plusieurs façons :
Distance constructeur avec une distance en mètres
Distance.FromMeters méthode statique
Distance.FromKilometers méthode statique
Distance.FromMiles méthode statique
Le MapCoordinatesPage.xaml fichier contient plusieurs Label éléments pour afficher les MapSpan plus
d’informations. Le MapCoordinatesPage.xaml.cs fichier code-behind utilise un minuteur pour conserver les
informations de mise à jour que l’utilisateur manipule la carte.
Extensions de position
Une nouvelle bibliothèque pour ce livre nommé Xamarin.FormsBook.Toolkit.Maps contient des types
spécifiques à la carte mais indépendante de la plateforme. Le PositionExtensions classe a un ToString méthode
pour Position et une méthode pour calculer la distance entre deux Position valeurs.
Définissez un emplacement initial
Vous pouvez appeler la MoveToRegion méthode de Map pour définir par programmation un emplacement et
niveau de zoom sur la carte. L’argument est de type MapSpan . Vous pouvez créer un MapSpan de l’objet à l’aide
d’une des opérations suivantes :
MapSpan constructeur avec un Position et l’intervalle de latitude et longitude
MapSpan.FromCenterAndRadius avec un Position et radius
Il est également possible de créer un nouveau MapSpan à partir d’un à l’aide de méthodes ClampLatitude ou
WithZoom .
Vous pouvez également utiliser le Map constructeur avec un MapSpan objet pour initialiser l’emplacement de la
carte. Le XamarinHQPage.xaml fichier montre comment effectuer cette opération entièrement dans XAML pour
afficher le siège social de Xamarin à San Francisco.
Le zoom dynamique
Vous pouvez utiliser un Slider pour zoomer dynamiquement une carte. Le RadiusZoomPage.xaml fichier et
RadiusZoomPage.xaml.cs fichier code-behind montrent comment modifier le rayon d’une table basée sur la
Slider valeur.
Le MapDemos projet contient le fichier ScienceMuseums.xml, qui répertorie des musées science aux États-Unis,
et Locations et Site classes pour la désérialisation de ces données.
Le ScienceMuseumsPage.xaml fichier et ScienceMuseumsPage.xaml.cs broches d’affichage de fichier code-behind
pour ces musées science dans le mappage. Lorsque l’utilisateur appuie sur un code confidentiel, il affiche l’adresse
et un site Web pour le musée.
La distance entre deux points
Le PositionExtensions classe contient un DistanceTo méthode avec un calcul simplifié de la distance entre deux
emplacements géographiques.
Cela est utilisé dans le LocalMuseumsPage.xaml fichier et LocalMuseumsPage.xaml.cs fichier code-behind pour
afficher également la distance rend au musée à partir de l’emplacement de l’utilisateur :
Le programme montre aussi comment limiter dynamiquement le nombre de codes confidentiels en fonction de
l’emplacement de la carte.
Géocodage et revenir
Le Xamarin.Forms.Maps assembly contient également un Geocoder classe avec un GetPositionsForAddressAsync
méthode convertit une adresse de texte en zéro ou plus possibles géographiques positions et une autre méthode
GetAddressesForPositionAsync qui convertit dans l’autre direction.
Liens connexes
Chapitre 28 de texte intégral (PDF )
Exemples de chapitre 28
Mappage de Xamarin.Forms