Sdílet prostřednictvím


Shrnutí kapitoly 24. Stránková navigace

Poznámka:

Tato kniha byla publikována na jaře roku 2016 a od té doby nebyla aktualizována. Existuje mnoho v knize, která zůstává cenná, ale některé materiály jsou zastaralé a některá témata už nejsou zcela správná nebo úplná.

Mnoho aplikací se skládá z více stránek, mezi kterými uživatel prochází. Aplikace má vždy hlavní stránku nebo domovskou stránku a odsud uživatel přejde na jiné stránky, které jsou udržovány v zásobníku pro navigaci zpět. Další možnosti navigace jsou popsány v kapitole 25. Odrůdy stránek.

VisualElementNavigation definuje vlastnost typu INavigation, která obsahuje následující dvě metody pro přechod na novou stránku:

Obě metody přijímají Page instanci jako argument a vrací Task objekt. Následující dvě metody přechází zpět na předchozí stránku:

Pokud má uživatelské rozhraní vlastní tlačítko Zpět (jako telefony s Androidem a Windows), není nutné, aby aplikace tyto metody volala.

I když jsou tyto metody k dispozici z libovolné VisualElement, obecně jsou volána z Navigation vlastnosti aktuální Page instance.

Aplikace obvykle používají modální stránky, pokud je uživatel nutný k zadání některých informací na stránce před návratem na předchozí stránku. Stránky, které nejsou modální, se někdy označují jako bezmodální nebo hierarchické. Nic na samotné stránce nerozlišuje jako modální nebo bezmodální; místo toho se řídí metodou používanou k přechodu na ni. Aby bylo možné pracovat na všech platformách, musí modální stránka poskytnout vlastní uživatelské rozhraní pro přechod zpět na předchozí stránku.

Ukázka ModelessAndModal umožňuje prozkoumat rozdíl mezi bezmodálními a modálními stránkami. Každá aplikace, která používá navigaci na stránce, musí konstruktoru NavigationPage předat její domovskou stránku, obecně ve třídě programu App . Jedním z bonusů je, že už nemusíte na stránce pro iOS nastavovat Padding .

Zjistíte, že pro bezmodální stránky se zobrazí vlastnost stránky Title . Všechny platformy pro iOS, Android a tablety a stolní počítače s Windows poskytují prvek uživatelského rozhraní pro návrat na předchozí stránku. Samozřejmě, zařízení s Androidem a Telefonem s Windows mají standardní tlačítko Zpět pro návrat.

U modálních stránek se stránka Title nezobrazí a není k dispozici žádný prvek uživatelského rozhraní pro návrat na předchozí stránku. I když se můžete vrátit na předchozí stránku pomocí tlačítka Zpět pro Android a Telefon s Windows, modální stránka na jiných platformách musí poskytovat svůj vlastní mechanismus pro návrat.

Animované přechody stránek

Alternativní verze různých navigačních metod jsou k dispozici s druhým logickým argumentem, který true nastavíte, pokud chcete, aby přechod stránky obsahoval animaci:

Standardní metody navigace na stránce ale ve výchozím nastavení obsahují animaci, takže jsou užitečné jenom pro přechod na konkrétní stránku při spuštění (jak je popsáno na konci této kapitoly) nebo při poskytování vlastní úvodní animace (jak je popsáno v kapitole22). Animace).

Vizuální a funkční varianty

NavigationPage obsahuje dvě vlastnosti, které můžete nastavit při vytvoření instance třídy ve vaší App metodě:

NavigationPage obsahuje také čtyři připojené vlastnosti s možností vazby, které ovlivňují konkrétní stránku, na které jsou nastaveny:

Prozkoumání mechaniky

Metody navigace na stránce jsou všechny asynchronní a měly by být použity s await. Dokončení neznamená, že se dokončila navigace na stránce, ale jenom to, že je bezpečné prozkoumat zásobník navigace na stránce.

