Wie wechseln Sie zwischen Seiten in Xamarin Forms?
Meine Hauptseite ist eine ContentPage und ich möchte nicht zu einer Seite mit Registerkarten wechseln.
Ich konnte dies pseudo-tun, indem ich Eltern der Steuerelemente fand, die die neue Seite auslösen sollten, bis ich die ContentPage gefunden hatte, und dann den Inhalt mit Steuerelementen gegen eine neue Seite austauschte. Aber das scheint wirklich schlampig.
xamarin
xamarin.forms
Eric
quelle
quelle
Antworten:
Xamarin.Forms
unterstützt mehrere integrierte Navigationshosts:NavigationPage
, wo die nächste Seite hineingleitet,TabbedPage
, die du nicht magstCarouselPage
Dies ermöglicht das Umschalten von links und rechts auf die nächsten / vorherigen Seiten.Darüber hinaus unterstützen alle Seiten auch
PushModalAsync()
das Verschieben einer neuen Seite über die vorhandene.Wenn Sie ganz am Ende sicherstellen möchten, dass der Benutzer nicht zur vorherigen Seite zurückkehren kann (mithilfe einer Geste oder der Zurück-Hardware-Schaltfläche), können Sie diese weiterhin
Page
anzeigen und ersetzenContent
.Die vorgeschlagenen Optionen zum Ersetzen der Stammseite funktionieren ebenfalls, aber Sie müssen dies für jede Plattform unterschiedlich behandeln.
quelle
In der App-Klasse können Sie die Hauptseite auf eine Navigationsseite und die Stammseite auf Ihre ContentPage festlegen:
Dann in Ihrem ersten ContentPage-Aufruf:
quelle
Android.Content.Res
für die Navigation vor. Das scheint nicht richtig zu sein, woher muss ich es importieren?Wenn Ihr Projekt als PCL-Formularprojekt eingerichtet wurde (und sehr wahrscheinlich auch als freigegebene Formulare, aber das habe ich noch nicht ausprobiert), gibt es eine Klasse App.cs, die folgendermaßen aussieht:
Sie können die
GetMainPage
Methode ändern , um eine neue TabbedPaged oder eine andere Seite zurückzugeben, die Sie im Projekt definiert habenVon dort aus können Sie Befehle oder Ereignishandler hinzufügen, um Code auszuführen und auszuführen
quelle
Navigation
in diesem Beispiel? - Ist das ein Objekt, das Sie irgendwo erstellt haben? - Ich sehe es nicht in diesem Codebeispiel.PushAsync()
hat für mich keine Arbeit, währendPushModalAsync()
tatSchieben Sie eine neue Seite auf den Stapel und entfernen Sie die aktuelle Seite. Dies führt zu einem Wechsel.
Sie müssen sich zuerst auf einer Navigationsseite befinden:
Das Wechseln von Inhalten ist nicht ideal, da Sie nur eine große Seite und eine Reihe von Seitenereignissen wie OnAppearing ect haben.
quelle
Navigation.RemovePage();
wird unter Android nicht unterstützt.await Navigation.PushAsync(new SecondPage(),false);
Wenn Sie nicht zur vorherigen Seite wechseln möchten, dh den Benutzer nach Abschluss der Autorisierung nicht zum Anmeldebildschirm zurückkehren lassen möchten, können Sie Folgendes verwenden:
Wenn Sie die Back-Funktionalität aktivieren möchten, verwenden Sie einfach
quelle
Dieser Thread scheint sehr beliebt zu sein und es wird traurig sein, hier nicht zu erwähnen, dass es einen alternativen Weg gibt -
ViewModel First Navigation
. Die meisten MVVM-Frameworks verwenden es. Wenn Sie jedoch verstehen möchten, worum es geht, lesen Sie weiter.Die gesamte offizielle Xamarin.Forms-Dokumentation zeigt eine einfache, aber etwas nicht MVVM-reine Lösung. Das liegt daran, dass die
Page
(Ansicht) nichts über die wissen sollteViewModel
und umgekehrt. Hier ist ein gutes Beispiel für diesen Verstoß:Wenn Sie eine 2-seitige Anwendung haben, ist dieser Ansatz möglicherweise gut für Sie. Wenn Sie jedoch an einer Lösung für große Unternehmen arbeiten, sollten Sie einen
ViewModel First Navigation
Ansatz wählen. Es ist ein etwas komplizierterer, aber viel saubererer Ansatz, mit dem SieViewModels
zwischenPages
(Ansichten) navigieren können . Einer der Vorteile neben der klaren Trennung von Bedenken besteht darin, dass Sie problemlos Parameter an den nächsten übergebenViewModel
oder direkt nach der Navigation einen asynchronen Initialisierungscode ausführen können. Nun zu den Details.(Ich werde versuchen, alle Codebeispiele so weit wie möglich zu vereinfachen).
1. Zunächst benötigen wir einen Ort, an dem wir alle unsere Objekte registrieren und optional ihre Lebensdauer definieren können. Für diese Angelegenheit können wir einen IOC-Container verwenden, Sie können selbst einen auswählen. In diesem Beispiel verwende ich Autofac (es ist eines der schnellsten verfügbaren). Wir können einen Verweis darauf behalten,
App
damit er global verfügbar ist (keine gute Idee, aber zur Vereinfachung erforderlich):2.Wir benötigen ein Objekt, das für das Abrufen einer
Page
(Ansicht) für ein bestimmtes Objekt verantwortlich ist,ViewModel
und umgekehrt. Der zweite Fall kann hilfreich sein, wenn Sie die Stamm- / Hauptseite der App festlegen. Dafür sollten wir uns auf eine einfache Konvention einigen, dass sich alleViewModels
imViewModels
Verzeichnis undPages
(Ansichten) imViews
Verzeichnis befinden sollten. Mit anderen Worten,ViewModels
sollte im[MyApp].ViewModels
Namespace undPages
(Ansichten) im[MyApp].Views
Namespace leben. Darüber hinaus sollten wir uns einig sein, dassWelcomeView
(Seite) einWelcomeViewModel
und usw. haben sollte . Hier ist ein Codebeispiel für einen Mapper:3.Für den Fall des Einstellens einer Stammseite benötigen wir eine Art
ViewModelLocator
, dieBindingContext
automatisch Folgendes festlegt :4. Schließlich werden wir einen Ansatz brauchen
NavigationService
, der denViewModel First Navigation
Ansatz unterstützt:Wie Sie vielleicht sehen, gibt es eine
BaseViewModel
abstrakte Basisklasse für alle, inViewModels
denen SieInitializeAsync
solche Methoden definieren können , die direkt nach der Navigation ausgeführt werden. Und hier ist ein Beispiel für die Navigation:Wie Sie verstehen, ist dieser Ansatz komplizierter, schwieriger zu debuggen und möglicherweise verwirrend. Es gibt jedoch viele Vorteile und Sie müssen es nicht selbst implementieren, da die meisten MVVM-Frameworks es sofort unterstützen. Das hier gezeigte Codebeispiel ist auf github verfügbar .
Es gibt viele gute Artikel zum Thema
ViewModel First Navigation
Ansatz und es gibt ein kostenloses Enterprise Application Patterns mit Xamarin.Forms eBook, in dem dieses und viele andere interessante Themen ausführlich erläutert werden.quelle
Mit der PushAsync () -Methode können Sie Push und PopModalAsync () können Sie Seiten zum und vom Navigationsstapel platzieren. In meinem Codebeispiel unten habe ich eine Navigationsseite (Stammseite) und von dieser Seite aus schiebe ich eine Inhaltsseite, die eine Anmeldeseite ist. Sobald ich mit meiner Anmeldeseite fertig bin, kehre ich zur Stammseite zurück
~~~ Die Navigation kann als letzter Stapel von Seitenobjekten betrachtet werden. Um von einer Seite zur nächsten zu wechseln, schiebt eine Anwendung eine neue Seite auf diesen Stapel. Um zur vorherigen Seite zurückzukehren, fügt die Anwendung die aktuelle Seite vom Stapel ab. Diese Navigation in Xamarin.Forms wird von der INavigation-Oberfläche ausgeführt
Xamarin.Forms verfügt über eine NavigationPage-Klasse, die diese Schnittstelle implementiert und den Seitenstapel verwaltet. Die NavigationPage-Klasse fügt außerdem eine Navigationsleiste am oberen Bildschirmrand hinzu, in der ein Titel angezeigt wird, und verfügt über eine plattformgerechte Schaltfläche "Zurück", die zur vorherigen Seite zurückkehrt. Der folgende Code zeigt, wie eine Navigationsseite um die erste Seite einer Anwendung gewickelt wird:
Weitere Informationen zu Xamarin Forms finden Sie im Abschnitt Navigation: Ein Verweis auf den oben aufgeführten Inhalt und ein Link, den Sie überprüfen sollten:
http://developer.xamarin.com/guides/cross-platform/xamarin-forms/introduction-to-xamarin-forms/
~~~
// Code der Einfachheit halber entfernt, nur der Pop wird angezeigt
quelle
Navigation von einer Seite zur anderen Seite in Xamarin.forms mithilfe der Navigationseigenschaft Unter dem Beispielcode
So navigieren Sie von einer Seite zu einer anderen Seite mit der Ansichtszelle unter dem Code Xamrian.forms
Beispiel wie unten
quelle
Anruf:
Erstellen Sie diese Methode in App.xaml.cs:
quelle
Wenn Sie von YourPage zur nächsten Seite navigieren möchten, tun Sie Folgendes:
Weitere Informationen zur Navigation mit Xamarin Forms finden Sie hier: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/hierarchical
Microsoft hat ziemlich gute Dokumente dazu.
Es gibt auch das neuere Konzept der
Shell
. Es ermöglicht eine neue Art der Strukturierung Ihrer Anwendung und vereinfacht in einigen Fällen die Navigation.Intro: https://devblogs.microsoft.com/xamarin/shell-xamarin-forms-4-0-getting-started/
Video zu den Grundlagen von Shell: https://www.youtube.com/watch?v=0y1bUAcOjZY&t=3112s
Dokumente: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/
quelle
XAML-Seite fügen Sie dies hinzu
auf der CS-Seite
quelle
Nach
PushAsync
VerwendungPopAsync
(mitthis
) zum Entfernen der aktuellen Seite.quelle
In Xamarin haben wir eine Seite namens NavigationPage. Es enthält einen Stapel von ContentPages. NavigationPage verfügt über Methoden wie PushAsync () und PopAsync (). PushAsync fügt eine Seite oben im Stapel hinzu. Zu diesem Zeitpunkt wird diese Seitenseite zur aktuell aktiven Seite. Die PopAsync () -Methode entfernt die Seite vom oberen Rand des Stapels.
In App.Xaml.Cs können wir wie einstellen.
MainPage = neue Navigationsseite (neue YourPage ());
warte auf Navigation.PushAsync (new newPage ()); Diese Methode fügt newPage oben im Stapel hinzu. Zu diesem Zeitpunkt ist nePage derzeit aktiv.
quelle