35 0 3MB
Contents Création d’applications mobiles avec Xamarin.Forms 1. Comment Xamarin.Forms est-il intégré ? 2. Anatomie d’une application 3. Détails du texte 4. Défilement de la pile 5. Gestion des tailles 6. Clics de bouton 7. XAML et code 8. Code et XAML en harmonie 9. Appels d’API spécifiques de la plateforme 10. Extensions de balisage XAML 11. Infrastructure Bindable 12. Styles 13. Bitmaps 14. Disposition absolue 15. Interface interactive 16. Liaison de données 17. Maîtrise de la grille 18. MVVM 19. Vues de collection 20. E/S de fichier et asynchrone 21. Transformations 22. Animation 23. Déclencheurs et comportements 24. Navigation entre les pages 25. Types de page 26. Dispositions personnalisées 27. Renderers personnalisés 28. Emplacement et mappages
Création d’applications mobiles avec xamarin.Forms 11/01/2019 • 10 minutes to read • Edit Online
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.
Téléchargez le livre électronique gratuit Téléchargez votre format de livre électronique par défaut à partir de Microsoft Virtual Academy : PDF (56 Mo) ePub (151 Mo) Kindle Édition (325 Mo) Vous pouvez également Téléchargez des chapitres au format PDF.
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).
Récapitulatif des chapitres Récapitulatif des chapitres sont disponibles dans le table du chapitre ci-dessous. Ces synthèses décrivent le contenu de chaque chapitre et incluent plusieurs types de liens : Liens vers les chapitres réelles du livre (en bas de la page) et aux articles connexes Des liens vers tous les exemples dans le xamarin-forms-livre-samples référentiel GitHub Liens vers la documentation API pour obtenir une description plus détaillée de Xamarin.Forms classes, structures, propriétés, énumérations, etc. Ces synthèses également indiquent quand le matériel dans le chapitre peut être quelque peu obsolète.
Téléchargez des chapitres et des résumés
CHAPITRE
TEX TE COMPLET
RÉCAPITULATIF
Chapitre 1. Fonctionnement de Xamarin.Forms ajuster ?
Télécharger PDF
Résumé
Chapitre 2. Anatomie d’une application
Télécharger PDF
Résumé
Chapitre 3. Détails du texte
Télécharger PDF
Résumé
Chapitre 4. Défilement de la pile
Télécharger PDF
Résumé
Chapitre 5. Gestion des tailles
Télécharger PDF
Résumé
Chapitre 6. Clics de bouton
Télécharger PDF
Résumé
Chapitre 7. Visual Studio XAML. Code
Télécharger PDF
Résumé
Chapitre 8. Code et XAML en harmonie
Télécharger PDF
Résumé
Chapitre 9. Appels d’API de plateforme spécifique
Télécharger PDF
Résumé
Chapitre 10. Extensions de balisage XAML
Télécharger PDF
Résumé
Chapitre 11. Infrastructure Bindable
Télécharger PDF
Résumé
Chapitre 12. Styles
Télécharger PDF
Résumé
Chapitre 13. Bitmaps
Télécharger PDF
Résumé
Chapitre 14. Disposition absolue
Télécharger PDF
Résumé
Chapitre 15. L’Interface Interactive
Télécharger PDF
Résumé
Chapitre 16. Liaison de données
Télécharger PDF
Résumé
Chapitre 17. Maîtrise de la grille
Télécharger PDF
Résumé
Chapitre 18. MVVM
Télécharger PDF
Résumé
Chapitre 19. Vues de collection
Télécharger PDF
Résumé
Chapitre 20. E/s de fichier et asynchrone
Télécharger PDF
Résumé
Chapitre 21. Transformations
Télécharger PDF
Résumé
Chapitre 22. Animation
Télécharger PDF
Résumé
Chapitre 23. Déclencheurs et comportements
Télécharger PDF
Résumé
Chapitre 24. Navigation entre les pages
Télécharger PDF
Résumé
CHAPITRE
TEX TE COMPLET
RÉCAPITULATIF
Chapitre 25. Types de page
Télécharger PDF
Résumé
Chapitre 26. Dispositions personnalisées
Télécharger PDF
Résumé
Chapitre 27. Renderers personnalisés
Télécharger PDF
Résumé
Chapitre 28. Emplacement et mappages
Télécharger PDF
Résumé
Façons dans lequel le livre est obsolète Depuis la publication de création d’applications mobiles avec Xamarin.Forms, plusieurs nouvelles fonctionnalités ont été ajoutées à Xamarin.Forms. Ces nouvelles fonctionnalités sont décrites dans les articles individuels dans le Xamarin.Forms documentation. Autres modifications ont provoqué le contenu de l’annuaire à être obsolètes : Bibliothèques .NET standard 2.0 ont remplacé les bibliothèques de classes portables En règle générale, une application Xamarin.Forms utilise une bibliothèque de partager du code entre les différentes plateformes. À l’origine, il s’agissait d’une bibliothèque de classes Portable (PCL ). Il existe de nombreuses références à des bibliothèques de classes portables tout au long de ce livre et les résumés de chapitre. La bibliothèque de classes Portable a été remplacée par une bibliothèque .NET Standard 2.0, comme décrit dans l’article .NET Standard 2.0 Support dans Xamarin.Forms. Tous les exemple de code à partir de l’ouvrage a été mis à jour pour utiliser les bibliothèques .NET Standard 2.0. La plupart des informations dans le livre concernant le rôle de la bibliothèque de classes Portable reste la même pour une bibliothèque .NET Standard 2.0. La différence est qu’uniquement une bibliothèque de classes portable a une numérique « profil ». En outre, il existe des bibliothèques .NET Standard 2.0 présente plusieurs avantages. Par exemple, le chapitre 20, Async et les e/s de fichier explique comment utiliser des plateformes sous-jacentes pour effectuer des e/s de fichier. Cela n’est plus nécessaire. La bibliothèque .NET Standard 2.0 prend en charge la version classique System.IO classes pour toutes les plateformes de Xamarin.Forms. La bibliothèque .NET Standard 2.0 permet également à utiliser les applications Xamarin.Forms accéder aux fichiers sur Internet plutôt que WebRequest ou d’autres classes.
HttpClient
pour
Le rôle de XAML a été élevé Création d’applications mobiles avec Xamarin.Forms commence par décrire comment écrire des applications Xamarin.Forms à l’aide de c#. Le d’Extensible Application Markup Language (XAML ) n’est pas introduites jusqu'à ce que chapitre 7. Visual Studio XAML. Code. XAML a maintenant un rôle plus important dans Xamarin.Forms. Les modèles de solution Xamarin.Forms distribués avec Visual Studio créent des fichiers page XAML. Un développeur à l’aide de Xamarin.Forms devez vous familiariser avec le XAML dès que possible. Le langage de balisage d’Application eXtensible (XAML ) section de la documentation de Xamarin.Forms contient plusieurs articles concernant XAML pour vous aider à démarrer. Plateformes prises en charge Xamarin.Forms ne gère plus de Windows 8.1 et Windows Phone 8.1. Le livre fait parfois référence à la Windows Runtime. Il s’agit d’un terme qui englobe l’API de Windows utilisée dans plusieurs versions de Windows et Windows Phone. Les versions plus récentes de Xamarin.Forms se limite à la prise en charge de la plateforme Windows universelle, qui est l’API pour Windows 10 et Windows 10 Mobile. Une bibliothèque .NET Standard 2.0 ne prend pas en charge n’importe quelle version de Windows 10 Mobile. Par
conséquent, une application Xamarin.Forms à l’aide d’une bibliothèque .NET Standard ne s’exécutera pas sur un appareil Windows 10 Mobile. Les applications Xamarin.Forms continuent à exécuter sur le bureau Windows 10, versions 10.0.16299.0 et versions ultérieures. Xamarin.Forms a prise en charge de la version préliminaire de la Mac, WPF, GTK #, et Tizen plateformes. Récapitulatif des chapitres Les résumés de chapitre incluent les informations concernant les modifications dans Xamarin.Forms, car le livre a été écrit. Il s’agit souvent sous la forme de notes : 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.
Développement mobile multiplateforme Ce problème est courant lors du ciblage de plateformes mobiles. Actuellement, il existe deux principales plateformes mobiles, de la famille de Apple de l’iPhone et iPad exécutant le système d’exploitation iOS et le système d’exploitation Android qui s’exécute sur un large éventail de téléphones et tablettes. Une autre plate-forme significative est Universal Windows Platform (UWP de Microsoft), ce qui permet à un programme unique cibler à la fois Windows 10. Un fournisseur de logiciels qui souhaite cibler ces plateformes doit faire face à des paradigmes de l’interface utilisateur différents, les trois différents environnements de développement, les trois différentes interfaces de programmation, et—peut-être plus maladroitement—trois langages de programmation différents : Objective-C pour l’iPhone et iPad, Java pour Android, et C# pour Windows.
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 :
Les captures d’écran de gauche à droite affichent un iPhone et un téléphone Android : Sur chaque écran, la page contient un Xamarin.Forms Label pour afficher du texte, un Button pour l’initiation d’actions, un Switch pour Si vous choisissez une valeur activé/désactivé et un Slider pour spécifier une valeur dans une plage continue. Les quatre de ces vues sont des enfants d’un StackLayout sur un ContentPage . Également attaché à la page est une barre d’outils Xamarin.Forms composé de plusieurs ToolbarItem objets. Ceuxci sont visibles sous forme d’icônes en haut de l’iOS et Android écrans et en bas de l’écran de Windows 10 Mobile. Xamarin.Forms prend également en charge XAML, l’Extensible Application Markup Language développés par Microsoft pour plusieurs plateformes d’application. Tous les éléments visuels du programme ci-dessus sont définis
dans XAML, comme illustré dans le PlatformVisuals exemple. Un programme de Xamarin.Forms peut déterminer quelle plate-forme il s’exécute et exécuter un code différent en conséquence. Plus puissant, les développeurs peuvent écrire du code personnalisé pour les différentes plateformes et exécuter ce code à partir d’un programme de Xamarin.Forms de manière indépendante de la plateforme. Les développeurs peuvent également créer des contrôles supplémentaires en écrivant des convertisseurs pour chaque plateforme. Xamarin.Forms est une bonne solution pour les applications line of business, ou pour créer des prototypes ou effectuer une démonstration rapide de la preuve de concept, il est moins idéal pour les applications qui nécessitent des graphiques vectoriels ou interaction tactile complexes.
Votre environnement de développement Votre environnement de développement dépend de ce que vous souhaitez cibler des plateformes et les ordinateurs que vous voulez utiliser. Si vous souhaitez cibler iOS, vous devez un Mac avec Xcode et la plateforme Xamarin installé. Prenant en charge Android ainsi nécessite l’installation de Java et les kits de développement logiciel requis. Vous pouvez ensuite cibler iOS et Android à l’aide de Visual Studio pour Mac. Installation de Visual Studio vous permet de sur le PC cibler iOS, Android et toutes les plateformes Windows. Toutefois, cibler iOS à partir de Visual Studio nécessite toujours un Mac avec Xcode et la plateforme Xamarin installé. Vous pouvez tester les programmes sur un appareil réel que connectés par USB à l’ordinateur ou sur un simulateur.
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 affiche du texte.
Label
, qui est le
View
dérivée qui
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.
Dans les fichiers Les éléments visuels affichés par le Hello programme sont définis dans le constructeur de la dérive de la classe Xamarin.Forms Application .
App
classe.
App
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.
Bibliothèque de classes portable ou SAP ? Il est possible de créer une solution Xamarin.Forms avec le code commun dans une bibliothèque de classes Portable (PCL ) ou un projet de ressource partagé (SAP ). Pour créer une solution SAP, sélectionnez l’option partagé dans Visual Studio. Le HelloSap solution montre le modèle SAP sans aucune modification. 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
définit une zone à l’intérieur d’une page où le contenu est exclu. Cela permet la remplacement de la barre d’état iOS. Padding
Label
pour éviter le
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 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.OnPlatform méthodes, le Device.OS propriété et le TargetPlatform énumération sont tous maintenant déconseillé. Au lieu de cela, utilisez le Device.RuntimePlatform propriété et comparer le string retourner de valeur avec les champs statiques suivantes : , la chaîne « iOS » Android , la chaîne « Android » UWP , la chaîne « UWP », qui fait référence à la plateforme Windows universelle iOS
Le Device.Idiom propriété en lecture seule statique est liée. Cela retourne un membre de la ces membres :
TargetIdiom
, ce qui a
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.
3 a de solution. Définir la marge sur l’étiquette Le
propriété a été introduite trop tard pour être inclus dans le livre, mais il est également de type Thickness et vous pouvez le définir sur le Label pour définir une zone en dehors de la vue qui est incluse dans le calcul de la disposition de la vue. Margin
Le Padding propriété est disponible uniquement sur disponible sur tous les View dérivés.
Layout
et
Page
dérivés. Le
Margin
propriété n’est
Solution 4. Centrer l’étiquette dans la page Vous pouvez centrer le Label au sein de la Page (ou le placer dans un des huit autres endroits) en définissant le HorizontalOptions et VerticalOptions propriétés de la Label une valeur de type LayoutOptions . Le LayoutOptions structure définit deux propriétés : 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
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. HorizontalOptions
Voici le résultat avec la LayoutOptions.Center :
HorizontalOptions
et
VerticalOptions
propriétés de
Label
toutes deux définies sur
Solution 5. Centrer le texte dans l’étiquette Vous pouvez également centrer le texte (ou placez-le dans les huit autres emplacements sur la page) en définissant le HorizontalTextAlignment et VerticalTextAlignment propriétés de Label à un membre de la TextAlignment énumération : Start
, signification gauche ou supérieur (selon l’orientation)
Center End
, ce qui signifie qu’à droite ou en bas (selon l’orientation)
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.
Habillage des paragraphes Lorsque le Text propriété du Label contient du texte long, Label encapsule automatiquement à plusieurs lignes comme illustré par la Baskervilles exemple. Vous pouvez incorporer des codes Unicode tels que « \u2014 » pour le cadratin, ou C# caractères comme « \r » pour arrêter l’exécution vers une nouvelle ligne. Lorsque le HorizontalOptions et VerticalOptions propriétés d’un Label sont définies sur LayoutOptions.Fill , le la taille globale de la Label est régie par l’espace qui son conteneur met à disposition. Le Label est dite contraint. La taille de la Label est la taille de son conteneur. Lorsque le
et VerticalOptions propriétés sont définies sur les valeurs autres que LayoutOptions.Fill , la taille de la Label est régie par l’espace nécessaire pour restituer le texte, jusqu'à la taille de son conteneur rend disponible pour le Label . Le Label est dite sans contrainte et détermine sa taille. HorizontalOptions
(Remarque : Les termes du contrat contraint et sans contrainte peut-être absurdes, une vue sans contrainte est généralement inférieure à une vue contrainte. En outre, ces termes ne sont pas utilisés régulièrement dans les premiers chapitres du livre.) Une vue comme un Label peut être limité dans une dimension et sans contraintes dans l’autre. Un uniquement habiller le texte sur plusieurs lignes si elle est contrainte horizontalement.
Label
sera
Si un Label est contraint, il peut-être occuper beaucoup plus d’espace requis pour le texte. Le texte peut être placé dans la zone globale de la Label . Définir le HorizontalTextAlignment propriété à un membre de la TextAlignment énumération ( Start , Center , ou End ) pour contrôler l’alignement de toutes les lignes du paragraphe. La valeur par défaut est Start et aligne le texte à gauche. Définir le VerticalTextAlignment propriété à un membre de la TextAlignment énumération pour positionner le texte en haut, center ou en bas de la zone occupée par le Label . Définir le LineBreakMode propriété à un membre de la LineBreakMode énumération ( WordWrap , CharacterWrap , NoWrap , HeadTruncation , MiddleTruncation , ou TailTruncation ) pour contrôle comment le plusieurs lignes dans un saut de paragraphe ou sont tronqués.
Couleurs du texte et d’arrière-plan Définir le TextColor et et d’arrière-plan.
BackgroundColor
propriétés de
Label
à
Color
valeurs pour contrôler la couleur du texte
Le BackgroundColor s’applique à l’arrière-plan de toute la zone occupée par le Label . Selon le HorizontalOptions et VerticalOptions propriétés, que la taille peut être beaucoup plus volumineuses que la zone requise pour afficher le texte. Vous pouvez utiliser des couleurs pour faire des essais avec différentes valeurs de HorizontalOptions , VerticalOptions , HorizontalExeAlignment , et VerticalTextAlignment pour voir comment elles affectent la taille et la position de la Label et la taille et la position du texte dans le Label .
La structure de couleur Le Color structure vous permet de spécifier les couleurs en tant que valeurs de rouge-vert-bleu (RVB ) ou des valeurs de Teinte-Saturation-Luminosité (TSL ), ou avec un nom de couleur. Un canal Alpha est également disponible pour indiquer la transparence. Utilisez un
Color
constructeur pour spécifier :
un nuance de gris un valeur RVB un valeur RVB avec transparence Les arguments sont
double
valeurs comprises entre 0 et 1.
Vous pouvez également utiliser plusieurs méthodes statiques pour créer
Color
valeurs :
pour double valeurs RVB à partir de 0 à 1 Color.FromRgb pour les valeurs RVB de nombre entier compris entre 0 et 255 Color.FromRgba pour double valeurs RVB avec transparence Color.FromRgba pour les valeurs RVB d’entières avec la transparence Color.FromHsla pour double valeurs TSL avec transparence Color.FromUint pour un uint valeur calculée en tant que ( B + 256 * ( G + 256 * ( R + 256 * A ))) Color.FromHex pour un string format de chiffres hexadécimaux sous la forme « #AARRGGBB » ou « #RRGGBB » ou « #ARGB » ou « #RGB », où chaque lettre correspond à un chiffre hexadécimal pour la valeur alpha, rouge, verts et bleus de canaux. Cette méthode est principale utilisé pour les conversions de couleur XAML, comme indiqué dans chapitre 7, XAML et code. Color.FromRgb
Une fois créé, un Color valeur est immuable. Les caractéristiques de la couleur peuvent être obtenus à partir des propriétés suivantes : R G B A Hue Saturation Luminosity
Il s’agit de tous les
double
valeurs comprises entre 0 et 1.
définit également 240 champs statiques publics en lecture seule des couleurs courantes. Au moment de que l’ouvrage a été écrit, des couleurs courantes uniquement 17 étaient disponibles. Color
Un autre champ statique public en lecture seule définit une couleur avec tous les canaux de couleur a la valeur zéro : Color.Transparent
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
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 : Color.Default
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.
Changer les couleurs de l’application Les différentes plateformes ont un modèle de couleurs par défaut, comme indiqué dans la liste ci-dessus. Lorsque vous ciblez Android, il est possible de basculer vers un schéma sombre sur clair en spécifiant un thème clair dans le fichier Android.Manifest.xml ou en AppCompat Ajout et Material Design. Pour les plateformes Windows, le thème de couleur est généralement sélectionné par l’utilisateur, mais vous pouvez ajouter un RequestedTheme attribut la valeur Light ou Dark dans le fichier App.xaml de la plateforme. Par défaut, le fichier App.xaml dans le projet UWP contient un RequestedTheme attribut la valeur Light .
Attributs et les tailles de police Définir le FontFamily propriété du Label à une chaîne telle que « Times Roman » pour sélectionner une famille de polices. Toutefois, vous devez spécifier une famille de polices qui est pris en charge sur la plateforme spécifique, et les plateformes ne sont pas cohérents à cet égard. Définir le FontSize propriété du Label à un double pour spécifier la hauteur approximative de la police. Consultez chapitre 5, gestion des tailles, pour plus d’informations sur le choix intelligemment les tailles de police. Vous pouvez également obtenir un plusieurs prédéfini dépend de la plateforme de tailles de police. Statiques Device.GetNamedSize (méthode) et surcharger retournent un double valeur de taille de police appropriée à la plateforme basée sur les membres de la NamedSize énumération ( Default , Micro , Small , Medium , et Large ). La valeur retournée par la Medium membre n’est pas nécessairement identique à Default . Le NamedFontSizes exemple affiche le texte avec ces tailles nommées. Définir le FontAttributes propriété du Label à un membre de ces FontAttributes énumération, Bold , ou None . Vous pouvez combiner la Bold et Italic membres avec le langage c# opérateur de bits OR.
Italic
,
Texte mis en forme Dans tous les exemples jusqu’ici, l’intégralité du texte affiché par le Label a été formaté de manière uniforme. Pour faire varier la mise en forme dans une chaîne de texte, ne définissez pas la Text propriété du Label . Au lieu de cela, définissez la FormattedText propriété à un objet de type FormattedString . FormattedString
propre
Text
,
a un
propriété qui est une collection de Span objets. Chaque Span objet possède son , FontSize , FontAttributes , ForegroundColor , et BackgroundColor propriétés.
Spans
FontFamily
Le VariableFormattedText exemple montre comment utiliser le FormattedText propriété pour une seule ligne de texte, et VariableFormattedParagraph illustre cette technique pour tout un paragraphe, comme illustré ici :
Le NamedFontSizes programme utilise un seul 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
Label
et un
FormattedString
objet pour afficher toutes les tailles
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 StackLayout .
Layout
et
Layout
. Ce chapitre se concentre sur
NOTE Le FlexLayout introduite dans Xamarin.Forms 3.0 peut être utilisé de manière similaire à souplesse.
A également introduit dans ce chapitre sont les
ScrollView
,
Frame
, et
BoxView
StackLayout
, mais avec plus de
classes.
Piles de vues dérive de Layout et hérite d’un Children propriété de type IList . Vous ajoutez plusieurs éléments d’affichage à cette collection, et StackLayout les affiche dans une pile horizontale ou verticale. StackLayout
Définir le Vertical
propriété du StackLayout à un membre de la ou Horizontal . La valeur par défaut est Vertical . Orientation
Définir le Spacing propriété du valeur par défaut est 6.
StackLayout
à un
double
StackOrientation
énumération, soit
valeur à spécifier un espacement entre les enfants. La
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.
Faire défiler un contenu Si un
contient trop grand nombre d’enfants à afficher sur une page, vous pouvez placer le dans un ScrollView pour permettre le défilement.
StackLayout
StackLayout
Définir le
Content
propriété du ScrollView à la vue que vous souhaitez faire défiler. Il s’agit souvent un StackLayout , mais il peut être n’importe quelle vue.
Définir le
Orientation
propriété du ScrollView à un membre de la ScrollOrientation propriété, Vertical , Horizontal , ou Both . La valeur par défaut est Vertical . Si le contenu d’un ScrollView est un StackLayout , les deux orientations doivent être cohérentes. Le ReflectedColors exemple illustre l’utilisation de ScrollView et StackLayout pour afficher les couleurs disponibles. L’exemple montre également comment utiliser la réflexion .NET pour obtenir toutes les propriétés statiques publiques et les champs de la Color structure sans avoir à les répertorier explicitement.
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 . Le
LayoutOptions
structure définit deux propriétés :
du type énumération de type bool
Alignment Expands
LayoutAlignment
avec quatre membres,
Start
,
Center
,
End
, et
Fill
Pour votre commodité, le LayoutOptions structure définit également les huit champs en lecture seule statiques de type LayoutOptions qui englobent toutes les combinaisons des propriétés de l’instance de deux : LayoutOptions.Start LayoutOptions.Center LayoutOptions.End LayoutOptions.Fill LayoutOptions.StartAndExpand LayoutOptions.CenterAndExpand LayoutOptions.EndAndExpand LayoutOptions.FillAndExpand
La discussion suivante implique un est analogue.
StackLayout
avec une orientation verticale par défaut. Horizontal
StackLayout
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 , Center , ou End , puis la hauteur de la StackLayout est la hauteur totale de ses enfants.
Start
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
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 : Frame
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 signifie que le Frame remplira son conteneur. Avec d’autres paramètres, la taille de la de son contenu. Le
Frame
Le
BoxView
, ce qui est basée sur la taille
LayoutOptions.Fill Frame
est illustrée dans le FramedText exemple. affiche une zone rectangulaire de la couleur spécifiée par son
Color
propriété.
est limité (son HorizontalOptions et VerticalOptions propriétés ont leurs paramètres par défaut de 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. Si le
BoxView
Souvent, vous devez définir le WidthRequest et HeightRequest propriétés de spécifique. Ceci est illustré par la SizedBoxView exemple.
BoxView
afin de lui donner une taille
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 :
Un ScrollView dans un StackLayout ? Placer un StackLayout dans un ScrollView est commun, mais en ajoutant un ScrollView dans un StackLayout est également parfois commode. En théorie, cela ne doit pas être possible, car les enfants d’une verticale StackLayout sont verticalement sans contrainte. Mais un ScrollView doit donc être contraint verticalement. Il doit disposer d’une hauteur spécifique afin qu’elle puisse ensuite déterminer la taille de son enfant pour le défilement. L’astuce consiste à donner le ScrollView enfant de la Cela est illustré dans le BlackCat exemple.
StackLayout
un
VerticalOptions
paramètre
FillAndExpand
Le BlackCat exemple montre également comment définir et accéder aux ressources de programme qui sont incorporés dans la bibliothèque partagée. Cela est également possible avec les projets de ressource partagé (SAP )
.
mais le processus est un peu plus compliqué, comme le BlackCatSap montre des exemples.
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.
Plusieurs tailles de Xamarin.Forms ont été rencontrées jusqu'à présent : La hauteur de la barre d’état iOS est 20 Le BoxView a une largeur par défaut et une hauteur de 40 La valeur par défaut Padding dans un Frame est 20 La valeur par défaut Spacing sur le StackLayout est 6 Le Device.GetNamedSize méthode retourne une taille de police numérique Ces tailles ne sont pas des pixels. Au lieu de cela, ils sont des unités indépendantes du périphérique reconnues indépendamment par chaque plateforme.
Pixels, points, points de distribution, adresses IP dynamiques et DIUs Au début de l’historique du Mac d’Apple et Microsoft Windows, les programmeurs a travaillé en unités de pixels. Toutefois, l’arrivée de résolution supérieure affiche requis une approche abstraite et plus virtualisée aux coordonnées d’écran. Dans l’univers Mac, les programmeurs travaillé en unités de points, traditionnellement 1/72ème de pouce, les développeurs Windows utilisé lors de la unités indépendantes du périphérique (DIUs) en fonction de 1/96ème de pouce. Toutefois, les appareils mobiles sont généralement conservées plus proches de la face et ont une résolution supérieure à desktop écrans, ce qui implique qu’une densité de pixels supérieure peut être tolérée. Les programmeurs ciblant les appareils iPhone et iPad d’Apple continuent de fonctionner en unités de points, mais il existe 160 de ces points par pouce. Selon l’appareil, il peut être 1, 2 ou 3 pixels vers le point. Android est similaire. Les programmeurs traitent en unités de pixels indépendants de densité (dps), et la relation entre les points de distribution et de pixels est basée sur 160 DP par pouce. Les téléphones Windows et les appareils mobiles ont également établi des facteurs d’échelle qui impliquent quelque chose proche de 160 unités indépendantes du périphérique par pouce. 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 exemple utilise cet événement pour afficher la taille de l’écran de programme.
Height
a changé. Le WhatSize
Tailles SURMONTANT Le MetricalBoxView utilise l’autre centimètre large.
WidthRequest
et
HeightRequest
pour afficher un
BoxView
un pouce en hauteur et
Tailles de police estimé Le tailles de police exemple montre comment utiliser la règle de 160-unités-à-the-pouce pour spécifier des tailles de police en unités de points. La cohérence visuelle entre les plateformes à l’aide de cette technique est meilleure que Device.GetNamedSize .
Ajustement du texte à la taille disponible Il est possible d’adapter un bloc de texte dans un rectangle particulier en calculant un les critères suivants :
FontSize
de la
Label
selon
Interligne est de 120 % de la taille de police (130 % sur les plateformes Windows). Largeur de caractère moyenne est de 50 % de la taille de police. Le EstimatedFontSize exemple illustre cette technique. Ce programme a été écrit avant la Margin propriété était disponible, de sorte qu’il utilise un ContentView avec un Padding paramètre pour simuler un marge.
Une horloge de la taille de l’ajustement Le FitToSizeClock exemple montre comment utiliser Device.StartTimer à démarrer un minuteur qui indique périodiquement à l’application lorsqu’il est temps pour mettre à jour de l’horloge. La taille de police est définie à un sixième de la largeur de page pour rendre l’affichage aussi grand que possible.
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.
Ajustement empirique de texte Un autre en fonction du texte à un rectangle consiste à empirique calculer la taille du rendu de texte et l’ajuster vers le haut ou vers le bas. Le programme dans les appels de livre GetSizeRequest sur un élément visuel pour obtenir la taille souhaitée de l’élément. Méthode a été déconseillée et les programmes doivent appeler à la place Measure . 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
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 : Button
de type Color BorderWidth de type Double BorderRadius de type Double BorderColor
hérite également toutes les propriétés de HorizontalOptions , et VerticalOptions . Button
VisualElement
et
View
, y compris
BackgroundColor
,
Traitement de la, cliquez sur Le Button classe définit un Clicked événement est déclenché lorsque l’utilisateur actionne le Button . Le Click gestionnaire est de type EventHandler . Le premier argument est le Button génère l’événement de l’objet ; le deuxième argument est un EventArgs objet qui fournit des informations supplémentaires. Le ButtonLogger simple illustre
Clicked
gestion.
Bouton de partage clique sur Plusieurs Button vues peuvent partager la même Clicked gestionnaire, mais le gestionnaire doit généralement déterminer quelle Button est chargé pour un événement particulier. Une approche consiste à stocker les différentes Button objets en tant que champs et celle qui déclenche l’événement dans le Gestionnaire de contrôle. Le TwoButtons exemple illustre cette technique. Le programme montre aussi comment définir le IsEnabled propriété d’un Button à false lorsque vous appuyez sur la Button n’est plus valide. Désactivé Button ne génère pas un Clicked événement.
Gestionnaires d’événements anonyme Il est possible de définir Clicked gestionnaires en tant que fonctions lambda anonyme, comme le ButtonLambdas montre des exemples. Toutefois, gestionnaires anonymes ne peut pas être partagés sans un code de réflexion désordonnées.
Distinction des vues avec des ID
Plusieurs Button objets peuvent également être distingués en définissant le StyleId propriété ou AutomationId propriété à un string . Cette propriété est définie par Element , mais elle n’est pas utilisée dans Xamarin.Forms. Elle est destinée à être utilisée uniquement par les programmes d’application. Le SimplestKeypad exemple utilise le même gestionnaire d’événements pour toutes les touches numériques 10 sur un pavé numérique et fait la distinction entre eux avec le StyleId propriété :
Enregistrer les données temporaires De nombreuses applications ont besoin pour enregistrer les données lorsqu’un programme est arrêté et recharger ces données lorsque le programme démarre à nouveau. Le Application classe définit plusieurs membres qui aident à votre programme enregistrer et restaurer les données temporaires : Le Properties propriété est un dictionnaire avec string clés et object éléments. Le contenu du dictionnaire est automatiquement enregistré dans le stockage local des applications avant l’arrêt du programme et rechargé lorsque le programme démarre. Le Application classe définit trois méthodes virtuelles protégées qui le programme de standard App substitue : OnStart , OnSleep , et OnResume . Ils se rapportent aux cycle de vie des applications événements. Le SavePropertiesAsync méthode enregistre le contenu du dictionnaire. Il n’est pas nécessaire d’appeler SavePropertiesAsync . Le contenu du dictionnaire est automatiquement enregistré avant l’arrêt du programme et récupéré avant le démarrage du programme. Il est utile lors du test de programme pour enregistrer les données si le programme se bloque. Également est utile : , une propriété statique qui retourne actuel utiliser pour obtenir le Properties dictionnaire. Application.Current
Application
objet que vous pouvez ensuite
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.
Propriétés et les attributs Structures et classes de Xamarin.Forms deviennent des éléments XML dans XAML, et les propriétés de ces classes et des structures deviennent des attributs XML. Pour être instancié en XAML, une classe doit avoir généralement d’un constructeur sans paramètre public. Les propriétés définies dans XAML doivent avoir public set accesseurs. Pour les propriétés des types de base de données ( string , double , bool , et ainsi de suite), l’analyseur XAML utilise la norme TryParse méthodes pour convertir les paramètres de l’attribut à ces types. L’analyseur XAML peut également facilement gérer des types énumération, et il peut associer des membres de l’énumération si le type d’énumération est marqué avec le Flags attribut. Pour aider l’analyseur XAML, des types plus complexes (ou propriétés de ces types) peuvent inclure un TypeConverterAttribute qui identifie une classe qui dérive de TypeConverter qui prend en charge la conversion à partir de valeurs de chaîne à ces types. Par exemple, le ColorTypeConverter convertit de noms et les chaînes, telles que « #rrggbb », couleur dans Color valeurs.
Syntaxe d’élément de propriété Dans XAML, les classes et les objets créés à partir de celles-ci sont exprimées en tant qu’éléments XML. Ils sont appelés éléments objet. La plupart des propriétés de ces objets sont exprimées en tant qu’attributs XML. Ils sont appelés les attributs de propriété. Parfois, une propriété doit être définie à un objet qui ne peuvent pas être exprimé sous forme de chaîne simple. Dans ce cas, XAML prend en charge une balise appelée un élément property qui se compose du nom de la classe et du nom de propriété séparés par un point. Un élément objet peut ensuite apparaître dans une paire de balises d’élément de propriété.
Ajout d’une page XAML à votre projet Une bibliothèque de classes Portable Xamarin.Forms peut contenir une page XAML quand il est tout d’abord créé, ou vous pouvez ajouter une page XAML à un projet existant. Dans la boîte de dialogue Ajouter un nouvel élément, choisissez l’élément qui fait référence à une page XAML, ou ContentPage et XAML. (Pas un ContentView .)
NOTE Options de Visual Studio ont été modifiés depuis la rédaction de ce chapitre.
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.
Spécificité de plateforme dans le fichier XAML Dans XAML, le OnPlatform classe peut être utilisée pour sélectionner le balisage de dépend de la plateforme. Ceci est une classe générique et doit être instancié avec une x:TypeArguments attribut qui correspond au type de cible. Le OnIdiom classe est similaire mais utilisé beaucoup moins souvent. L’utilisation de OnPlatform a changé depuis le livre a été publié. Il a été initialement utilisé conjointement avec les propriétés nommées iOS , Android , et WinPhone . Il est maintenant utilisé avec enfant On objets. Définir le Platform en une chaîne cohérente avec le public const champs de la Device classe. Définir le Value propriété une valeur cohérente avec la x:TypeArguments attribut de la OnPlatform balise. est illustrée dans le ScaryColorList exemple, appelée ainsi car il contient des blocs de XAML quasiment identique. L’existence de ce balisage et répétitive suggère que les techniques doivent être disponibles pour la réduire. OnPlatform
Les attributs de propriété de contenu Certains éléments de propriété se produisent très fréquemment, telles que la balise sur l’élément racine d’un ContentPage , ou le balise qui englobe les enfants de StackLayout . Chaque classe est autorisé à identifier une propriété avec une ContentPropertyAttribute sur la classe. Pour cette propriété, les balises d’élément de propriété ne sont pas nécessaires. ContentPage définit sa propriété de contenu en tant que Content , et Layout (la classe à partir de laquelle StackLayout dérive) définit sa propriété de contenu en tant que Children . Ces balises d’élément de propriété ne sont pas nécessaires.
L’élément de propriété de
Label
est
Text
.
Texte mis en forme Le TextVariations exemple contient plusieurs exemples de paramètre de la Text et FormattedText propriétés de Label . Dans XAML, Span objets apparaissent en tant qu’enfants de le FormattedString objet. 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.
Passage des arguments En règle générale, une classe instanciée dans XAML doit avoir un constructeur sans paramètre public ; l’objet résultant est initialisé par le biais des paramètres de propriété. Toutefois, il existe deux autres méthodes que les objets peuvent être instanciés et initialisés. Bien qu’il s’agit des techniques à usage général, ils sont principalement utilisés dans le cadre de modèles de vue de MVVM. Constructeurs avec des arguments Le ParameteredConstructorDemo exemple montre comment utiliser le x:Arguments balise pour spécifier des arguments de constructeur. Ces arguments doivent être délimités par des balises d’élément indiquant le type de l’argument. Pour les types de données .NET base, les balises suivantes sont disponibles : x:Object x:Boolean x:Byte x:Int16 x:Int32 x:Int64 x:Single x:Double x:Decimal x:Char x:String x:TimeSpan x:Array x:DateTime
Puis-je appeler des méthodes à partir de XAML ? Le FactoryMethodDemo exemple montre comment utiliser le x:FactoryMethod élément pour spécifier une méthode de fabrique qui est appelée pour créer un objet. Une telle méthode de fabrique doit être publique et statique, et il doit créer un objet du type dans lequel elle est définie. (Par exemple le Color.FromRgb qualifie de méthode, car elle est publique et statique et retourne une valeur de type Color .) Les arguments à la méthode de fabrique sont spécifiés dans x:Arguments balises.
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.
Vues personnalisées en fonction du XAML Il existe plusieurs façons d’éviter la répétition de balisage en XAML. Une technique courante consiste à créer une nouvelle classe XAML qui dérive de ContentView . Cette technique est illustrée dans le ColorViewList exemple. Le ColorView dérive de la classe ContentView pour afficher une couleur particulière et son nom, tandis que le ColorViewListPage dérive de la classe ContentPage comme d’habitude et explicitement crée des 17 instances de ColorView . 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.
Appuyez sur les mouvements N’importe quel View objet peut obtenir l’entrée tactile et générer des événements à partir de cette entrée. Le classe définit un GestureRecognizers propriété de collection qui peut contenir une ou plusieurs instances des classes qui dérivent de GestureRecognizer . Le
génère Tapped événements. Le MonkeyTap programme montre comment associer objets à quatre BoxView éléments pour créer un jeu d’imitation :
TapGestureRecognizer
TapGestureRecognizer
Mais le MonkeyTap programme doit vraiment son. (Consultez le chapitre suivant.)
Liens connexes
View
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.
Prétraitement dans le projet actif partagé Un projet de ressource partagée Xamarin.Forms peut exécuter un code différent pour chaque plateforme en utilisant les directives de préprocesseur c# #if , #elif , et endif . Cela est illustré dans PlatInfoSap1:
Toutefois, le code résultant peut être horrible et difficile à lire.
Classes parallèles dans le projet de ressources partagées Une approche plus structurée à l’exécution de code spécifique à la plateforme dans SAP est illustrée dans le PlatInfoSap2 exemple. Chacun des projets de plateforme contient une classe portant le même nommée et des méthodes, mais implémentée pour cette plate-forme particulière. SAP ensuite simplement instancie la classe et appelle la méthode.
DependencyService et la bibliothèque de classes Portable
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.
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 classe de plateforme qui implémente l’interface.
DependencyService
pour obtenir une instance de la
Cela est illustré dans le DisplayPlatformInfo exemple.
Génération de sons spécifiques à la plateforme Le MonkeyTapWithSound exemple ajoute des sonneries à la MonkeyTap programme en accédant à des installations de sons dans chaque plateforme.
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 : 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 x:Static
Ces quatre extensions de balisage XAML sont prises en charge par de nombreuses implémentations du XAML, y compris Xamarin.Forms : 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 StaticResource
Une extension de balisage XAML supplémentaire est incluse dans Xamarin.Forms en lien avec ConstraintExpression
RelativeLayout
:
—non couvertes dans le livre
L’accès aux membres statiques Utilisez le x:Static élément à définir un attribut à la valeur d’un membre de propriété, champ ou énumération statique publique. Définir le Member propriété pour le membre statique. Il est généralement plus facile de spécifier x:Static et le nom du membre entre accolades. Le nom de la Member propriété ne doit pas être inclus, juste le membre lui-même. Cette syntaxe courante est indiquée dans le SharedStatics exemple. Les champs statiques euxmêmes sont définis dans le AppConstants classe. Cette technique vous permet d’établir des constantes utilisées via un programme. Avec une déclaration d’espace de noms XML supplémentaire, vous pouvez référencer des propriétés statiques publiques, des champs ou des membres de l’énumération définies dans le .NET framework, en particulier comme
illustré dans le SystemStatics exemple .
Dictionnaires de ressources Le
classe définit une propriété nommée Resources que vous pouvez définir pour un objet de type . 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. VisualElement
ResourceDictionary
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 :
Ne confondez pas la
x:Static
extension de balisage et le
StaticResource
extension de balisage.
Une arborescence de dictionnaires Lorsque l’analyseur XAML rencontre un StaticResource , il commence la recherche vers le haut l’arborescence visuelle pour une clé correspondante et recherche les ResourceDictionary dans l’application App classe. Cela permet des éléments dans un dictionnaire de ressources plus en détail l’arborescence visuelle pour remplacer un dictionnaire de ressources plus haut dans l’arborescence visuelle. Cela est illustré dans le ResourceTrees exemple. DynamicResource à des fins spéciales Le StaticResource extension de balisage provoque un élément à récupérer à partir du dictionnaire lors d’une arborescence d’éléments visuels est généré pendant la InitializeComponent appeler. Une alternative à StaticResource est DynamicResource , qui maintient un lien vers la clé de dictionnaire et met à jour la cible lors de l’élément référencé par les principales modifications apportées. La différence entre
StaticResource
et
DynamicResource
est illustrée dans le DynamicVsStatic exemple.
Une propriété définie par DynamicResource doit reposer sur une propriété pouvant être liée comme indiqué dans chapitre 11, infrastructure bindable.
Extensions de balisage moins utilisée Utilisez le
x:Null
extension de balisage pour définir une propriété
Utilisez le
x:Type
extension de balisage pour définir une propriété à un .NET
null
. Type
objet.
Utilisez x:Array pour définir un tableau. Spécifiez le type des membres du groupe en définissant le [ Type ] propriété à un x:Type extension de balisage.
Une extension de balisage personnalisée Vous pouvez créer vos propres extensions de balisage XAML en écrivant une classe qui implémente le IMarkupExtension créent une interface avec un ProvideValue (méthode). 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.
La hiérarchie de classes de Xamarin.Forms Le ClassHierarchy exemple utilise la réflexion pour afficher une hiérarchie de classes de Xamarin.Forms et illustrer le rôle crucial joué par BindableObject dans cette hiérarchie. BindableObject dérive de Object et est la classe parente à Element à partir de laquelle VisualElement dérive. C’est la classe parent à Page et View , qui est la classe parente à Layout :
Un coup de œil dans BindableObject et BindableProperty Dans les classes qui dérivent de BindableObject nombreuses propriétés CLR sont dits se reposer » sur « Propriétés pouvant être liées. Par exemple, le Text propriété de la Label classe est une propriété CLR, mais la Label classe définit également un champ statique public en lecture seule nommé TextProperty de type BindableProperty . 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
BindableObject
et
conjointement avec le
BindableProperty
Label.TextProperty
propriété statique.
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 et GetValue méthodes.
SetValue
É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
.
Définition des propriétés pouvant être liées Vous pouvez définir vos propres propriétés pouvant être liées à l’aide de la méthode statique BindableProperty.Create méthode pour créer un champ en lecture seule statique 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. Quatre arguments de la
BindableProperty.Create
méthode sont requis :
: le nom de la propriété (le même que le nom de propriété CLR ) returnType : le type de la propriété CLR declaringType : le type de la classe déclarant la propriété defaultValue : la valeur de propriété par défaut propertyName
É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 defaultBindingMode
BindableProperty.Create
ne sont pas aussi courantes :
: utilisé dans le cadre de la liaison de données (comme indiqué dans chapitre 16. Liaison
de données) : 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) validateValue
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 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
SetValue
surcharge
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 associe un Property avec un Value .
Setters
, qui est une collection de
Setter
objets. Chaque
Setter
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é . 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 StaticResource extension de balisage :
Style
avec un
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 BasicStyleCode exemple.
Style
objets dans le code. Cela est illustré par la
Héritage de 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. Style
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 référencer explicitement un style implicite.
x:Key
paramètre mais pas l’inverse. Vous ne pouvez pas
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
classe imbriquée définit 12 champs en lecture seule statiques pour les six styles avec une de Label que vous pouvez utiliser pour les types courants d’utilisations de texte.
Device.Styles
TargetType
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 :
égal à « BodyStyle » TitleStyleKey égal à « TitleStyle » SubtitleStyleKey égal à « SubtitleStyle » CaptionStyleKey égal à « CaptionStyle » ListItemTextStyleKey égal à « ListItemTextStyle » ListItemDetailTextStyleKey égal à « ListItemDetailTextStyle » BodyStyleKey
Ces styles sont illustrées par la DeviceStylesList exemple.
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 abstraite avec trois dérivés :
Source
propriété du
Image
à un objet de type
ImageSource
, une classe
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é UriImageSource
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 : 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 ImageSource.FromUri
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.
Bitmaps indépendantes de la plate-forme Le WebBitmapCode projet charge une image bitmap sur le web à l’aide ImageSource.FromUri . Le Image élément est défini sur le Content propriété de la ContentPage , donc il est limité à la taille de la page. Quelle que soit la taille de la bitmap, une contrainte Image élément est étiré pour la taille de son conteneur et le bitmap s’affiche dans sa taille maximale dans le Image élément tout en conservant les proportions de la bitmap. Zones de la Image au-delà de l’image bitmap peut être en couleur avec BackgroundColor . Le WebBitmapXaml exemple est similaire, mais se contente de définir le conversion est contrôlée par le ImageSourceConverter classe.
Source
Ajuster et remplissage Vous pouvez contrôler la manière dont l’image bitmap est étirée en définissant le un des membres suivants de la Aspect énumération :
URL à la propriété. La
Aspect
propriété de la
Image
à
: 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 AspectFit
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 .
Diffusion en continu de bitmaps Le
méthode crée un objet retourne un Stream objet.
ImageSource.FromStream
Func
ImageSource
basé sur .NET
Stream
. La méthode doit être passée un
L’accès à des flux de données Le BitmapStreams exemple montre comment utiliser le ImaageSource.FromStream méthode pour charger une image bitmap stockée en tant que ressource incorporée et pour charger une image bitmap sur le web. Générer des images bitmap au moment de l’exécution Toutes les plateformes de Xamarin.Forms prend en charge le format de fichier non compressé BMP, qui est facile à construire dans le code, puis stockez dans un MemoryStream . Cette technique permet la création de façon algorithmique des bitmaps lors de l’exécution, tel qu’implémenté dans le BmpMaker classe dans le Xamrin.FormsBook.Toolkit bibliothèque. « Faire il vous-même le » DiyGradientBitmap exemple illustre l’utilisation de bitmap avec une image de dégradé.
BmpMaker
pour créer une image
Bitmaps spécifiques à la plateforme Toutes les plateformes de Xamarin.Forms permettent de stocker des images bitmap dans les assemblys d’application de plateforme. Lorsque extrait par une application Xamarin.Forms, ces bitmaps de plateforme sont de type FileImageSource . Vous les utilisez pour : le le le
propriété de MenuItem Icon propriété de ToolbarItem Image propriété de Button Icon
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 [email protected] à 320 pixels carrés [email protected] à 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 plus important
ToolbarItem
sont des propriétés :
pour le texte qui peut s’afficher en fonction de la plateforme et Order Icon de type FileImageSource pour l’image qui peut s’afficher en fonction de la plateforme et Order Order de type ToolbarItemOrder , une énumération avec trois membres, Default , Primary , et Secondary . Text
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
se 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 ). ToolbarItem
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 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. 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 . 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 ).
DispositionAbsolue dans le code Vous pouvez ajouter un enfant à la Children collection d’un AbsoluteLayout à l’aide de la norme Add (méthode), mais AbsoluteLayout fournit également une étendue Add méthode qui vous permet de spécifier un Rectangle . Un autre Add méthode nécessite uniquement un Point , auquel cas l’enfant n’est pas limitée et se redimensionne. Vous pouvez créer un Rectangle valeur avec un constructeur qui requiert quatre valeurs — les deux premiers indiquant la position du coin supérieur gauche de l’enfant par rapport à son parent et les deux indiquant le taille de l’enfant. Vous pouvez également utiliser un constructeur qui nécessite un Point et un Size valeur. Ces Add méthodes sont illustrées dans AbsoluteDemo, les positions valeurs et un Label élément à l’aide de simplement un Point valeur.
BoxView
à l’aide des éléments
Rectangle
Le ChessboardFixed exemple utilise 32 BoxView éléments pour créer le modèle échiquier. Le programme donne le BoxView taille éléments codés en dur du carré de 35 unités. Le AbsoluteLayout a son HorizontalOptions et VerticalOptions définie sur LayoutOptions.Center , ce qui conduit le AbsoluteLayout pour avoir une taille totale du carré de 280 unités.
Joint des propriétés pouvant être liées Il est également possible de définir la position et, éventuellement, la taille d’un enfant d’un AbsoluteLayout après qu’il a été ajouté à la Children collection à l’aide de la méthode statique AbsoluteLayout.SetLayoutBounds . Le premier argument est l’enfant ; le second est un Rectangle objet. Vous pouvez spécifier que l’enfant se redimensionne horizontalement et verticalement en définissant les valeurs de largeur et hauteur le AbsoluteLayout.AutoSize constante. Le ChessboardDynamic exemple met le AbsoluteLayout dans un ContentView avec un SizeChanged gestionnaire à appeler AbsoluteLayout.SetLayoutBounds sur tous les enfants pour les rendre aussi grand que possible. La propriété jointe peut être liée qui AbsoluteLayout définit le champ statique en lecture seule de type n’est BindableProperty nommé AbsoluteLayout.LayoutBoundsProperty . La méthode statique
méthode est implémentée en appelant SetValue sur l’enfant ayant le AbsoluteLayout.LayoutBoundsProperty . L’enfant contienne un dictionnaire dans lequel la propriété jointe peut être liée et sa valeur sont stockées. Pendant la disposition, le AbsoluteLayout pouvez obtenir cette valeur en appelant AbsoluteLayout.GetLayoutBounds , qui est implémentée avec un GetValue appeler. AbsoluteLayout.SetLayoutBounds
Redimensionnement proportionnel et positionnement implémente un redimensionnement proportionnel et la fonctionnalité de positionnement. La classe définit une deuxième propriété jointe peut être liée, LayoutFlagsProperty , avec les méthodes statiques associées AbsoluteLayout.SetLayoutFlags et AbsoluteLayout.GetLayoutFlags . AbsoluteLayout
L’argument AbsoluteLayout.SetLayoutFlags et la valeur de retour de AbsoluteLayout.GetLayoutFlags est une valeur de type AbsoluteLayoutFlags , une énumération avec les membres suivants : (égal à 0) XProportional (1 ) YProportional (2 ) None
PositionProportional
(3 )
(4 ) HeightProportional (8 ) SizeProportional (12 ) All (\xFFFFFFFF ) WidthProportional
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 . Le ChessboardProportional exemple illustre l’utilisation de redimensionnement proportionnel et de positionnement.
Utilisation des coordonnées proportionnelles Parfois, il est plus simple de considérer un positionnement proportionnelle différemment de la façon dont il est implémenté dans le AbsoluteLayout . Vous préférerez peut-être utiliser des coordonnées proportionnelles où un propriété 1 positionne bord gauche de l’enfant (plutôt que le bord droit) sur le bord droit de la AbsoluteLayout . Ce schéma de positionnement alternatif peut être appelé « coordonnées fractionnaires enfants. » Vous pouvez convertir à partir des coordonnées fractionnaires enfants pour les limites de disposition requis pour AbsoluteLayout à l’aide des formules suivantes : layoutBounds.X = (fractionalChildCoordinate.X / (1 - layoutBounds.Width)) layoutBounds.Y = (fractionalChildCoordinate.Y / (1 - layoutBounds.Height))
X
Le ProportionalCoordinateCalc illustre cela.
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 programme a terminé une tâche.
ProgressBar
, qui affiche l’étendue à laquelle un
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
Liens connexes Chapitre 14 de texte intégral (PDF ) Exemples de chapitre 14 AbsoluteLayout Propriétés jointes
Label
objets à rebondit horizontalement et verticalement sur l’écran.
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.
Vue d’ensemble de la vue Xamarin.Forms contient 20 instanciables classes dérivées de dans les chapitres précédents :
View
mais pas
Layout
. Six d'entre eux ont été traités
: Chapitre 2. Anatomie d’une application BoxView : Chapitre 3. Défilement de la pile Button : Chapitre 6. Clics de bouton Image : Chapitre 13. Bitmaps ActivityIndicator : Chapitre 13. Bitmaps ProgressBar : Chapitre 14. DispositionAbsolue Label
Les huit vues dans ce chapitre autoriser efficacement l’utilisateur d’interagir avec les types de données de base .NET : TYPE DE DONNÉES
AFFICHAGES
,
Double
Slider
Boolean
Switch
String
Entry
DateTime
DatePicker
,
Stepper
Editor
,
,
SearchBar
TimePicker
Vous pouvez considérer de ces vues en tant que représentations interactives visuelles des types de données sousjacente. 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 : : 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) WebView
Curseur et l’exécution pas à pas Les deux Slider et Stepper autoriser l’utilisateur de choisir une valeur numérique à partir d’une plage. Le Slider est une plage continue, tandis que le Stepper implique des valeurs discrètes.
Principes de base de curseur Le Slider est une barre représentant une plage de valeurs à partir d’un minimum de gauche à un maximum sur la droite horizontale. Il définit trois propriétés publiques : de type double , valeur 0 par défaut Minimum de type double , valeur 0 par défaut Maximum de type double , la valeur 1 par défaut Value
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. se déclenche le ValueChanged événement avec un ValueChangedEventArgs argument lorsque la propriété change, par programme ou lorsque l’utilisateur manipule le Slider . Slider
Le SliderDemo exemple illustre l’utilisation simple du
Slider
Value
.
Pièges courants À la fois dans le code et XAML, le Minimum et Maximum propriétés sont définies dans l’ordre que vous spécifiez. Veillez à initialiser ces propriétés afin que Maximum est toujours supérieure à Minimum . Dans le cas contraire, une exception est levée. L’initialisation de la Slider propriétés peuvent entraîner la Value propriété à modifier et le ValueChanged événement à déclencher. Vous devez vous assurer que le Slider Gestionnaire d’événements n’accède pas à des vues qui n’ont pas encore été créés pendant l’initialisation de la page. Le ValueChanged événement ne se déclenche pendant Slider l’initialisation, sauf si le Value les modifications de propriété. Vous pouvez appeler la ValueChanged gestionnaire directement à partir du code. Sélection de couleur de curseur Le RgbSliders programme contienne trois Slider les éléments qui vous permettent de sélectionner une couleur de manière interactive en spécifiant ses valeurs RVB :
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 initialisée à 100 et Stepper définit une propriété quatrième : Increment
de type
double
Slider
mais le
Maximum
propriété est
, 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 . Cela est illustré par la StepperDemo exemple.
Commutateur et la case à cocher Le
permet à l’utilisateur de spécifier une valeur booléenne.
Switch
Principes fondamentaux de commutateur Visuellement, le Switch se compose d’un bouton bascule qui peut être désactivée puis activé. La classe définit une propriété : IsToggled Switch
de type
bool
définit un événement :
accompagné d’un propriété. Toggled
ToggledEventArgs
Le SwitchDemo programme illustre le
Switch
objet, déclenché lorsque le
IsToggled
les modifications de
.
Une case à cocher traditionnel Certains développeurs peuvent préférer une plus traditionnelle CheckBox à la Switch . Le Xamarin.FormsBook.Toolkit bibliothèque contient un CheckBox classe qui dérive de ContentView . CheckBox est implémentée par le CheckBox.xaml et CheckBox.xaml.cs fichiers. CheckBox définit trois propriétés ( Text , FontSize , et IsChecked ) et un CheckedChanged événement. Le CheckBoxDemo illustre cela
CheckBox
.
Saisie de texte Xamarin.Forms définit trois vues qui permettent l’utilisateur d’entrer et de modifier le texte : pour une seule ligne de texte Editor plusieurs lignes de texte SearchBar pour une seule ligne de texte à des fins de recherche. Entry
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 Le Le Le Le
méthode tente de définir le focus d’entrée à un élément et retourne true en cas de réussite Unfocus méthode supprime le focus d’entrée à partir d’un élément IsFocused propriété en lecture seule indique si l’élément a le focus d’entrée Focused événements indique quand un élément obtient le focus d’entrée Unfocused événements indique quand un élément perd le focus d’entrée Focus
Choix du clavier Le InputView classe à partir de laquelle de type
Keyboard
Entry
et
Editor
dériver ne définit qu’une seule propriété :
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
la valeur 1 Spellcheck la valeur est 2 Suggestions la valeur 4 All la valeur \xFFFFFFFF CapitalizeSentence
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 : 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 ce soit est typé PlaceholderColor de type Color Text
Le
Entry
définit également deux événements :
Entry
avant que quoi que
TextChanged
avec un
TextChangedEventArgs
objet, déclenché chaque fois que le
Text
les modifications de
propriété Completed , déclenché lorsque l’utilisateur est terminée et que le clavier est fermé. L’utilisateur indique l’achèvement de manière spécifique à la plateforme
Le QuadraticEquations illustre ces deux événements. La différence de l’éditeur La propriété multiline Editor définit les mêmes Text et Font propriétés comme propriétés. Editor définit également les deux mêmes propriétés que Entry .
Entry
mais pas les autres
JustNotes est un programme de prise de notes de forme libre qui enregistre et restaure le contenu de la Le SearchBar Le SearchBar ne dérive pas de InputView , donc il n’a pas un Font , et Placeholder propriétés qui Entry définit. En outre,
Editor
.
propriété. Mais il dispose de tous les Text , SearchBar définit trois propriétés supplémentaires :
Keyboard
de type Color SearchCommand de type ICommand pour une utilisation avec les liaisons de données et MVVM SearchCommandParameter de type Object , pour une utilisation avec SearchCommand CancelButtonColor
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 : TextChanged
accompagné d’un
TextChangedEventArgs
objet
SearchButtonPressed
Le SearchBarDemo exemple illustre la
SearchBar
.
Sélection de date et d’heure Le DatePicker et TimePicker vues instaurez des contrôles spécifiques à une plateforme permettant aux utilisateurs de spécifier une date ou heure. DatePicker DatePicker
définit les quatre propriétés :
de type DateTime , initialisé pour le 1er janvier 1900. MaximumDate de type DateTime , initialisé pour le 31 décembre 2100 Date de type DateTime , initialisée à DateTime.Today Format de type string , .NET mise en forme de chaîne initialisé à « d », le modèle de date courte, ce qui entraîne un affichage de la date comme « 7/20/1969 » dans le fuseau horaire. MinimumDate
Vous pouvez définir le DateTime propriétés dans XAML en exprimant les propriétés en tant qu’éléments de propriété et à l’aide de la culture dite indifférente courte-date de format (« 20/7/1969 »). Le DaysBetweenDates exemple calcule le nombre de jours entre deux dates sélectionnées par l’utilisateur. Le TimePicker (ou s’agit-il d’un TimeSpanPicker ?) TimePicker définit deux propriétés et aucun événement : 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. Time
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 d’alerte.
Liens connexes Chapitre 15 de texte intégral (PDF ) Exemples de chapitre 15 Slider Entrée Éditeur DatePicker
DisplayAlert
méthode de
Page
pour afficher un message
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.
Principes fondamentaux de liaison Plusieurs propriétés, méthodes et classes sont impliqués dans la liaison de données : Le Binding dérive de la classe BindingBase et encapsule de nombreuses caractéristiques d’une liaison de données Le BindingContext propriété est définie par le BindableObject classe Le SetBinding méthode est également définie par le BindableObject classe Le BindableObjectExtensions classe définit trois supplémentaires SetBinding méthodes Les deux classes suivantes prennent en charge les extensions de balisage XAML pour les liaisons : prend en charge le Binding extension de balisage ReferenceExtension prend en charge le x:Reference extension de balisage BindingExtension
Deux interfaces sont impliqués dans la liaison de données : dans le System.ComponentModel espace de noms est pour l’implémentation de notification lorsqu’une propriété change IValueConverter permet de définir de petites classes qui convertissent les valeurs d’un type vers un autre dans les liaisons de données INotifyPropertyChanged
Une liaison de données connecte à deux propriétés de l’objet de même, ou deux objets différents (le plus souvent). Ces deux propriétés sont appelées les source et cible. En règle générale, une modification dans la propriété source provoque une modification se produise dans la propriété cible, mais parfois, la direction est inversée. Quel que soit : le cible propriété doit être stockée par un BindableProperty le source propriété est généralement un membre d’une classe qui implémente Une classe qui implémente propriété change de valeur.
se déclenche un PropertyChanged événement lorsqu’une implémente INotifyPropertyChanged et déclenche automatiquement
INotifyPropertyChanged BindableObject
INotifyPropertyChanged
un PropertyChanged événement lorsqu’une propriété stockée par un BindableProperty modifie les valeurs, mais vous pouvez écrire vos propres classes qui implémentent INotifyPropertyChanged sans dériver BindableObject .
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 La cible est le Opacity propriété d’un
Slider 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 Via le
propriété de la cible propriété de la Binding objet lui-même
BindingContext Source
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 :
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 OneWay
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. Default
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 : 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 Value
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.
Chaîne mise en forme Lorsque la propriété cible est de type string , vous pouvez utiliser la StringFormat propriété définie par BindingBase pour convertir la source en un string . Définir le StringFormat propriété à une mise en forme de chaîne que vous utiliseriez avec la méthode statique de .NET String.Format format pour afficher l’objet. Lorsque vous utilisez cette chaîne de mise en forme dans une extension de balisage, placez-la entre guillemets simples afin
des accolades ne sont pas être confondue avec une extension de balisage incorporé. Le ShowViewValues exemple montre comment utiliser
StringFormat
dans XAML.
Le WhatSizeBindings exemple illustre l’affichage de la taille de la page avec des liaisons à le propriétés de la ContentPage .
Width
et
Height
Pourquoi elle est appelée « Path » ? Le Path propriété du Binding est ce qu’on appelle, car elle peut être une série de propriétés et indexeurs séparés par des points. Le BindingPathDemos montre plusieurs exemples.
Convertisseurs de valeur de liaison Lorsque les propriétés source et cible d’une liaison de types différents, vous pouvez convertir entre les types à l’aide d’un convertisseur de liaison. Il s’agit d’une classe qui implémente le IValueConverter interface et contient deux méthodes : Convert pour convertir la source à la cible, et ConvertBack Pour convertir la cible à la source. Le IntToBoolConverter classe dans le Xamarin.FormsBook.Toolkit bibliothèque est un exemple de conversion d’un int à un bool . Est illustrée par la ButtonEnabler exemple, ce qui permet uniquement la Button si au moins un caractère a été tapé dans un Entry . Le BoolToStringConverter classe convertit un bool à un string et définit deux propriétés pour spécifier que le texte doit être retourné pour false et true valeurs. Le BoolToColorConverter est similaire. Le SwitchText exemple illustre l’utilisation de ces deux convertisseurs pour afficher des textes différents dans différentes couleurs selon un Switch paramètre. Générique BoolToObjectConverter peut remplacer le BoolToStringConverter et comme généralisée bool -à-convertisseur d’objet de tout type.
BoolToColorConverter
et agissent
Liaisons et des vues personnalisées Vous pouvez simplifier les contrôles personnalisés à l’aide de liaisons de données. Le NewCheckBox.cs fichier de code définit Text , TextColor , FontSize , FontAttributes , et IsChecked propriétés, mais n’a aucune logique pour les éléments visuels du contrôle. À la place la NewCheckBox.cs.xaml fichier contient tout le balisage pour les visuels du contrôle par le biais des liaisons de données sur le Label les éléments basés sur les propriétés définies dans le fichier code-behind. Le NewCheckBoxDemo exemple illustre la
Liens connexes Chapitre 16 de texte intégral (PDF ) Exemples de chapitre 16 Liaison de données
NewCheckBox
contrôle personnalisé.
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 , qui définit un collection dans XAML ou de code.
Children
propriété qui
Grid
hérite. Vous pouvez remplir cette
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 : — 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 ) Absolute
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 : — 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 RowProperty
Dans le code, un programme peut utiliser les huit méthodes statiques pour définir et obtenir ces valeurs : Grid.SetRow
et
Grid.GetRow
et Grid.GetColumn Grid.SetRowSpan et Grid.GetRowSpan Grid.SetColumnSpan et Grid.GetColumnSpan Grid.SetColumn
Dans XAML, vous utilisez les attributs suivants pour la définition de ces valeurs : Grid.Row Grid.Column Grid.RowSpan Grid.ColumnSpan
Le SimpleGridDemo exemple montre comment créer et initialiser un
Grid
dans XAML.
Le Grid hérite le Padding propriété Layout et définit deux propriétés supplémentaires qui fournissent l’espacement entre les lignes et colonnes : a la valeur par défaut de 6 ColumnSpacing a la valeur par défaut de 6 RowSpacing
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 d’aligner les enfants dans un Grid cellule.
VerticalOptions
Le SpacingButtons exemple tout aussi espaces
éléments centrés dans
Button
et
HorizontalOptions
Grid
propriétés afin
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 dans chaque cellule pour imiter une bordure de cellule.
Exemples de grille presque réel Le KeypadGrid exemple utilise un
Grid
pour afficher un pavé numérique :
BoxView
éléments
Répondre aux changements d’orientation Le Grid peut aider à structurer un programme pour répondre aux changements d’orientation. Le GridRgbSliders exemple illustre une technique qui déplace un élément entre une deuxième ligne d’un téléphone orienté en mode portrait et la deuxième colonne d’un téléphone en mode paysage. Initialise le programme Slider éléments à une plage de 0 à 255 et utilise les liaisons de données pour afficher la valeur des curseurs au format hexadécimal. Étant donné que le Slider valeurs sont virgule flottante et la mise en forme de chaîne de format hexadécimal fonctionne uniquement avec des entiers, de .NET un DoubleToIntConvert classe dans le Xamarin.FormsBook.Toolkit bibliothèque est utile.
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 sousjacent, 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.
Liaison de données et ViewModels Pour s’engager dans des liaisons de données, un ViewModel doit être capable d’informer la vue lorsqu’une propriété du ViewModel a changé. Le ViewModel fait ceci en implémentant la INotifyPropertyChanged interface dans le System.ComponentModel espace de noms. Il s’agit de partie de .NET au lieu de Xamarin.Forms. (Généralement ViewModels tenter de maintenir l’indépendance de la plateforme.) Le INotifyPropertyChanged interface déclare un événement unique nommé propriété qui a changé.
PropertyChanged
qui indique la
Une horloge de ViewModel Le DateTimeViewModel dans le Xamarin.FormsBook.Toolkit bibliothèque définit une propriété de type DateTime que les modifications basé sur un minuteur. La classe implémente INotifyPropertyChanged et déclenche le PropertyChanged événement chaque fois que le DateTime modifications apportées aux propriétés. 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 de type
ICommand
(défini dans le
CommandParameter
de type
Object
Command
Button
avec deux propriétés publiques :
System.Windows.Input
espace de noms)
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 Un Un
méthode avec un argument de type object CanExecute méthode avec un argument de type object qui retourne CanExecuteChanged événement Execute
bool
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 classe qui implémentent le interface. Le type générique est le type de l’argument à la Execute et CanExecute méthodes.
ICommand
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 aucune modification de code.
TapGestureRecognizer
objets dans XAML sans
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 constructeur de Command . Les touches numériques de la machine à additionner sont liés à la propriété qui est initialisée avec Command et un string l’argument de Execute et CanExecute identifie la clé.
ViewModels et le cycle de vie d’application Le
utilisé dans le AddingMachine exemple définit également deux méthodes nommées SaveState et RestoreState . Ces méthodes sont appelées à partir de l’application lorsqu’elle se met en veille et lorsqu’il démarre à nouveau. AdderViewModel
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 : 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 Picker
Il est courant pour les applications MVVM le
ListView
pour afficher la collection d’objets sélectionnable.
Options du programme avec le sélecteur Le Picker est un bon choix lorsque vous avez besoin autoriser l’utilisateur à choisir une option parmi une liste relativement courte des string éléments. Le sélecteur et la gestion des événements Le PickerDemo exemple montre comment utiliser XAML pour définir le Picker Title propriété et ajoutez string éléments à la Items collection. Lorsque l’utilisateur sélectionne le Picker , elle affiche les éléments dans le Items collection en fonction de la plateforme. Le
événements indique quand l’utilisateur a sélectionné un élément. Base zéro propriété indique ensuite l’élément sélectionné. Si aucun élément n’est sélectionné, SelectedIndex
SelectedIndexChanged
SelectedIndex
est égal à –1. Vous pouvez également utiliser SelectedIndex pour initialiser l’élément sélectionné, mais il doit être définie après le Items collection est remplie. Dans XAML, cela signifie que vous allez probablement utiliser un élément de propriété pour définir SelectedIndex . Le sélecteur de liaison de données Le SelectedIndex propriété est stockée par une propriété pouvant être liée mais Items n’est pas, par conséquent, à l’aide de la liaison de données avec un Picker est difficile. Une solution consiste à utiliser le Picker en association avec un ObjectToIndexConverter comme celui de la Xamarin.FormsBook.Toolkit bibliothèque. Le PickerBinding montre comment cela fonctionne. NOTE Xamarin.Forms Picker inclut désormais données. Consultez sélecteur.
ItemsSource
et
SelectedItem
Rendu des données avec ListView
propriétés qui prennent en charge la liaison de
Le ListView est la seule classe qui dérive de propriétés.
ItemsView
dont elle hérite la
ItemsSource
et
ItemTemplate
est de type IEnumerable , mais il est null par défaut et doit être explicitement initialisés ou (généralement) une collection via une liaison de données. Les éléments de cette collection peuvent être de n’importe quel type. ItemsSource
définit un SelectedItem propriété qui est soit définie sur un des éléments dans le ItemsSource collection ou null si aucun élément n’est sélectionné. ListView se déclenche le ItemSelected événement lorsqu’un nouvel élément est sélectionné. ListView
Collections et les sélections Le ListViewList exemple remplit un ListView avec 17 Color des valeurs dans un List collection. Les éléments sont sélectionnables, mais par défaut, ils sont affichés avec leurs résultats peu esthétiques ToString représentations. Plusieurs exemples dans ce chapitre vous montrent comment corriger qui affichent et rendre aussi attractif comme vous le souhaitez. Le séparateur de ligne Sur iOS et Android affiche, une fine ligne sépare les lignes. Vous pouvez contrôler ceci avec la SeparatorVisibility et SeparatorColor propriétés. SeparatorVisibility propriété est de type SeparatorVisibility , une énumération avec deux membres : Default
, le paramètre par défaut
None
L’élément sélectionné de liaison de données Le SelectedItem propriété repose sur une propriété pouvant être liée, il peut être la source ou la cible d’une liaison de données. Sa valeur par défaut BindingMode est OneWayToSource , mais il est généralement la cible d’une liaison de données bidirectionnelle, en particulier dans les scénarios MVVM. Le ListViewArray exemple illustre ce type de liaison. La différence de ObservableCollection Le ListViewLogger exemples de jeux de la ItemsSource propriété d’un ListView à un List collection puis progressivement ajoute une nouvelle DateTime objet à la collection chaque seconde à l’aide d’un minuteur. Toutefois, le ListView n’automatiquement mettre à jour lui-même, car le List collection n’a pas un mécanisme de notification pour indiquer quand les éléments sont ajoutés ou supprimés de la collection. Une classe beaucoup mieux à utiliser dans de tels scénarios est ObservableCollection définies dans le System.Collections.ObjectModel espace de noms. Cette classe implémente le INotifyCollectionChanged interface et par conséquent se déclenche un CollectionChanged événement lorsque des éléments sont ajoutés ou supprimés de la collection, ou lorsqu’ils sont remplacés ou déplacés dans la collection. Lorsque le ListView en interne détecte qu’une classe qui implémente INotifyCollectionChanged a été défini sur sa ItemsSource propriété, elle joint un gestionnaire à la CollectionChanged événement et met à jour son affichage lorsque la collection est modifiée. Le ObservableLogger exemple illustre l’utilisation de
ObservableCollection
.
Modèles et des cellules Par défaut, un ListView affiche les éléments dans sa collection à l’aide de chaque élément Une meilleure approche consiste à définir un modèle pour afficher les éléments.
ToString
(méthode).
Pour essayer cette fonctionnalité, vous pouvez utiliser la NamedColor classe dans le Xamarin.FormsBook.Toolkit bibliothèque. Cette classe définit un mappage statique All propriété de type IList contenant 141 NamedColor objets correspondant aux champs publics de la Color structure.
Le NaiveNamedColorList exemples de jeux le ItemsSource d’un ListView à ce NamedColor.All propriété, mais uniquement les noms de classe qualifié complet de le NamedColor sont des objets affiché. a besoin d’un modèle pour afficher ces éléments. Dans le code, vous pouvez définir le ItemTemplate propriété définie par ItemsView à un DataTemplate à l’aide de l’objet le DataTemplate constructeur qui fait référence à un dérivé de la Cell classe. Cell a cinq dérivés : ListView
— contient deux Label vues (point de vue conceptuel) ImageCell — Ajoute un Image afficher à TextCell EntryCell — contient un Entry afficher avec un Label SwitchCell — contient un Switch avec un Label ViewCell — peut être toute View (probablement avec enfants) TextCell
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
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. ListView
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 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. ListView
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 Text Icon
définit les cinq propriétés : de type de type
string FileImageSource
de type bool Command de type ICommand CommandParameter de type object IsDestructive
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 IsRefreshing propriétés pour la liaison de données.
RefreshCommand
et
Le TableView et ses intentions Bien que le ListView affiche généralement plusieurs instances du même type, le TableView se concentre généralement sur la fourniture d’une interface utilisateur pour plusieurs propriétés de différents types. Chaque élément est associé à sa propre Cell dérivés pour afficher la propriété ou en fournissant une interface utilisateur à ce dernier. Propriétés et des hiérarchies TableView définit que quatre propriétés : de type TableIntent , énumération Root de type TableRoot , la propriété de contenu de RowHeight de type int HasUnevenRows de type bool Intent
Le
TableIntent
TableView
énumération indique la façon dont vous prévoyez d’utiliser le
TableView
:
Data Form Settings Menu
Ces membres suggèrent également certaines utilisations pour le
TableView
.
Plusieurs autres classes sont impliqués dans la définition d’une table : TableSectionBase
est une classe abstraite qui dérive de
TableSectionBase
BindableObject
est une classe abstraite qui dérive de
et définit un
TableSectionBase
Title
et implémente
propriété IList
et
INotifyCollectionChanged TableSection TableRoot
En bref,
dérive de
dérive de
TableSectionBase
TableSectionBase
a 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 . TableView
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 ProgrammerInformation , cette technique ne semble pas fonctionner, ce qui demande à l’exemple suivant. IsEnabled
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 HttpClient prend en charge les opérations asynchrones.
WebRequest
pour accéder aux fichiers via internet.
Une approche plus moderne pour le traitement asynchrone est disponible dans .NET et c#. Cela implique le Task et Task 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.
À partir des rappels pour attendre Le
Page
classe elle-même contient trois méthodes asynchrones pour afficher les zones de l’alerte :
Retourne un Task objet DisplayAlert Retourne un Task objet DisplayActionSheet Retourne un Task objet DisplayAlert
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 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 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 Device.BeginInvokeOnMainThread appels. Une alerte avec await Une approche plus simple implique la illustre son utilisation.
async
et
await
Task
et
mots clés introduits dans c# 5. Le AlertAwait exemple
Une alerte sans rien Si la méthode asynchrone retourne Task plutôt que Task , puis le programme n’a pas besoin d’utiliser une de ces techniques si elle n’a pas besoin de savoir quand la tâche asynchrone est terminée. Le NothingAlert illustre cela. Enregistrement des paramètres de programme en mode asynchrone Le SaveProgramChanges exemple illustre l’utilisation de la SavePropertiesAsync méthode de Application pour enregistrer les paramètres du programme mesure qu’elles changent sans substitution de la OnSleep (méthode). Un minuteur indépendant de la plateforme Il est possible d’utiliser Task.Delay pour créer un minuteur indépendant de la plateforme. Le TaskDelayClock illustre cela.
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.
Une première tentative de fichier inter-plateformes d’e/s Le TextFileTryout exemple définit un IFileHelper interface pour les e/s de fichier et les implémentations de cette interface dans toutes les plateformes. Toutefois, les implémentations de Windows Runtime ne fonctionnent pas
avec les méthodes dans cette interface, car les méthodes d’e/s de fichier Windows Runtime sont asynchrones. Prise en charge d’e/s de fichier Windows Runtime Utilisent les classes de programmes s’exécutant sous le Runtime Windows le Windows.Storage et Windows.Storage.Streams espaces de noms pour le fichier d’e/s, y compris le stockage local des applications. Étant donné que Microsoft déterminé que toute opération qui requiert que plus de 50 millisecondes doivent être asynchrones pour éviter de bloquer le thread d’interface utilisateur, ces méthodes d’e/s de fichier sont principalement asynchrones. Le code qui illustre cette nouvelle approche sera dans une bibliothèque afin qu’il peut être utilisé par d’autres applications.
Bibliothèques propres à une plateforme Il est préférable de stocker le code réutilisable dans des bibliothèques. Il s’agit évidemment plus difficile lorsque différentes parties du code réutilisable sont pour les systèmes d’exploitation entièrement différents. Le Xamarin.FormsBook.Platform solution illustre une approche. Cette solution contient sept projets différents : Xamarin.FormsBook.Platform, une bibliothèque de classes portable Xamarin.Forms normal Xamarin.FormsBook.Platform.iOS, une bibliothèque de classes iOS Xamarin.FormsBook.Platform.Android, une bibliothèque de classes Android Xamarin.FormsBook.Platform.UWP, une bibliothèque de classes Windows Universal Xamarin.FormsBook.Platform.WinRT, un projet partagé pour le code qui est commune à toutes les plateformes Windows Tous les projets de plateforme individuels (à l’exception de Xamarin.FormsBook.Platform.WinRT) ont des références à Xamarin.FormsBook.Platform. Les trois projets de Windows ont une référence à Xamarin.FormsBook.Platform.WinRT. Tous les projets contiennent un statique Toolkit.Init méthode pour vous assurer que la bibliothèque est chargée s’il n’est pas directement référencé par un projet dans une solution d’application Xamarin.Forms. Le Xamarin.FormsBook.Platform projet contient le nouvel IFileHelper interface. Toutes les méthodes ont maintenant des noms avec Async retour et les suffixes Task objets. Le Xamarin.FormsBook.Platform.WinRT projet contient le
FileHelper
classe pour l’exécution de Windows.
Le Xamarin.FormsBook.Platform.iOS projet contient le FileHelper classe pour iOS. Ces méthodes doivent maintenant être asynchrones. Certaines des méthodes utilisent des versions asynchrones des méthodes définies dans StreamWriter et StreamReader : WriteAsync et ReadToEndAsync . D’autres convertir un résultat pour un Task à l’aide de l’objet le FromResult (méthode). Le Xamarin.FormsBook.Platform.Android projet contient un texte similaire Le Xamarin.FormsBook.Platform projet contient également un DependencyService objet.
FileHelper
FileHelper
classe pour Android.
classe qui facilite l’utilisation de la
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
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. WriteFileAsync
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.
Vos propres méthodes pouvant être attendus Vous pouvez exécuter du code de façon asynchrone en le passant à une de la Task.Run méthodes. Vous pouvez appeler Task.Run au sein d’une méthode async qui gère la partie de la surcharge. Les différents
Task.Run
modèles sont décrits ci-dessous.
L’ensemble de Mandelbrot base Pour dessiner l’ensemble en temps réel, de Mandelbrot le Xamarin.Forms.Toolkit bibliothèque possède un Complex structure similaire à celui de la System.Numerics espace de noms. 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 classe et de définir votre méthode asynchrone pour avoir un argument de type IProgress . 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 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 horizontalement ou verticalement.
TranslationX
et
TranslationY
propriétés déplacer un élément
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 BlockText exemple.
Label
pour ressembler à un bloc 3D, comme illustré dans le
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. Vous pouvez expérimenter la
Scale
à l’aide de la propriété le SimpleScaleDemo exemple.
Le ButtonScaler exemple illustre la différence entre l’animation de la Scale propriété d’un Button et animer le FontSize propriété. Le FontSize propriété affecte la Button est perçu dans disposition ; le Scale propriété n’a pas. Le ScaleToSize exemple calcule un Scale propriété qui est appliquée à un grand que possible tout en adaptant toujours au sein de la page.
Label
élément pour le rendre aussi
Ancrage de la mise à l’échelle Les éléments mis à l’échelle dans les trois exemples précédents ont tous les augmenter ou réduire la taille par rapport au centre de l’élément. En d’autres termes, l’élément augmente ou diminue en taille identique dans toutes les directions. Seul le point au centre de l’élément reste dans le même emplacement pendant la mise à l’échelle. Vous pouvez modifier le centre de la mise à l’échelle en définissant le AnchorX et AnchorY propriétés. Ces propriétés sont par rapport à l’élément lui-même. Pour AnchorX , la valeur 0 fait référence à gauche de l’élément et 1 fait référence à la partie droite. De même pour AnchorY , 0 est la partie supérieure et 1 est bas. Les deux propriétés ont des valeurs par défaut de 0.5, qui est le centre. Le AnchoredScaleDemo exemple vous permet de faire des essais avec la que le Scale propriété. Sur iOS, à l’aide de valeurs non défaut de
AnchorX
et
AnchorY
AnchorX
et
AnchorY
propriétés ainsi
propriétés est généralement pas compatible avec
les changements d’orientation de téléphone.
La transformation de rotation Le
propriété est spécifiée en degrés et indique une rotation autour d’un point de l’élément défini par et AnchorY . Le PlaneRotationDemo vous permet de faire des essais avec ces trois propriétés.
Rotation
AnchorX
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 membres spokes.
Label
éléments avec la même chaîne de texte pivoté apparaît comme
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. Également inclus dans Xamarin.FormsBook.Toolkit est un SecondTickConverter classe qui implémente IValueConverter et permet d’arrondir un angle deuxième à la seconde près. 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 :
En outre un SecondBackEaseConverter classe Xamarin.FormsBook.Toolkit provoque la seconde aiguille apparaisse sur ressortir un peu avant de passer à l’avance, puis à les replacer dans sa position correcte. Curseurs verticales ? Le VerticalSliders exemple montre que Slider éléments peut être pivotées de 90 degrés et fonctionnent toujours. Toutefois, il est difficile de positionner ces paysage Slider éléments, car dans la mise en page ils toujours apparaître à l’horizontale.
Rotations qui concerne 3D
Le RotationX propriété s’affiche pour faire pivoter un élément autour d’un axe des abscisses 3D afin que le haut et le bas de l’élément semblent déplacer vers ou à partir de la visionneuse. De même, le RotationY semble faire pivoter un élément autour de l’axe des ordonnées pour rendre les côtés gauche et droit de l’élément semblent à déplacer vers ou à partir de la visionneuse. Le
propriété affecte RotationY mais pas RotationX . Le AnchorY propriété affecte RotationX mais pas RotationY . Vous pouvez expérimenter la ThreeDeeRotationDemo exemple pour Explorer les interactions de ces propriétés. AnchorX
Le système de coordonnées 3D impliqué par Xamarin.Forms est gaucher. Si vous pointez le pouce de votre main gauche dans la direction de l’augmentation de X coordonnées coordonnées (à droite) et votre doigt intermédiaire dans la direction de croissant Y (points vers le bas), puis votre curseur dans le sens d’augmentation de coordonnées Z (hors de l’écran). En outre, pour tous les trois axes, si vous pointez votre curseur gauche dans la direction de l’augmentation des valeurs, puis la courbe de vos doigts indique la direction de rotation des angles de rotation positives.
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 : , l’approche de haut niveau Animation , plus polyvalent, mais il est plus difficile AnimationExtension , le plus polyvalente plus bas niveau approche ViewExtensions
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.
Exploration des animations de base Les fonctions d’animation de base sont des méthodes d’extension trouvées dans le ViewExtensions classe. Ces méthodes s’appliquent à n’importe quel objet qui dérive de VisualElement . Les animations de la plus simple ciblent les propriétés décrites dans les transformations Chapter 21. Transforms . Le AnimationTryout montre comment la Clicked Gestionnaire d’événements pour un RotateTo méthode d’extension pour mettre en place le bouton dans un cercle.
Button
peut appeler le
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 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 : , la valeur par défaut SinIn , SinOut , et SinInOut CubicIn , CubicOut , et CubicInOut BounceIn et BounceOut SpringIn et SpringOut Linear
Le In suffixe indique que l’effet se trouve au début de l’animation, au début et à la fin de l’animation.
Out
signifie à la fin, et
InOut
signifie qu’il est
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 à la Easing constructeur. Easing définit également une conversion implicite de Func à 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 page sur les côtés.
TranslateTo
méthode d’extension à la diapositive dans le contenu de la
Le SwingingEntrance exemple utilise le RotateYTo méthode d’extension pour animer la RotateXTo méthode est également disponible.
RotationY
propriété. Un
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 centre de l’écran.
BoxView
hélicoptère lors de la révolution il autour du
RotatingSpokes tourne BoxView rayons autour du centre de l’écran, puis fait pivoter chaque membre spoke luimê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 , image bitmap fait tourner dans l’espace 3D.
RotateXTo
, et
RotateYTo
pour donner l’impression que si une
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 :
Vos propres animations pouvant être attendues Le TryAwaitableAnimation exemple crée une animation pouvant être attendue. La classe essentielle qui peut retourner un Task objet à partir de la méthode et le signal lorsque l’animation est terminée est TaskCompletionSource .
Plus profondément dans les animations Le système d’animation Xamarin.Forms peut être un peu déroutant. Outre le Easing (classe), le système d’animation comprend le ViewExtensions , Animation , et AnimationExtension classes. Classe de ViewExtensions Vous avez déjà vu ViewExtensions . Il définit neuf méthodes qui retournent Task et CancelAnimations . Sept de la cible de neuf méthodes propriétés de transformation. Les deux autres sont FadeTo , les cibles le Opacity propriété, et LayoutTo , qui appelle le Layout (méthode). 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
L’objet d’animation est ensuite démarré avec un appel à la
,
WithConcurrent
Commit
et la surcharge de
WithConcurrent
(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 la classe d’Animation Le ConcurrentAnimations exemple illustre la
Animation
classe avec plusieurs animations différents.
Animations enfants Le ConcurrentAnimations exemple illustre également l’enfant d’animations qui utilisent le (similaire)
Add
et
Insert
méthodes.
Au-delà des méthodes de haut niveau d’animation Le ConcurrentAnimations exemple montre également comment exécuter des animations qui dépassent les propriétés ciblées par le ViewExtensions méthodes. Dans un exemple, une série de périodes d’obtenir plus de temps ; dans un autre exemple, un BackgroundColor propriété est animée. Plusieurs de vos propres méthodes pouvant être attendus Le TranslateTo méthode de ViewExtensions ne fonctionne pas avec le lorsque la sortie accélération obtient supérieures à 1.
Easing.SpringOut
(fonction). Il s’arrête
Le Xamarin.FormsBook.Toolkit bibliothèque contient un MoreViewExtensions classe avec TranslateXTo et TranslateYTo les méthodes d’extension qui n’ont pas ce problème, ainsi que CancelTranslateXTo et CancelTranslateYTo méthodes d’annulation ceux animations. Le SpringSlidingEntrance montre le
TranslateXTo
Le MoreExtensions classe contient également un X et Y, et un CancelTranslateXYTo (méthode).
(méthode).
TranslateXYTo
méthode d’extension qui combine la traduction de
Implémentation d’une animation de Bézier Il est également possible de développer une animation qui déplace un élément le long du tracé d’une spline de Bézier. Le Xamarin.FormsBook.Toolkit bibliothèque contient un BezierSpline structure qui encapsule une spline de Bézier et un BezierTangent énumération pour contrôler l’orientation. Le MoreViewExtensions classe contient un (méthode).
BezierPathTo
méthode d’extension et un
CancelBezierPathTo
Le BezierLoop exemple illustre l’animation d’un élément le long d’un chemin d’accès Beizer.
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 méthode dans AnimationExtensions .
Animate
Le ColorAnimations exemple illustre l’utilisation de ces deux types d’animations de couleur.
Structuration de vos animations Il est parfois utile exprimer des animations dans XAML et les utiliser conjointement avec MVVM. Cela est couvert dans le chapitre suivant, chapitre 23. Déclencheurs et comportements.
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 charge les deux propriétés de collection :
VisualElement
et
Style
prennent en
et Style.Triggers de type IList VisualElement.Behaviors et Style.Behaviors de type IList VisualElement.Triggers
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 . TriggerBase est une classe abstraite dont dérivent les classes sealed quatre : 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 Trigger
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 :
de type BindableProperty Value de type Object Setters de type IList , la propriété de contenu de Property
En outre,
Trigger
TargetType
Le
nécessite que la propriété suivante héritée
pour indiquer le type de l’élément sur lequel le
Trigger
TriggerBase Trigger
être définies :
est attaché
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
Property
de type
BindableProperty
Value
de type
Object
Le EntryPop exemple montre comment un Trigger appliqué à un Entry peut augmenter la taille de la via la Scale propriété lorsque la IsFocused propriété de la Entry est true . Bien qu’il n’est pas courant, la exemples.
Trigger
Entry
peut être défini dans le code, comme le EntryPopCode montre des
Le StyledTriggers exemple montre comment la plusieurs Entry éléments.
Trigger
peuvent être définies dans un
Style
à appliquer à
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 : de type string , le nom d’un événement Actions de type IList , une liste d’actions à exécuter en réponse. Event
Pour l’utiliser, vous devez écrire une classe qui dérive de TriggerAction , généralement TriggerAction . 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 Focused et Unfocused événements.
ScaleAction
à partir de
EventTrigger
objets qui surveille le
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 que vous êtes conscient que TriggerBase définit deux collections : EnterActions ExitActions
EventTrigger
). Cela nécessite
de type IList de type IList
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 à éléments et des jeux le TextColor propriété if rouge le Text propriété n’est pas un double . Le TriggerEntryValidation illustre cela.
Entry
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 :
de type BindingBase Value de type Object Setters de type IList Binding
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 appliquées. La classe définit deux propriétés :
true
, puis les accesseurs Set est
de type IList de type IList
Conditions Setters Condition
est une classe abstraite et dispose de deux classes descendants :
, qui a Property et Value propriétés telles que Trigger BindingCondition , qui a Binding et Value propriétés telles que DataTrigger PropertyCondition
Dans le conditionsd exemple, un activés.
BoxView
est coloré uniquement lorsqu’il y a quatre
Switch
éléments sont tous
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 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 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 en association avec ce comportement.
DataTrigger
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 texte pour le bouton bascule.
ToggleBehavior
avec un
DataTrigger
à utiliser un
Le FormattedTextToggle exemple étend ce concept en basculant entre deux Le
Label
avec deux chaînes de
FormattedString
objets.
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. ToggleBase
Le SwitchCloneDemo inclut un SwitchClone classe qui dérive de ToggleBase et utilise un classe pour construire un bouton bascule qui ressemble à la Xamarin.Forms Switch .
TranslateAction
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 éléments.
TapBehavior
à utiliser l’ancien
ShiverAction
pour l’appui sur
BoxView
Le ShiverViews exemple montre comment réduire le balisage en encapsulant un Cases d’option Le Xamarin.FormsBook.Toolkit bibliothèque possède également un cases d’option qui sont regroupées par un string nom du groupe.
ShiverView
RadioBehavior
classe.
classe pour effectuer des
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.
Pages modales et non modales définit un Navigation propriété de type accéder à une nouvelle page : VisualElement
INavigation
, qui inclut les deux méthodes suivantes pour
PushAsync PushModalAsync
Les deux méthodes acceptent une Page instance en tant qu’argument et retournent un méthodes suivantes accédez à la page précédente :
Task
objet. Les deux
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 Navigation propriété du courant Page instance.
VisualElement
, elles sont généralement appelées à partir la
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 méthode :
App
BarBackgroundColor BarTextColor
inclut également les quatre propriétés jointes pouvant être liées qui affectent la page spécifique sur lequel elles sont définies : NavigationPage
SetHasBackButton
et
GetHasBackButton
et GetHasNavigationBar SetBackButtonTitle et GetBackButtonTitle Professionnel sur iOS uniquement SetTitleIcon et GetTitleIcon Professionnel sur iOS et Android uniquement SetHasNavigationBar
Explorer la mécanique Les méthodes de navigation de page sont toutes asynchrones et doit être utilisés avec await . La saisie semiautomatique 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 entre les pages. Le
INavigation
OnAppearing
et
OnDisappearing
méthodes n’indiquent pas nécessairement navigation
interface inclut deux propriétés de collection qui vous permettent d’examiner la pile de navigation : de type IReadOnlyList pour la pile non modale de type IReadOnlyList pour la pile modale
NavigationStack ModalStack
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 pile de navigation de manière structurée :
INavigation
RemovePage InsertPageBefore PopToRootAsync
et
PopToRootAsync
Génération de page dynamique
avec animation facultative
qui vous permettent de manipuler la
Le BuildAPage exemple illustre la construction d’une page lors de l’exécution en fonction de l’entrée d’utilisateur.
Modèles de transfert de données Il est souvent nécessaire de partager des données entre les pages — pour transférer des données vers une page de navigation et d’une page retourner des données à la page qui l’a appelée. Il existe plusieurs techniques permettant de le faire. Arguments de constructeur Lors de la navigation vers une nouvelle page, il est possible d’instancier la classe de page avec un argument de constructeur qui permet à la page pour s’initialiser. Le SchoolAndStudents illustre cela. Il est également possible d’avoir une page naviguée son BindingContext définie par la page qui navigue vers elle. Propriétés et appels de méthode Les autres exemples de transfert de données d’Explorer le problème de passer des informations entre les pages quand une page navigue vers une autre page et inversement. Dans ces discussions, les domestique page accède à la info page et doit transférer des informations initialisées à la info page. Le info page obtient des informations supplémentaires à partir de l’utilisateur et transfère les informations à la domestique page. Le domestique page permettre accéder facilement aux méthodes publiques et les propriétés dans le info page dès qu’il instancie cette page. Le info page permettre également accéder aux méthodes publiques et les propriétés dans le domestique page, mais que le choix d’un bon moment pour Ceci peut être difficile. Le DateTransfer1 exemple fait cela dans son OnDisappearing remplacer. L’inconvénient est que le info page doit connaître le type de la domestique page. MessagingCenter Xamarin.Forms MessagingCenter classe fournit une autre façon pour les deux pages communiquer entre eux. Les messages sont identifiés par une chaîne de texte et peuvent être accompagnés de n’importe quel objet. Un programme qui souhaite recevoir des messages à partir d’un type particulier doit s’abonner à eux à l’aide de MessagingCenter.Subscribe et spécifier une fonction de rappel. Plus tard, il peut se désabonner en appelant MessagingCenter.Unsubscribe . La fonction de rappel reçoit tout message envoyé à partir du type spécifié avec le nom spécifié est envoyé via le Send (méthode). Le DateTransfer2 programme montre comment transférer des données à l’aide du centre de messagerie, mais là encore, ceci nécessite que le info page connaître le type de la accueil page. Événements L’événement est une approche précieuses pour une classe envoyer des informations à une autre classe sans connaître les type de cette classe. Dans le DateTransfer3 exemple le info classe définit un événement qu’il se déclenche lorsque les informations sont prêtes. Toutefois, il n’existe aucun emplacement pratique où les le domestique page pour détacher le Gestionnaire d’événements. L’intermédiaire de la classe application Le DateTransfer4 exemple montre comment accéder aux propriétés définies dans le App classe à la fois par le domestique page et le infopage. Il s’agit d’une bonne solution, mais la section suivante décrit une meilleure solution. Passage à un ViewModel À l’aide d’un ViewModel pour les informations permettant la domestique page et le info page à partager l’instance de la classe d’informations. Cela est illustré dans le DateTransfer5 exemple. Enregistrement et restauration de l’état de la page Le App intermédiaire de la classe ou l’approche ViewModel est idéale lors de l’application doit enregistrer vos informations si le programme se met en veille pendant que le info page est active. Le DateTransfer6 illustre cela.
Enregistrement et restauration de la pile de navigation En règle générale, un programme de plusieurs pages qui se met en veille doit accéder à la même page lorsqu’elle est restaurée. Cela signifie qu’un tel programme doit enregistrer le contenu de la pile de navigation. Cette section montre comment automatiser ce processus dans une classe conçue à cet effet. Cette classe appelle également les pages individuelles pour les autoriser à enregistrer et restaurer leur état de la page. Le Xamarin.FormsBook.Toolkit bibliothèque définit une interface nommée IPersistantPage que les classes peuvent implémenter pour enregistrer et restaurer des éléments dans le Properties dictionnaire. Le MultiPageRestorableApp classe dans le Xamarin.FormsBook.Toolkit dérive de la bibliothèque Application . Vous pouvez ensuite dériver votre App classe MultiPageRestorableApp et effectuer un peu de ménage. Le StackRestoreDemo illustre l’utilisation de
MultiPageRestorableApp
.
Quelque chose comme une application de la vie réelle Le NoteTaker exemple utilise également MultiPageRestorableApp , tout en permettant à l’entrer et de modifier des notes qui sont enregistrés dans le Properties dictionnaire.
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 présente deux autres :
et
NavigationPage
Ces types de page fournissent les options de navigation plus sophistiquées que la chapitre 24. Navigation entre les pages.
NavagationPage
Page
:
ContentPage
. Ce chapitre
gère les deux pages, un serveur maître et un détail gère plusieurs pages enfants accédés via les onglets
MasterDetailPage TabbedPage
abordés dans
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 propriété de la page maître.
Icon
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 entre les pages maître et détail.
MasterDetailPage
. Ceci permet des liaisons de données à définir
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 :
Votre propre interface utilisateur Bien que Xamarin.Forms fournit une interface utilisateur pour basculer entre les vues maître et détail, vous pouvez fournir votre propre. Pour ce faire : Définir le IsGestureEnabled propriété false pour désactiver le balayage Remplacer le ShouldShowToolbarButton méthode et retournez false pour masquer les boutons de barre d’outils de Windows 8.1 et Windows Phone 8.1. Vous devez ensuite fournir un moyen de basculer entre les pages maître et détail, comme illustré par la ColorsDetail exemple. Le MasterDetailTaps exemple montre comment utiliser une autre approche un pages maître et détail.
TapGestureRecognizer
sur les
TabbedPage Le TabbedPage est une collection de pages que vous pouvez passer à l’aide des onglets. Il dérive MultiPage et ne définit aucun propriétés ou méthodes publiques qui lui sont propres. MultiPage , toutefois, définit une propriété : Children
propriété de type
Vous renseignez ceci
Children
IList
collection avec des objets de la page.
Une autre approche vous permet de définir le TabbedPage enfants fonctionne comme un deux propriétés qui génèrent automatiquement des pages à onglets :
ListView
à l’aide de ces
de type IEnumerable ItemTemplate de type DataTemplate ItemsSource
Toutefois, cette approche ne fonctionne pas correctement sur iOS lors de la collection contient plusieurs éléments.
MultiPage
définit les propriétés vous permettent d’effectuer le suivi de page qui est actuellement affichée :
de type T , qui fait référence à la page SelectedItem de type Object , qui fait référence à l’objet dans le CurrentPage
MultiPage
ItemsSource
collection
définit également deux événements :
Lorsque le ItemsSource modifications de la collection CurrentPageChanged Lorsque la page affichée change PagesChanged
Pages d’onglets discrètes Le DiscreteTabbedColors exemple se compose de trois pages à onglets qui affichent les couleurs de trois façons différentes. Chaque onglet est un ContentPage dérivé, puis le TabbedPage dérivé DiscreteTabbedColorsPage.xaml combine les trois pages. Pour chaque page qui s’affiche dans un TabbedPage , le Title propriété est requise pour spécifier le texte dans l’onglet, et le Store d’Apple nécessite qu’une icône également être utilisé, par conséquent, le Icon propriété est définie pour iOS :
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 StackLayout Grid
Layout
:
,
, et
AbsoluteLayout RelativeLayout
.
Ce chapitre explique comment créer vos propres classes qui dérivent de
Layout
.
Une vue d’ensemble de mise en page Il n’existe aucun système centralisé qui gère la disposition de Xamarin.Forms. Chaque élément est chargé de déterminer ce que sa taille doit être et comment effectuer le rendu de lui-même au sein d’une zone particulière. Parents et enfants Chaque élément qui a des enfants est chargé pour le positionnement de ces enfants à l’intérieur de lui-même. Il est le parent qui détermine la taille adaptée à ses enfants doit être basé sur la taille, il propose disponible et la taille de l’enfant souhaite être. Dimensionnement et de positionnement Disposition commence en haut de l’arborescence d’éléments visuels avec la page et se poursuit dans toutes les branches. La méthode la plus importante publique dans la disposition est Layout défini par VisualElement . Chaque élément est parent d’autres appels éléments Layout pour chacun de ses enfants à donner à l’enfant, une taille et la position par rapport à lui-même sous la forme d’un Rectangle valeur. Ces Layout propagent des appels dans l’arborescence visuelle. Un appel à Layout est requis pour un élément à l’écran et les propriétés en lecture seule suivantes à définir. Elles sont cohérentes avec le Rectangle transmis à la méthode : de type Rectangle X de type double Y de type double Width de type double Height de type double Bounds
Avant la
Layout
Un appel à
appeler,
Layout
Height
et
Width
comportent des valeurs fictifs –1.
déclenche également des appels aux méthodes protégées suivantes :
, qui appelle OnSizeAllocated , qui peut être substitué. SizeAllocated
Enfin, l’événement suivant sont déclenché : SizeChanged
Le OnSizeAllocated méthode est substituée par Page et Layout , qui sont les seules deux classes dans Xamarin.Forms qui peut avoir des enfants. Les appels de méthode substituée UpdateChildrenLayout
pour
pour
Page
LayoutChildren
dérivés et UpdateChildrenLayout pour Layout dérivés, qui appelle dérivés et LayoutChildren pour Layout dérivés. Page
appelle ensuite Layout pour chacun des enfants de l’élément. Si au moins un enfant dispose d’un nouveau Bounds définition, puis l’événement suivant sont déclenché : LayoutChildren
LayoutChanged
pour
Page
dérivés et
LayoutChanged
pour
Layout
dérivés
Contraintes et des demandes de taille Pour LayoutChildren intelligemment appeler Layout sur tous ses enfants, il doit connaître un préféré ou souhaitée taille pour les enfants. Par conséquent, les appels à Layout pour chacun des enfants sont généralement précédé par des appels à GetSizeRequest
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 deux membres :
Margin
propriété et comprend un argument de type
MeasureFlag
, qui a
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
Request Minimum
de type de type
et
Measure
retournent une valeur de type
, qui a deux propriétés :
Size Size
Très souvent ces deux valeurs sont identiques et le
Minimum
valeur peut généralement être ignorée.
définit également une méthode protégée similaire à GetSizeRequest : VisualElement
OnSizeRequest
SizeRequest
Retourne un
SizeRequest
GetSizeRequest
qui est appelée à partir de
valeur
Cette méthode est maintenant déconseillée et remplacée par : OnMeasure
Chaque classe qui dérive de Layout ou Layout 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 : de type double , affecte le Request propriété de SizeRequest HeightRequest de type double , affecte le Request propriété de SizeRequest MinimumWidthRequest de type double , affecte le Minimum propriété de SizeRequest MinimumHeightRequest de type double , affecte le Minimum propriété de SizeRequest WidthRequest
Contraintes infinies Les arguments de contrainte passés à GetSizeRequest (ou Measure ) et OnSizeRequest (ou OnMeasure ) peut être infinie (par exemple, les valeurs de Double.PositiveInfinity ). Toutefois, le SizeRequest retourné à partir de ces méthodes ne peuvent pas contenir des dimensions infinies. Contraintes infinies indiquent que la taille demandée doit refléter la taille naturelle de l’élément. Un vertical StackLayout appels GetSizeRequest (ou Measure ) sur ses enfants, avec une contrainte de hauteur infinie. Appelle une disposition de pile horizontale GetSizeRequest (ou Measure ) sur ses enfants, avec une contrainte de largeur infinie. Un AbsoluteLayout appels GetSizeRequest (ou Measure ) sur ses enfants, avec des contraintes de la largeur et hauteur infinies. Lecture à l’intérieur du processus Le ExploreChildSize affiche contrainte et la taille de demander des informations pour une disposition simple.
Dérivation à partir de la mise en page Une classe de disposition personnalisée dérive
Layout
. Il possède deux responsabilités :
Substituer OnMeasure pour appeler Measure sur les enfants de tous les la disposition. Retourner une taille demandée pour la disposition lui-même Substituer LayoutChildren pour appeler Layout sur les enfants de tous les la disposition Le for ou sur false .
foreach
boucle dans ces remplacements doit ignorer tout enfant dont
IsVisible
propriété est définie
Un appel à OnMeasure n’est pas garanti. OnMeasure ne sera pas appelé si le parent de la disposition est régissant la taille de la mise en page (par exemple, une disposition qui remplit une page). Pour cette raison, LayoutChildren ne peuvent pas reposer sur les tailles enfant obtenus au cours de la OnMeasure appeler. Très souvent, LayoutChildren doit lui-même appeler Measure sur les enfants de la mise en page, ou vous pouvez implémenter une sorte de taille de la mise en cache logique (décrite ultérieurement). Un exemple simple Le VerticalStackDemo exemple contient un simplifiée utilisation.
VerticalStack
classe et une démonstration de son
Simplifié de positionnement vertical et horizontal Un des travaux qui VerticalStack doit effectuer se produit pendant la LayoutChildren remplacer. La méthode utilise l’enfant HorizontalOptions propriété afin de déterminer comment positionner l’enfant dans son emplacement dans le VerticalStack . Vous pouvez appeler la méthode statique Layout.LayoutChildIntoBoundingRect . Cette méthode appelle Measure sur l’enfant et utilise son HorizontalOptions et VerticalOptions propriétés pour positionner l’enfant dans le rectangle spécifié. Invalidation Souvent une modification de propriété d’un élément sur comment cet élément apparaît dans la disposition. La disposition doit être rendus non valide pour déclencher une nouvelle disposition. définit une méthode protégée InvalidateMeasure , qui est généralement appelée par le Gestionnaire de modification de propriété de n’importe quelle propriété pouvant être liée dont la modification affecte la taille de l’élément. Le InvalidateMeasure méthode déclenche un MeasureInvalidated événement. VisualElement
Le Layout classe définit une méthode protégée similaire nommée InvalidateLayout , qui une Layout dérivé doit appeler pour toute modification qui affecte la façon dont il positionne et redimensionne ses enfants. Certaines règles de codage des dispositions 1. Propriétés définies par Layout dérivés doivent être assorties de propriétés pouvant être liées et les
gestionnaires de modification de propriété doivent appeler
InvalidateLayout
.
2. Un Layout dérivé qui définit les propriétés pouvant être liées attachées doit substituer OnAdded pour ajouter un gestionnaire de modification de propriété à ses enfants et OnRemoved pour supprimer les Gestionnaire. Le gestionnaire doit vérifier pour les modifications dans ces attachés propriétés pouvant être liées et répondre en appelant InvalidateLayout . 3. Un
dérivée qui implémente un cache de tailles d’enfants doit substituer OnChildMeasureInvalidated et effacer le cache lorsque ces méthodes sont appelées. Layout
InvalidateLayout
et
Une disposition avec des propriétés Le WrapLayout classe dans le Xamarin.FormsBook.Toolkit suppose que tous ses enfants sont la même taille et les enfants est renvoyé à partir d’une ligne (ou colonne) à l’autre. Il définit un Orientation propriété comme StackLayout , et ColumnSpacing et RowSpacing propriétés telles que Grid , et il met en cache les tailles d’enfant. 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
:
Enfants qui se chevauchent Un Layout dérivé peut se chevaucher ses enfants. Toutefois, les enfants sont rendus dans leur ordre dans le Children collection et pas l’ordre dans lequel leurs Layout méthodes sont appelées. Le
Layout
classe définit deux méthodes qui vous permettent de déplacer un enfant au sein de la collection :
LowerChild RaiseChild
Pour déplacer un enfant au début de la collection 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 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.
La hiérarchie de classe complète Il existe quatre assemblys qui contiennent le code spécifique à la plateforme Xamarin.Forms. Vous pouvez afficher la source sur GitHub à l’aide de ces liens : Xamarin.Forms.Platform (très petite) Xamarin.Forms.Platform.iOS Xamarin.Forms.Platform.Android Xamarin.Forms.Platform.UAP 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
a des arguments génériques :
limité à Xamarin.Forms.View TNativeView limité à UIKit.UIView TView
Android
ViewRenderer
a des arguments génériques :
limité à Xamarin.Forms.View TNativeView limité à Android.Views.View TView
La plateforme Windows universelle arguments génériques : TElement
limité à
ViewRenderer
Xamarin.Forms.View
a nommé différemment les
TNativeElement
limité à
Windows.UI.Xaml.FrameworkElement
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.
Hello, renderers personnalisés ! Le HelloRenderers programme fait référence à une vue personnalisée nommée Le
HelloView
HelloView
classe est incluse dans le HelloRenderers de projet et dérive simplement de
dans son View
classe.
.
Le HelloViewRenderer classe dans le HelloRenderers.iOS dérive de projet ViewRenderer
Le HelloViewRenderer classe dans le HelloRenderers.Droid dérive de projet ViewRenderer
.
classe dans le HelloRenderers.UWP et autres projets Windows dérive ViewRenderer . Dans le OnElementChanged override, il crée un Windows TextBlock et appelle SetNativeControl . HelloViewRenderer
Tous les le
dé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 : ViewRenderer
Convertisseurs et des propriétés L’ensemble suivant de convertisseurs implémente le dessin de l’ellipse et se trouve dans les différents projets de la Xamarin.FormsBook.Platform solution. Le
classe se trouve dans le Xamarin.FormsBook.Platform plateforme. La classe est similaire à et définit qu’une seule propriété : Color de type Color .
EllipseView
BoxView
Les convertisseurs peuvent transférer des valeurs de propriétés définies sur un View à l’objet natif en substituant le OnElementPropertyChanged méthode dans le convertisseur. Dans cette méthode (et, dans la plupart du convertisseur), deux propriétés sont disponibles :
, l’élément Xamarin.Forms Control , le mode natif ou l’objet de widget ou de contrôle Element
Les types de ces propriétés sont déterminés par les paramètres génériques à Element est de type EllipseView . Le
ViewRenderer
remplacement peut transférer par conséquent la Color valeur de la objet, probablement avec un type de conversion. Les convertisseurs de trois sont :
OnElementPropertyChanged
Control
. Dans cet exemple,
Element
natif
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
Le BouncingBall rebondit un
EllipseView
EllipseView
objets :
désactivé les côtés de l’écran.
Convertisseurs et des événements Il est également possible pour des convertisseurs générer des événements indirectement. Le StepSlider classe est semblable à la normale Xamarin.Forms Slider mais permet de spécifier un nombre d’étapes distinctes entre le Minimum et Maximum valeurs. Les convertisseurs de trois sont : iOS : StepSliderRenderer Android : StepSliderRenderer UWP : StepSliderRenderer 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. Le StepSliderDemo exemple illustre ce nouveau curseur.
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 .
Le système de coordonnées géographique Un système de coordonnées géographiques identifie les positions sur un objet sphérique (ou presque sphérique), comme la terre. Une coordonnée comprend à la fois un latitude et longitude exprimée en angles. Un plus grand cercle appelé le s’étend sur le plan conceptuel.
equator
se trouve à mi-chemin entre deux pôles par le biais duquel l’axe de la terre
Parallels et latitude Angle mesuré à l’Équateur à partir du centre des marques de terre Nord ou lignes de latitude égale appelé parallels. Ces comprises entre 0 degrés à l’Équateur et 90 degrés dans le nord et sud du centre pôles. Par convention, les latitudes au nord de l’Équateur sont des valeurs positives et celles au sud de l’Équateur sont des valeurs négatives. Longitude et méridiens Moitiés de cercles great depuis le pôle nord au Pôle Sud sont des lignes de longitude égale, également appelés méridiens. Il s’agit par rapport à du premier méridien de Greenwich en Angleterre. Par convention, longitudes à l’est des valeurs positives de 0 degrés et 180 degrés et longitudes à l’ouest du premier méridien sont des valeurs négatives comprises entre 0 degré à –180 degrés. La projection équirectangulaire Tout mappage plat de la terre introduit des distorsions. Si toutes les lignes de latitude et longitude sont droits, et si égales différences dans les angles de latitude et longitude correspondent aux distances égales sur la carte, le résultat est un projection équirectangulaire. Ce mappage déforme plus près des zones et les pôles, car ils sont étirées horizontalement. La projection Mercator La célèbre projection Mercator tente de compenser l’étirement horizontal en l’étirant également ces zones de verticalement. Cela entraîne une carte où les zones proches pôles apparaissent bien plus important qu’elles sont réellement, mais n’importe quel réseau local conforme très près à la zone réelle. Services de mappage et des vignettes Services de carte utilisent une variation de la projection Mercator appelée Web Mercator . Les services de mappage remettre les vignettes de bitmap à un client basé sur l’emplacement et niveau de zoom.
Obtention de l’emplacement de l’utilisateur
Xamarin.Forms Map classes n’incluent pas une fonctionnalité pour obtenir l’emplacement géographique de l’utilisateur, mais il est souvent souhaitable lors de l’utilisation de cartes, par conséquent, un service de dépendance doit la gérer. NOTE Les applications Xamarin.Forms peuvent utiliser à la place la
Geolocation
classe inclus dans Xamarin.Essentials.
L’API de traceur emplacement Le Xamarin.FormsBook.Platform solution contient le code pour une API de traceur emplacement. Le GeographicLocation structure encapsule une latitude et une longitude. Le ILocationTracker interface définit deux méthodes pour démarrer et interrompre le dispositif de suivi d’emplacement et un événement lorsqu’un nouvel emplacement est disponible. Le Gestionnaire d’emplacement iOS
L’implémentation d’iOS de CLLocationManager .
ILocationTracker
est un
LocationTracker
classe rend utiliser d’iOS
Le Gestionnaire d’emplacement Android
L’implémentation Android de LocationManager classe.
ILocationTracker
est un
LocationTracker
classe qui utilise le Android
Le localisateur de géo UWP
L’implémentation de la plateforme Windows universelle de utilise la plateforme Windows universelle Geolocator .
ILocationTracker
est un
LocationTracker
classe qui
Afficher l’emplacement du téléphone Le WhereAmI exemple utilise le dispositif de suivi d’emplacement pour afficher l’emplacement du téléphone, à la fois dans le texte et sur une carte équirectangulaire. La surcharge de requis Une certaine surcharge est requise pour WhereAmI à utiliser le dispositif de suivi d’emplacement. Tout d’abord, tous les projets dans le WhereAmI solution doit disposer de références aux projets correspondants dans Xamarin.FormsBook.Platformet chaque WhereAmI projet doit appeler le Toolkit.Init (méthode). Une surcharge supplémentaire spécifique à la plateforme, sous la forme d’autorisations de localisation, est requise. Autorisation d’emplacement pour iOS
Pour iOS, le info.plist fichier doit inclure les éléments contenant le texte d’une question demandant à l’utilisateur pour permettre l’obtention de l’emplacement de l’utilisateur. Autorisations de localisation pour Android
Les applications Android qui obtiennent l’emplacement de l’utilisateur doivent avoir une autorisation ACCESS_FILE_LOCATION dans le fichier AndroidManifest.xml. Autorisations de localisation pour la plateforme Windows universelle
Une application de plateforme Windows universelle doit avoir un dans le fichier Package.appxmanifest.
location
fonctionnalité de l’appareil est marqué
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.Forms.Forms.Init .
Xamarin.FormsMaps.Init
méthode après avoir effectué un appel à
L’activation des services de mappage Étant donné que le Map peut obtenir l’emplacement de l’utilisateur, l’application doit obtenir l’autorisation nécessaire pour l’utilisateur de la manière décrite plus haut dans ce chapitre : L’activation d’iOS mappe
Une application iOS à l’aide
Map
a besoin de deux lignes dans le fichier info.plist.
L’activation d’Android mappe
Une clé d’autorisation est nécessaire pour l’utilisation des services de mappage de Google. Cette clé est insérée dans le AndroidManifest.xml fichier. En outre, le AndroidManifest.xml fichier nécessite manifest balises nécessaires pour obtenir l’emplacement de l’utilisateur. L’activation UWP mappe
Une application de plateforme Windows universelle nécessite une clé d’autorisation pour l’utilisation de Bing Maps. Cette clé est passée en tant qu’argument à la Xamarin.FormsMaps.Init (méthode). L’application doit également être activée pour les services d’emplacement. La carte non Le MapDemos exemple se compose d’un MapsDemoHomePage.xaml fichier et MapsDemoHomePage.xaml.cs fichier de code-behind Permet d’accéder à différents programmes de démonstration. Le BasicMapPage.xaml fichier montre comment afficher le mappage peut être manipulé par l’utilisateur.
Map
vue. Par défaut, il affiche la ville de Rome, mais le
Pour désactiver le défilement horizontal et vertical, définissez la HasScrollEnabled propriété false . Pour désactiver le zoom, définissez HasZoomEnabled à false . Ces propriétés peut ne pas fonctionnent sur toutes les plateformes. Rues et le Terrain Vous pouvez afficher différents types de cartes en définissant le énumération avec trois membres : Street
Map
propriété
MapType
de type
MapType
, une
, la valeur par défaut
Satellite Hybrid
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 Center
est de type
de type
MapSpan
, une classe avec quatre propriétés en lecture seule :
Position
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 LatitudeDegrees
Position Position
et Distance sont les deux structures. constructeur:
Position
définit deux propriétés en lecture seule définies via la
Latitude Longitude
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 Distance
La valeur est disponible à partir de trois propriétés : de type double Kilometers de type double Miles de type double Meters
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 : constructeur avec un Position et l’intervalle de latitude et longitude MapSpan.FromCenterAndRadius avec un Position et radius MapSpan
Il est également possible de créer un nouveau WithZoom .
MapSpan
à partir d’un à l’aide de méthodes
ClampLatitude
ou
Le WyomingPage.xaml fichier et WyomingPage.xaml.cs fichier code-behind montre comment utiliser le MoveToRegion méthode pour afficher l’état du Wyoming. 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 LongitudeZoomPage.xaml fichier et LongitudeZoomPage.xaml.cs fichier code-behind afficher une autre approche qui fonctionne mieux sur Android, mais aucune de ces approches fonctionne correctement sur le Windows plateformes.
L’emplacement du téléphone Le IsShowingUser propriété du Map fonctionne un peu différemment sur chaque plateforme en tant que le ShowLocationPage.xaml fichier montre : Sur iOS, un point bleu indique l’emplacement du téléphone, mais vous devez accéder manuellement Sur Android, une icône s’affiche que quand vous appuyez déplace le mappage à l’emplacement du téléphone La plateforme Windows universelle est similaire à iOS, mais parfois automatiquement accède à l’emplacement Le MapDemos projet tente de reproduire l’approche Android en premier définissant un bouton basé sur l’icône en fonction de la MyLocationButton.xaml fichier et MyLocationButton.xaml.cs fichier code-behind. Le GoToLocationPage.xaml fichier et GoToLocationPage.xaml.cs fichier code-behind Utilisez ce bouton pour accéder à l’emplacement du téléphone. Musées de science et codes confidentiels Enfin, le Map classe définit un Pins propriété de type
IList
. Le
Pin
classe définit quatre propriétés :
de type string , une propriété obligatoire Address de type string , une adresse explicite facultative Position de type Position , indiquant où le code confidentiel est affiché sur la carte Type de type PinType , une énumération, qui n’est pas utilisée Label
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 emplacements géographiques.
DistanceTo
méthode avec un calcul simplifié de la distance entre deux
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. Le GeocoderRoundTrip.xaml fichier et GeocoderRoundTrip.xaml.cs fichier code-behind illustrent cette fonctionnalité.
Liens connexes Chapitre 28 de texte intégral (PDF ) Exemples de chapitre 28 Mappage de Xamarin.Forms