Když jedna stránka přejde na jinou, první stránka obecně získá volání metody OnDisappearing a druhá stránka získá volání metody OnAppearing . Podobně platí, že když se jedna stránka vrátí do jiné, první stránka získá volání metody OnDisappearing a druhá stránka obecně získá volání metody OnAppearing . Pořadí těchto volání (a dokončení asynchronních metod, které vyvolá navigaci) je závislé na platformě. Použití slova "obecně" ve dvou předchozích příkazech je způsobeno modální stránkovou navigaci v Androidu, ve kterém k těmto voláním metody nedojde.

Volání metod OnAppearing a OnDisappearing metod také nemusí nutně znamenat navigaci na stránce.

Rozhraní INavigation obsahuje dvě vlastnosti kolekce, které umožňují prozkoumat navigační zásobník:

  • NavigationStack typu IReadOnlyList<Page> pro bezmodální zásobník
  • ModalStack typu IReadOnlyList<Page> modálního zásobníku

Přístup k těmto zásobníkům je nejbezpečnější z Navigation vlastnosti objektu NavigationPage (což by mělo být App vlastnost třídy MainPage ). Po dokončení asynchronních metod navigace na stránce je bezpečné tyto zásobníky prozkoumat. Vlastnost CurrentPage NavigationPage nezoznačuje aktuální stránku, pokud je aktuální stránka modální stránkou, ale označuje místo poslední bezmodální stránky.

Ukázka SinglePageNavigation umožňuje prozkoumat navigaci na stránkách a zásobníky a právní typy navigace na stránkách:

  • Bezmodální stránka může přejít na jinou bezmodální stránku nebo modální stránku.
  • Modální stránka může přejít pouze na jinou modální stránku.

Vynucování způsobu

Aplikace používá modální stránku, když je nutné od uživatele získat nějaké informace. Uživatel by měl být zakázán v návratu na předchozí stránku, dokud tyto informace nebudou poskytnuty. V iOSu je snadné zadat tlačítko Zpět a povolit ho jenom v případě, že uživatel stránku dokončil. U zařízení s Androidem a Telefonem s Windows by ale měla aplikace přepsat metodu a vrátit se, pokud program zpracoval samotné tlačítko Zpět, jak je znázorněno v ukázce ModalEnforcement.true OnBackButtonPressed

Ukázka MvvmEnforcement ukazuje, jak to funguje ve scénáři MVVM.

Pokud se určitá modální stránka dá přejít na vícekrát, měla by uchovávat informace, aby uživatel mohl informace upravovat, místo aby je znovu zapisoval. Můžete to vyřešit tak, že si zachováte konkrétní instanci modální stránky, ale lepší přístup (zejména v iOSu) zachovává informace v modelu zobrazení.

Vytvoření navigační nabídky

Ukázka ViewGalleryType ukazuje použití TableView položky nabídky seznamu. Každá položka je přidružena k objektu Type pro určitou stránku. Když je tato položka vybraná, program vytvoří instanci stránky a přejde na ni.

Trojitý snímek obrazovky s typem galerie zobrazení

Ukázka ViewGalleryInst je trochu jiná v tom, že nabídka obsahuje instance každé stránky, nikoli typy. To pomáhá uchovávat informace z každé stránky, ale všechny stránky musí být vytvořena při spuštění programu.

Manipulace se zásobníkem navigace

StackManipulation demonstruje několik funkcí definovaných INavigation pomocí, které umožňují pracovat se zásobníkem navigace strukturovaným způsobem:

Dynamické generování stránek

Ukázka BuildAPage ukazuje vytvoření stránky za běhu na základě uživatelského vstupu.

Vzory přenosu dat

Často je nutné sdílet data mezi stránkami – k přenosu dat na navigovanou stránku a k tomu, aby stránka vrátila data na stránku, která je vyvolala. Existuje několik technik, jak to udělat.

Argumenty konstruktoru

