Jak przełączać się między stronami w Xamarin Forms?
Moja strona główna to ContentPage i nie chcę przełączać się na coś w rodzaju strony z kartami.
Udało mi się to zrobić pseudo, znajdując elementy nadrzędne kontrolek, które powinny uruchamiać nową stronę, dopóki nie znajdę ContentPage, a następnie zamieniam zawartość z kontrolkami na nową stronę. Ale to wydaje się naprawdę niechlujne.
xamarin
xamarin.forms
Eric
źródło
źródło
Odpowiedzi:
Xamarin.Forms
obsługuje wiele wbudowanych hostów nawigacji:NavigationPage
, gdzie wsuwa się następna strona,TabbedPage
, ten, którego nie lubiszCarouselPage
, która umożliwia przełączanie lewej i prawej strony na następną / poprzednią stronę.Co więcej, wszystkie strony obsługują również,
PushModalAsync()
które po prostu przesuwają nową stronę na istniejącą.Na sam koniec, jeśli chcesz mieć pewność, że użytkownik nie może wrócić do poprzedniej strony (za pomocą gestu lub przycisku sprzętowego Wstecz), możesz zachować to samo
Page
wyświetlane i zastąpić jegoContent
.Sugerowane opcje zamiany strony głównej również działają, ale będziesz musiał traktować to inaczej dla każdej platformy.
źródło
W klasie App możesz ustawić MainPage na stronę nawigacyjną i ustawić stronę główną na swoją ContentPage:
Następnie w pierwszym wywołaniu ContentPage:
źródło
Android.Content.Res
do nawigacji. To nie wydaje się być właściwe, skąd mam to zaimportować?Jeśli twój projekt został skonfigurowany jako projekt formularzy PCL (i najprawdopodobniej również jako formularze udostępnione, ale nie próbowałem tego), istnieje klasa App.cs, która wygląda następująco:
możesz zmodyfikować
GetMainPage
metodę, aby zwrócić nową TabbedPaged lub inną stronę, którą zdefiniowałeś w projekcieOd tego momentu możesz dodawać polecenia lub programy obsługi zdarzeń, aby wykonywać kod i robić
źródło
Navigation
w tym przykładzie? - Czy to obiekt, który gdzieś stworzyłeś? - Nie widzę tego w tym przykładzie kodu.PushAsync()
nie działał dla mnie, podczas gdyPushModalAsync()
takWsuń nową stronę na stos, a następnie usuń bieżącą stronę. Powoduje to zmianę.
Najpierw musisz być na stronie nawigacji:
Przełączanie treści nie jest idealne, ponieważ masz tylko jedną dużą stronę i jeden zestaw zdarzeń na stronie, takich jak OnAppearing ect.
źródło
Navigation.RemovePage();
nie jest obsługiwany w systemie Android.await Navigation.PushAsync(new SecondPage(),false);
Jeśli nie chcesz przechodzić do poprzedniej strony, tj. Nie pozwól użytkownikowi powrócić do ekranu logowania po zakończeniu autoryzacji, możesz użyć;
Jeśli chcesz włączyć funkcję wsteczną, po prostu użyj
źródło
Wygląda na to, że ten wątek jest bardzo popularny i będzie smutno nie wspomnieć, że istnieje alternatywny sposób -
ViewModel First Navigation
. Większość frameworków MVVM, które go używają, jednak jeśli chcesz zrozumieć, o co chodzi, kontynuuj czytanie.Cała oficjalna dokumentacja platformy Xamarin.Forms przedstawia proste, ale nieco inne niż MVVM czyste rozwiązanie. Dzieje się tak dlatego, że
Page
(Widok) nie powinien nic wiedzieć o tymViewModel
i odwrotnie. Oto świetny przykład tego naruszenia:Jeśli masz dwustronicową aplikację, to podejście może być dla Ciebie dobre. Jeśli jednak pracujesz nad rozwiązaniem dla dużego przedsiębiorstwa, lepiej wybierz
ViewModel First Navigation
podejście. Jest to nieco bardziej skomplikowane, ale znacznie czystsze podejście, które umożliwia nawigację między (ViewModels
zamiast nawigacji) międzyPages
(Widokami). Jedną z zalet oprócz wyraźnego oddzielenia obaw jest to, że można łatwo przekazywać parametry do kolejnychViewModel
lub wykonać kod inicjujący asynchroniczny zaraz po nawigacji. Teraz do szczegółów.(Postaram się maksymalnie uprościć wszystkie przykłady kodu).
1. Przede wszystkim potrzebujemy miejsca, w którym moglibyśmy zarejestrować wszystkie nasze obiekty i opcjonalnie zdefiniować ich żywotność. W tym przypadku możemy użyć kontenera IOC, możesz sam wybrać. W tym przykładzie użyję Autofaca (jest to jeden z najszybszych dostępnych). Możemy zachować odniesienie do tego w sekcji,
App
aby było dostępne globalnie (niezbyt dobry pomysł, ale potrzebny do uproszczenia):2. Będziemy potrzebować obiektu odpowiedzialnego za pobranie
Page
(View) dla konkretnegoViewModel
i odwrotnie. Drugi przypadek może być przydatny w przypadku ustawienia strony głównej / głównej aplikacji. W tym celu powinniśmy zgodzić się na prostą konwencję, że wszystkoViewModels
powinno znajdować się wViewModels
katalogu, aPages
(widoki) wViews
katalogu. Innymi słowy,ViewModels
powinien żyć w[MyApp].ViewModels
przestrzeni nazw iPages
(Widoki) w[MyApp].Views
przestrzeni nazw. Oprócz tego powinniśmy się zgodzić, żeWelcomeView
(Strona) powinna mieć aWelcomeViewModel
i itp. Oto przykład kodu mappera:W przypadku ustawienia strony głównej będziemy potrzebować czegoś takiego
ViewModelLocator
, co ustawiBindingContext
automatycznie:W końcu będziemy potrzebować podejścia,
NavigationService
które będzie wspieraćViewModel First Navigation
:Jak widać, istnieje
BaseViewModel
- abstrakcyjna klasa bazowa dla wszystkich, wViewModels
których można zdefiniować metody, takie jakInitializeAsync
ta, zostaną wykonane zaraz po nawigacji. A oto przykład nawigacji:Jak rozumiesz, to podejście jest bardziej skomplikowane, trudniejsze do debugowania i może być mylące. Jednak jest wiele zalet, a w rzeczywistości nie musisz wdrażać go samodzielnie, ponieważ większość frameworków MVVM obsługuje go po wyjęciu z pudełka. Przykładowy kod pokazany tutaj jest dostępny na github .
Istnieje wiele dobrych artykułów na temat
ViewModel First Navigation
podejścia, a także bezpłatny eBook wzorców aplikacji korporacyjnych wykorzystujący Xamarin.Forms, który szczegółowo wyjaśnia ten i wiele innych interesujących tematów.źródło
Za pomocą metody PushAsync () można wypychać i PopModalAsync () przesuwać strony do i ze stosu nawigacji. W moim przykładzie kodu poniżej mam stronę nawigacji (strona główna) i z tej strony wrzucam stronę z treścią, która jest stroną logowania, po ukończeniu strony logowania wskakuję z powrotem na stronę główną
~~~ Nawigacja może być traktowana jako ostatni na wejściu, pierwszy na stosie obiektów Page. Aby przejść z jednej strony do drugiej, aplikacja umieści nową stronę na tym stosie. Aby powrócić do poprzedniej strony, aplikacja zdejmie bieżącą stronę ze stosu. Ta nawigacja w Xamarin.Forms jest obsługiwana przez interfejs INavigation
Xamarin.Forms ma klasę NavigationPage, która implementuje ten interfejs i będzie zarządzać stosem Pages. Klasa NavigationPage doda również pasek nawigacyjny u góry ekranu, który wyświetla tytuł, a także będzie miał odpowiedni dla platformy przycisk Wstecz, który spowoduje powrót do poprzedniej strony. Poniższy kod pokazuje, jak zawijać NavigationPage wokół pierwszej strony w aplikacji:
Odniesienie do zawartości wymienionej powyżej i łącze, które należy przejrzeć, aby uzyskać więcej informacji na temat formularzy Xamarin, zobacz sekcję nawigacji:
http://developer.xamarin.com/guides/cross-platform/xamarin-forms/introduction-to-xamarin-forms/
~~~
// Usunięto kod dla uproszczenia, wyświetlany jest tylko pop
źródło
Jedna strona do innej nawigacji strony w Xamarin.forms przy użyciu właściwości Navigation Poniżej przykładowego kodu
Aby przejść z jednej strony do innej strony z widoczną komórką Poniżej kodu Xamrian.forms
Przykład jak poniżej
źródło
Połączenie:
Utwórz tę metodę wewnątrz App.xaml.cs:
źródło
Jeśli chcesz przejść z YourPage do następnej strony, wykonaj następujące czynności:
Możesz przeczytać więcej o nawigacji w Xamarin Forms tutaj: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/hierarchical
Microsoft ma na ten temat całkiem niezłą dokumentację.
Istnieje również nowsza koncepcja
Shell
. Pozwala na nowy sposób strukturyzacji aplikacji i w niektórych przypadkach upraszcza nawigację.Wprowadzenie: https://devblogs.microsoft.com/xamarin/shell-xamarin-forms-4-0-getting-started/
Film o podstawach Shell: https://www.youtube.com/watch?v=0y1bUAcOjZY&t=3112s
Dokumenty: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/
źródło
Strona XAML dodaj to
na stronie CS
źródło
Po
PushAsync
użyciuPopAsync
(zthis
), aby usunąć bieżącą stronę.źródło
W Xamarinie mamy stronę o nazwie NavigationPage. Zawiera stos ContentPages. NavigationPage ma metodę taką jak PushAsync () i PopAsync (). PushAsync dodaje stronę na górze stosu, w tym czasie ta strona stanie się aktualnie aktywną stroną. Metoda PopAsync () usuwa stronę z góry stosu.
W App.Xaml.Cs możemy ustawić np.
MainPage = new NavigationPage (new YourPage ());
await Navigation.PushAsync (new newPage ()); ta metoda doda newPage na szczycie stosu. W tym momencie nePage będzie aktualnie aktywną stroną.
źródło