Podsumowanie rozdziału 24. Nawigowanie między stronami
Uwaga
Ta książka została opublikowana wiosną 2016 roku i od tego czasu nie została zaktualizowana. Jest wiele w książce, która pozostaje cenna, ale niektóre materiały są nieaktualne, a niektóre tematy nie są już całkowicie poprawne ani kompletne.
Wiele aplikacji składa się z wielu stron, między którymi użytkownik nawiguje. Aplikacja zawsze ma stronę główną lub stronę główną, a stamtąd użytkownik przechodzi do innych stron, które są przechowywane w stosie w celu nawigowania z powrotem. Dodatkowe opcje nawigacji zostały omówione w rozdziale 25. Odmiany stron.
Strony modalne i strony bez moderowania
VisualElement
Navigation
definiuje właściwość typu INavigation
, która zawiera następujące dwie metody przechodzenia do nowej strony:
Obie metody akceptują Page
wystąpienie jako argument i zwracają Task
obiekt. Następujące dwie metody przechodzą z powrotem do poprzedniej strony:
Jeśli interfejs użytkownika ma własny przycisk Wstecz (jak działają telefony z systemami Android i Windows), nie jest konieczne, aby aplikacja wywołała te metody.
Chociaż te metody są dostępne z dowolnego VisualElement
obiektu , zazwyczaj są wywoływane z Navigation
właściwości bieżącego Page
wystąpienia.
Aplikacje zazwyczaj używają modalnych stron, gdy użytkownik musi podać pewne informacje na stronie przed powrotem do poprzedniej strony. Strony, które nie są modalne, są czasami nazywane moderowymi lub hierarchicznymi. Nic na samej stronie nie rozróżnia go jako modalnego lub moderowego; Zamiast tego jest on zarządzany przez metodę używaną do przechodzenia do niej. Aby pracować na wszystkich platformach, modalna strona musi zapewnić własny interfejs użytkownika umożliwiający powrót do poprzedniej strony.
Przykład ModelessAndModal umożliwia eksplorowanie różnic między stronami moderacyjnymi i modalnymi. Każda aplikacja korzystająca z nawigacji stron musi przekazać stronę główną do NavigationPage
konstruktora, zazwyczaj w klasie programu App
. Jedną z zalet jest to, że nie trzeba już ustawiać elementu Padding
na stronie dla systemu iOS.
Zobaczysz, że dla stron bez moderowania zostanie wyświetlona Title
właściwość strony. Wszystkie platformy tabletów i komputerów stacjonarnych z systemem iOS, Android i iOS zapewniają element interfejsu użytkownika, aby wrócić do poprzedniej strony. Oczywiście urządzenia z systemami Android i Windows Phone mają standardowy przycisk Wstecz , aby wrócić.
W przypadku stron modalnych strona Title
nie jest wyświetlana, a żaden element interfejsu użytkownika nie jest udostępniany, aby wrócić do poprzedniej strony. Mimo że można użyć standardowego przycisku Wstecz systemu Android i Windows Phone, aby powrócić do poprzedniej strony, modalna strona na innych platformach musi zapewnić własny mechanizm, aby wrócić.
Animowane przejścia stron
Alternatywne wersje różnych metod nawigacji są dostarczane z drugim argumentem logicznym ustawionym true
na , jeśli chcesz, aby przejście strony obejmowało animację:
Jednak standardowe metody nawigacji stron domyślnie zawierają animację, więc są one przydatne tylko do przechodzenia do określonej strony podczas uruchamiania (zgodnie z opisem na końcu tego rozdziału) lub podczas udostępniania własnej animacji wejścia (zgodnie z opisem w rozdziale22). Animacja).
Odmiany wizualne i funkcjonalne
NavigationPage
Zawiera dwie właściwości, które można ustawić podczas tworzenia wystąpienia klasy w metodzie App
:
NavigationPage
Zawiera również cztery dołączone powiązane właściwości, które wpływają na określoną stronę, na której są ustawione:
SetHasBackButton
iGetHasBackButton
SetHasNavigationBar
iGetHasNavigationBar
SetBackButtonTitle
iGetBackButtonTitle
praca tylko w systemie iOSSetTitleIcon
pracaGetTitleIcon
tylko w systemach iOS i Android
Eksplorowanie mechaniki
Metody nawigacji stron są asynchroniczne i powinny być używane z elementem await
. Ukończenie nie wskazuje, że nawigacja po stronie została ukończona, ale tylko to, że można bezpiecznie zbadać stos nawigacji strony.
Gdy jedna strona przechodzi do innej, pierwsza strona zazwyczaj pobiera wywołanie metody OnDisappearing
, a druga strona pobiera wywołanie metody OnAppearing
. Podobnie, gdy jedna strona powróci do innej, pierwsza strona pobiera wywołanie metody, a druga strona zazwyczaj pobiera wywołanie OnDisappearing
OnAppearing
metody . Kolejność tych wywołań (a ukończenie metod asynchronicznych, które wywołują nawigację) jest zależne od platformy. Użycie słowa "ogólnie" w dwóch poprzednich instrukcjach wynika z nawigacji modalnej strony systemu Android, w której te wywołania metody nie występują.
Ponadto wywołania metod i OnDisappearing
nie muszą wskazywać OnAppearing
nawigacji między stronami.
Interfejs INavigation
zawiera dwie właściwości kolekcji, które umożliwiają badanie stosu nawigacji:
NavigationStack
typuIReadOnlyList<Page>
dla stosu bez moderowaniaModalStack
typuIReadOnlyList<Page>
dla stosu modalnego
Dostęp do tych stosów jest najbezpieczniejszy z Navigation
właściwości NavigationPage
(która powinna być właściwością App
klasy MainPage
). Badanie tych stosów jest bezpieczne tylko po zakończeniu asynchronicznych metod nawigacji między stronami. Właściwość CurrentPage
elementu NavigationPage
nie wskazuje bieżącej strony, jeśli bieżąca strona jest stroną modalną, ale wskazuje zamiast tego ostatnią stronę bez moderowania.
Przykład SinglePageNavigation umożliwia eksplorowanie nawigacji stron i stosów oraz typów prawnych nawigacji stron:
- Strona bez moderowania może przechodzić do innej strony bez moderowania lub strony modalnej
- Modalna strona może przechodzić tylko do innej strony modalnej
Wymuszanie modalności
Aplikacja używa strony modalnej, gdy konieczne jest uzyskanie pewnych informacji od użytkownika. Użytkownik nie powinien wracać do poprzedniej strony do momentu podania tych informacji. W systemie iOS można łatwo podać przycisk Wstecz i włączyć go tylko wtedy, gdy użytkownik zakończy pracę ze stroną. Jednak w przypadku urządzeń z systemem Android i Windows Phone aplikacja powinna zastąpić metodę i zwrócićtrue
, jeśli program obsłużył sam przycisk Wstecz, jak pokazano w przykładzie ModalEnforcement.OnBackButtonPressed
Przykład MvvmEnforcement pokazuje, jak to działa w scenariuszu MVVM.
Odmiany nawigacji
Jeśli konkretna modalna strona może być przechodzina do wielu razy, powinna zachować informacje, aby użytkownik mógł edytować informacje, zamiast wpisywać je ponownie. Można to obsłużyć, zachowując konkretne wystąpienie strony modalnej, ale lepsze podejście (szczególnie w systemie iOS) zachowuje informacje w modelu widoku.
Tworzenie menu nawigacji
Przykład ViewGalleryType demonstruje użycie elementów TableView
menu do wyświetlenia. Każdy element jest skojarzony z obiektem Type
dla określonej strony. Po wybraniu tego elementu program tworzy wystąpienie strony i przechodzi do niej.
Przykład ViewGalleryInst jest nieco inny niż w menu zawierający wystąpienia każdej strony, a nie typy. Pomaga to zachować informacje z każdej strony, ale wszystkie strony muszą zostać utworzone podczas uruchamiania programu.
Manipulowanie stosem nawigacji
StackManipulation demonstruje kilka funkcji zdefiniowanych przez INavigation
to, które umożliwiają manipulowanie stosem nawigacji w sposób ustrukturyzowany:
RemovePage
InsertPageBefore
PopToRootAsync
iPopToRootAsync
z opcjonalną animacją
Dynamiczne generowanie stron
Przykład BuildAPage przedstawia konstruowanie strony w czasie wykonywania na podstawie danych wejściowych użytkownika.
Wzorce transferu danych
Często konieczne jest udostępnianie danych między stronami — przesyłanie danych do strony nawigowanej oraz zwracanie danych do strony, która ją wywołała. Istnieje kilka technik w tym celu.
Argumenty konstruktora
Podczas przechodzenia do nowej strony można utworzyć wystąpienie klasy strony za pomocą argumentu konstruktora, który umożliwia stronie zainicjowanie się. Przykład SchoolAndStudents pokazuje to. Możliwe jest również, że nawigowana strona ma ustawioną BindingContext
przez stronę przechodzącą do niej.
Właściwości i wywołania metod
Pozostałe przykłady transferu danych eksplorują problem przekazywania informacji między stronami, gdy jedna strona przechodzi do innej strony i z powrotem. W tych dyskusjach strona główna przechodzi do strony informacyjnej i musi przenieść zainicjowane informacje na stronę informacyjną. Strona informacyjna uzyskuje dodatkowe informacje od użytkownika i przekazuje informacje do strony głównej.
Strona główna może łatwo uzyskać dostęp do metod publicznych i właściwości na stronie informacji , gdy tylko utworzy wystąpienie tej strony. Strona informacyjna może również uzyskać dostęp do publicznych metod i właściwości na stronie głównej, ale wybranie odpowiedniego czasu może być trudne. Przykład DateTransfer1 wykonuje to w zastąpieniu OnDisappearing
. Jedną z wad jest to, że strona informacyjna musi znać typ strony głównej.
MessagingCenter
Klasa Xamarin.FormsMessagingCenter
zapewnia inny sposób, aby dwie strony komunikowały się ze sobą. Komunikaty są identyfikowane przez ciąg tekstowy i mogą być dołączone przez dowolny obiekt.
Program, który chce odbierać komunikaty z określonego typu, musi je subskrybować przy użyciu funkcji MessagingCenter.Subscribe
i określać funkcję wywołania zwrotnego. Później można anulować subskrypcję, wywołując polecenie MessagingCenter.Unsubscribe
. Funkcja wywołania zwrotnego odbiera wszelkie komunikaty wysyłane z określonego typu o określonej nazwie wysyłanej Send
za pośrednictwem metody.
Program DateTransfer2 pokazuje, jak przesyłać dane przy użyciu centrum obsługi komunikatów, ale ponownie wymaga to, aby strona informacyjna znała typ strony głównej.
Zdarzenia
Zdarzenie jest podejściem honorowym dla jednej klasy do wysyłania informacji do innej klasy bez znajomości typu tej klasy. W przykładzie DateTransfer3 klasa informacji definiuje zdarzenie, które jest uruchamiane, gdy informacje są gotowe. Nie ma jednak wygodnego miejsca dla strony głównej, aby odłączyć procedurę obsługi zdarzeń.
Pośrednik klas aplikacji
Przykład DateTransfer4 pokazuje, jak uzyskać dostęp do właściwości zdefiniowanych w App
klasie zarówno przez stronę główną, jak i stronę informacyjną. Jest to dobre rozwiązanie, ale w następnej sekcji opisano coś lepszego.
Przełączanie do modelu ViewModel
Użycie modelu ViewModel dla informacji umożliwia stronie głównej i stronie informacyjnej udostępnianie wystąpienia klasy informacyjnej. Przedstawiono to w przykładzie DateTransfer5 .
Zapisywanie i przywracanie stanu strony
Pośrednicka App
klasy lub metoda ViewModel jest idealna, gdy aplikacja musi zapisywać informacje, jeśli program przejdzie w stan uśpienia, gdy strona informacyjna jest aktywna. Przykład DateTransfer6 pokazuje to.
Zapisywanie i przywracanie stosu nawigacji
W ogólnym przypadku program wielostronicowy, który przechodzi w tryb uśpienia, powinien przejść do tej samej strony po przywróceniu. Oznacza to, że taki program powinien zapisać zawartość stosu nawigacji. W tej sekcji pokazano, jak zautomatyzować ten proces w klasie zaprojektowanej do tego celu. Ta klasa wywołuje również poszczególne strony, aby umożliwić im zapisywanie i przywracanie stanu strony.
Biblioteka Xamarin.FormsBook.Toolkit definiuje interfejs o nazwie IPersistantPage
, który klasy mogą implementować w celu zapisywania i przywracania elementów w słowniku Properties
.
Klasa MultiPageRestorableApp
w bibliotece Xamarin.FormsBook.Toolkit pochodzi z klasy Application
. Następnie możesz uzyskać swoją klasę App
z MultiPageRestorableApp
i wykonać kilka czynności domowych.
StackRestoreDemo demonstruje użycie elementu MultiPageRestorableApp
.
Coś takiego jak prawdziwa aplikacja
Przykład NoteTaker korzysta również z MultiPageRestorableApp
elementu i umożliwia wprowadzanie i edytowanie notatek zapisanych w słowniku Properties
.