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.
Modální stránky a bezmodální stránky
VisualElement
Navigation
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:
SetHasBackButton
aGetHasBackButton
SetHasNavigationBar
aGetHasNavigationBar
SetBackButtonTitle
aGetBackButtonTitle
pracovat jenom na iOSuSetTitleIcon
aGetTitleIcon
pracovat jenom na iOSu a Androidu
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
typuIReadOnlyList<Page>
pro bezmodální zásobníkModalStack
typuIReadOnlyList<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.
Varianty navigace
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.
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:
RemovePage
InsertPageBefore
PopToRootAsync
aPopToRootAsync
s volitelnou animací
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
.