Comment basculer entre les pages dans Xamarin Forms?
Ma page principale est une ContentPage et je ne veux pas passer à quelque chose comme une page à onglets.
J'ai pu le pseudo-faire en trouvant les parents des contrôles qui devraient déclencher la nouvelle page jusqu'à ce que je trouve le ContentPage, puis j'échange le contenu avec des contrôles pour une nouvelle page. Mais cela semble vraiment bâclé.
Réponses:
Xamarin.Forms
prend en charge plusieurs hôtes de navigation intégrés:NavigationPage
, où la page suivante glisse,TabbedPage
, celui que tu n'aimes pasCarouselPage
, qui permet de basculer de gauche à droite sur les pages suivantes / précédentes.En plus de cela, toutes les pages prennent également en charge
PushModalAsync()
qui ne font que pousser une nouvelle page au-dessus de celle existante.À la toute fin, si vous voulez vous assurer que l'utilisateur ne peut pas revenir à la page précédente (en utilisant un geste ou le bouton matériel retour), vous pouvez garder le même
Page
affiché et le remplacerContent
.Les options suggérées pour remplacer la page racine fonctionnent également, mais vous devrez gérer cela différemment pour chaque plate-forme.
la source
Dans la classe App, vous pouvez définir MainPage sur une page de navigation et définir la page racine sur votre ContentPage:
Ensuite, lors de votre premier appel ContentPage:
la source
Android.Content.Res
pour la navigation. Cela ne semble pas correct, d'où dois-je l'importer?Si votre projet a été configuré en tant que projet de formulaires PCL (et très probablement également en tant que formulaires partagés, mais je n'ai pas essayé cela), il existe une classe App.cs qui ressemble à ceci:
vous pouvez modifier la
GetMainPage
méthode pour renvoyer un nouveau TabbedPaged ou une autre page que vous avez définie dans le projetÀ partir de là, vous pouvez ajouter des commandes ou des gestionnaires d'événements pour exécuter du code et faire
la source
Navigation
cet exemple? - C'est un objet que vous avez créé quelque part? - Je ne le vois pas dans cet exemple de code.PushAsync()
n'a pas fonctionné pour moi, alors qu'il l'aPushModalAsync()
faitPoussez une nouvelle page sur la pile, puis supprimez la page actuelle. Cela entraîne un changement.
Vous devez d'abord être dans une page de navigation:
Changer de contenu n'est pas idéal car vous n'avez qu'une seule grande page et un ensemble d'événements de page comme OnAppearing ect.
la source
Navigation.RemovePage();
n'est pas pris en charge sur Android.await Navigation.PushAsync(new SecondPage(),false);
Si vous ne souhaitez pas aller à la page précédente, c'est-à-dire ne pas laisser l'utilisateur revenir à l'écran de connexion une fois l'autorisation effectuée, vous pouvez utiliser;
Si vous souhaitez activer la fonctionnalité de retour, utilisez simplement
la source
On dirait que ce fil est très populaire et il sera triste de ne pas mentionner ici qu'il existe un moyen alternatif -
ViewModel First Navigation
. La plupart des frameworks MVVM qui l'utilisent, mais si vous voulez comprendre de quoi il s'agit, continuez à lire.Toute la documentation officielle de Xamarin.Forms montre une solution simple, mais légèrement pas pure MVVM. C'est parce que la
Page
(Vue) ne doit rien savoir sur leViewModel
et vice versa. Voici un excellent exemple de cette violation:Si vous avez une application de 2 pages, cette approche pourrait être bonne pour vous. Cependant, si vous travaillez sur une solution de grande entreprise, vous feriez mieux d'adopter une
ViewModel First Navigation
approche. C'est une approche légèrement plus compliquée mais beaucoup plus propre qui vous permet de naviguerViewModels
entrePages
(Vues) au lieu de naviguer entre (Vues). L'un des avantages à côté de la séparation claire des préoccupations est que vous pouvez facilement passer des paramètres au suivant.ViewModel
ou exécuter un code d'initialisation asynchrone juste après la navigation. Passons maintenant aux détails.(Je vais essayer de simplifier au maximum tous les exemples de code).
1. Tout d'abord, nous avons besoin d'un endroit où nous pourrions enregistrer tous nos objets et définir éventuellement leur durée de vie. Pour cela, nous pouvons utiliser un conteneur IOC, vous pouvez en choisir un vous-même. Dans cet exemple, j'utiliserai Autofac (c'est l'un des plus rapides disponibles). Nous pouvons en garder une référence dans le
App
afin qu'il soit disponible dans le monde entier (ce n'est pas une bonne idée, mais nécessaire pour simplifier):Nous aurons besoin d'un objet chargé de récupérer une
Page
(Vue) pour un objet spécifiqueViewModel
et vice versa. Le deuxième cas peut être utile en cas de configuration de la page racine / principale de l'application. Pour cela, nous devrions nous mettre d'accord sur une convention simple selon laquelle tous lesViewModels
devraient être dans leViewModels
répertoire etPages
(Views) devraient être dans leViews
répertoire. En d'autres termes,ViewModels
devrait vivre dans l'[MyApp].ViewModels
espace de noms etPages
(Vues) dans l'[MyApp].Views
espace de noms. En plus de cela, nous devrions convenir queWelcomeView
(Page) devrait avoir unWelcomeViewModel
et etc. Voici un exemple de code d'un mappeur:Dans le cas de la configuration d'une page racine, nous aurons besoin d'une sorte de
ViewModelLocator
paramètre qui définiraBindingContext
automatiquement:4.Enfin, nous aurons besoin d'une approche
NavigationService
qui soutiendraViewModel First Navigation
:Comme vous pouvez le voir, il existe une
BaseViewModel
classe de base abstraite pour tous lesViewModels
domaines dans lesquels vous pouvez définir des méthodes commeInitializeAsync
celle-ci qui seront exécutées juste après la navigation. Et voici un exemple de navigation:Comme vous le comprenez, cette approche est plus compliquée, plus difficile à déboguer et peut prêter à confusion. Cependant, il existe de nombreux avantages et vous n'avez pas à l'implémenter vous-même puisque la plupart des frameworks MVVM le prennent en charge dès la sortie de la boîte. L'exemple de code présenté ici est disponible sur github .
Il y a beaucoup de bons articles sur l'
ViewModel First Navigation
approche et il existe un eBook gratuit pour les applications d'entreprise utilisant Xamarin.Forms eBook qui explique cela et de nombreux autres sujets intéressants en détail.la source
En utilisant la méthode PushAsync (), vous pouvez pousser et PopModalAsync () vous pouvez afficher des pages vers et depuis la pile de navigation. Dans mon exemple de code ci-dessous, j'ai une page de navigation (page racine) et à partir de cette page, je pousse une page de contenu qui est une page de connexion une fois que je suis complet avec ma page de connexion, je reviens à la page racine
~~~ La navigation peut être considérée comme une pile d'objets de page dernier entré, premier sorti. Pour passer d'une page à une autre, une application poussera une nouvelle page sur cette pile. Pour revenir à la page précédente, l'application fera apparaître la page actuelle de la pile. Cette navigation dans Xamarin.Forms est gérée par l'interface INavigation
Xamarin.Forms possède une classe NavigationPage qui implémente cette interface et gérera la pile de Pages. La classe NavigationPage ajoutera également une barre de navigation en haut de l'écran qui affiche un titre et aura également un bouton Retour approprié à la plate-forme qui reviendra à la page précédente. Le code suivant montre comment encapsuler une NavigationPage autour de la première page d'une application:
Référence au contenu répertorié ci-dessus et un lien que vous devez consulter pour plus d'informations sur Xamarin Forms, consultez la section Navigation:
http://developer.xamarin.com/guides/cross-platform/xamarin-forms/introduction-to-xamarin-forms/
~~~
// Suppression du code pour plus de simplicité, seul le pop est affiché
la source
Navigation d'une page à une autre dans Xamarin.forms à l'aide de la propriété Navigation sous l'exemple de code
Pour naviguer d'une page vers une autre page avec la cellule de vue Ci-dessous le code Xamrian.forms
Exemple comme ci-dessous
la source
Appel:
Créez cette méthode dans App.xaml.cs:
la source
Lorsque vous souhaitez naviguer de YourPage à la page suivante, vous faites:
Vous pouvez en savoir plus sur la navigation Xamarin Forms ici: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/hierarchical
Microsoft a d'assez bons documents à ce sujet.
Il y a aussi le nouveau concept du
Shell
. Il permet une nouvelle façon de structurer votre application et simplifie la navigation dans certains cas.Intro: https://devblogs.microsoft.com/xamarin/shell-xamarin-forms-4-0-getting-started/
Vidéo sur les bases de Shell: https://www.youtube.com/watch?v=0y1bUAcOjZY&t=3112s
Docs: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/
la source
Page XAML ajouter ceci
sur la page CS
la source
Après
PushAsync
utilisationPopAsync
(avecthis
) pour supprimer la page actuelle.la source
Dans Xamarin, nous avons une page appelée NavigationPage. Il contient une pile de ContentPages. NavigationPage a une méthode comme PushAsync () et PopAsync (). PushAsync ajoute une page en haut de la pile, à ce moment-là, cette page deviendra la page actuellement active. La méthode PopAsync () supprime la page du haut de la pile.
Dans App.Xaml.Cs, nous pouvons définir comme.
MainPage = new NavigationPage (new YourPage ());
attendre Navigation.PushAsync (new newPage ()); cette méthode ajoutera newPage en haut de la pile. À ce moment, nePage sera la page actuellement active.
la source