Při přechodu na novou stránku je možné vytvořit instanci třídy stránky pomocí argumentu konstruktoru, který umožňuje inicializaci samotné stránky. Ukázka SchoolAndStudents to demonstruje. Na procházené stránce je také možné nastavit stránku BindingContext , která na ni přejde.

Vlastnosti a volání metod

Zbývající příklady přenosu dat se zabývají problémem předávání informací mezi stránkami, když jedna stránka přejde na jinou stránku a zpět. V těchto diskuzích přejde domovská stránka na informační stránku a musí na informační stránku přenést inicializované informace. Informační stránka získá další informace od uživatele a přenese informace na domovskou stránku.

Domovská stránka může snadno přistupovat k veřejným metodám a vlastnostem na stránce s informacemi hned po vytvoření instance této stránky. Informační stránka může také přistupovat k veřejným metodám a vlastnostem na domovské stránce, ale volba vhodného času pro tuto možnost může být složitá. Ukázka DateTransfer1 to provede v přepsání OnDisappearing . Nevýhodou je, že informační stránka musí znát typ domovské stránky.

MessagingCenter

Třída Xamarin.FormsMessagingCenter poskytuje další způsob, jak dvě stránky vzájemně komunikovat. Zprávy jsou identifikovány textovým řetězcem a mohou být doprovázeny libovolným objektem.

Program, který chce přijímat zprávy z konkrétního typu, se musí přihlásit k odběru pomocí MessagingCenter.Subscribe a zadat funkci zpětného volání. Později se může odhlásit voláním MessagingCenter.Unsubscribe. Funkce zpětného volání obdrží všechny zprávy odeslané ze zadaného typu se zadaným názvem odeslaným prostřednictvím Send metody.

Program DateTransfer2 ukazuje, jak přenášet data pomocí centra zasílání zpráv, ale znovu to vyžaduje, aby informační stránka znala typ domovské stránky.

Události

Událost je časově respektovaný přístup pro jednu třídu, aby odesílala informace do jiné třídy, aniž by věděla, že daný typ třídy. V dateTransfer3 vzorek informační třída definuje událost, která se aktivuje, když jsou informace připravené. Není však vhodné místo pro domovskou stránku odpojit obslužnou rutinu události.

Zprostředkovatel třídy aplikace

Ukázka DateTransfer4 ukazuje, jak přistupovat k vlastnostem definovaným ve App třídě na domovské stránce i na informační stránce. Toto je dobré řešení, ale další část popisuje něco lepšího.

Přepnutí na model ViewModel

Použití modelu ViewModel pro informace umožňuje domovskou stránku a informační stránku sdílet instanci třídy informací. To je demonstrováno v ukázce DateTransfer5 .

Ukládání a obnovení stavu stránky

Zprostředkující App třída nebo přístup ViewModel je ideální, když aplikace musí uložit informace, pokud program přejde do režimu spánku, zatímco informační stránka je aktivní. Ukázka DateTransfer6 ukazuje tuto možnost.

Uložení a obnovení navigačního zásobníku

Obecně platí, že program s více stránkami, který přejde do režimu spánku, by měl při obnovení přejít na stejnou stránku. To znamená, že takový program by měl uložit obsah navigačního zásobníku. Tato část ukazuje, jak tento proces automatizovat ve třídě určené pro tento účel. Tato třída také volá jednotlivé stránky, které jim umožní uložit a obnovit jejich stav stránky.

Knihovna Xamarin.FormsBook.Toolkit definuje rozhraní s názvem IPersistantPage , které třídy mohou implementovat pro ukládání a obnovení položek ve slovníku Properties .

Třída MultiPageRestorableApp v knihovně Xamarin.FormsBook.Toolkit je odvozena z Application. Třídu pak můžete odvodit App a MultiPageRestorableApp provést nějaké úklidové služby.

StackRestoreDemo ukazuje použití .MultiPageRestorableApp

Něco jako aplikace v reálném životě

Ukázka NoteTaker také používá MultiPageRestorableApp a umožňuje zadávání a úpravy poznámek uložených ve slovníku Properties .