Riepilogo del capitolo 24. Spostamento tra le pagine
Nota
Questo libro è stato pubblicato nella primavera del 2016, e non è stato aggiornato da allora. C'è molto nel libro che rimane prezioso, ma alcuni materiali sono obsoleti, e alcuni argomenti non sono più completamente corretti o completi.
Molte applicazioni sono costituite da più pagine tra cui l'utente si sposta. L'applicazione ha sempre una pagina principale o una home page e da lì l'utente passa ad altre pagine, che vengono mantenute in uno stack per lo spostamento indietro. Altre opzioni di spostamento sono illustrate nel capitolo 25. Varietà di pagine.
Pagine modali e pagine senza modalità
VisualElement
definisce una Navigation
proprietà di tipo INavigation
, che include i due metodi seguenti per passare a una nuova pagina:
Entrambi i metodi accettano un'istanza Page
come argomento e restituiscono un Task
oggetto . I due metodi seguenti tornano alla pagina precedente:
Se l'interfaccia utente ha il proprio pulsante Indietro (come fanno i telefoni Android e Windows), non è necessario che l'applicazione chiami questi metodi.
Anche se questi metodi sono disponibili da qualsiasi VisualElement
, in genere vengono chiamati dalla Navigation
proprietà dell'istanza corrente Page
.
Le applicazioni usano in genere pagine modali quando l'utente deve fornire alcune informazioni nella pagina prima di tornare alla pagina precedente. Le pagine che non sono modali vengono talvolta chiamate modeless o gerarchica. Nulla nella pagina stessa lo distingue come modale o modeless; è governato invece dal metodo usato per spostarsi. Per funzionare in tutte le piattaforme, una pagina modale deve fornire la propria interfaccia utente per tornare alla pagina precedente.
L'esempio ModelessAndModal consente di esplorare la differenza tra le pagine modali e modeless. Qualsiasi applicazione che usa lo spostamento di pagine deve passare la NavigationPage
home page al costruttore, in genere nella classe del App
programma. Un bonus è che non è più necessario impostare un nella Padding
pagina per iOS.
Si scoprirà che per le pagine senza modalità, viene visualizzata la proprietà della Title
pagina. Le piattaforme iOS, Android e windows per tablet e desktop forniscono tutti un elemento dell'interfaccia utente per tornare alla pagina precedente. Naturalmente, i dispositivi Android e Windows Phone hanno un pulsante Indietro standard per tornare indietro.
Per le pagine modali, la pagina Title
non viene visualizzata e non viene fornito alcun elemento dell'interfaccia utente per tornare alla pagina precedente. Sebbene sia possibile usare il pulsante Indietro standard di Android e Windows Phone per tornare alla pagina precedente, la pagina modale nelle altre piattaforme deve fornire il proprio meccanismo per tornare indietro.
Transizioni di pagina animate
Le versioni alternative dei vari metodi di spostamento vengono fornite con un secondo argomento booleano impostato su true
se si vuole che la transizione di pagina includa un'animazione:
Tuttavia, i metodi standard di spostamento delle pagine includono l'animazione per impostazione predefinita, quindi sono utili solo per passare a una determinata pagina all'avvio (come illustrato verso la fine di questo capitolo) o quando si fornisce un'animazione di ingresso personalizzata (come illustrato nel capitolo 22. Animazione).
Varianti visive e funzionali
NavigationPage
include due proprietà che è possibile impostare quando si crea un'istanza della classe nel App
metodo:
NavigationPage
include anche quattro proprietà associabili associate che influiscono sulla pagina specifica in cui sono impostate:
SetHasBackButton
eGetHasBackButton
SetHasNavigationBar
eGetHasNavigationBar
SetBackButtonTitle
eGetBackButtonTitle
funzionano solo su iOSSetTitleIcon
eGetTitleIcon
funzionano solo su iOS e Android
Esplorazione dei meccanismi
I metodi di spostamento della pagina sono tutti asincroni e devono essere usati con await
. Il completamento non indica che lo spostamento della pagina è stato completato, ma solo che è sicuro esaminare lo stack di spostamento della pagina.
Quando una pagina passa a un'altra, la prima pagina riceve in genere una chiamata al OnDisappearing
relativo metodo e la seconda pagina ottiene una chiamata al relativo OnAppearing
metodo. Analogamente, quando una pagina torna a un'altra, la prima pagina ottiene una chiamata al OnDisappearing
relativo metodo e la seconda pagina in genere ottiene una chiamata al relativo OnAppearing
metodo. L'ordine di queste chiamate (e il completamento dei metodi asincroni che richiamano lo spostamento) dipende dalla piattaforma. L'uso della parola "in genere" nelle due istruzioni precedenti è dovuto allo spostamento modale della pagina Android, in cui queste chiamate al metodo non si verificano.
Inoltre, le chiamate ai metodi e OnDisappearing
non indicano necessariamente lo spostamento tra le OnAppearing
pagine.
L'interfaccia INavigation
include due proprietà della raccolta che consentono di esaminare lo stack di navigazione:
NavigationStack
di tipoIReadOnlyList<Page>
per lo stack senza modalitàModalStack
di tipoIReadOnlyList<Page>
per lo stack modale
È più sicuro accedere a questi stack dalla Navigation
proprietà di NavigationPage
(che deve essere la App
proprietà della MainPage
classe). È possibile esaminare questi stack solo dopo il completamento dei metodi di spostamento pagina asincroni. La CurrentPage
proprietà di NavigationPage
non indica la pagina corrente se la pagina corrente è una pagina modale, ma indica invece l'ultima pagina senza modalità.
L'esempio SinglePageNavigation consente di esplorare lo spostamento delle pagine e gli stack e i tipi legali di spostamento delle pagine:
- Una pagina senza modalità può passare a un'altra pagina senza modalità o a una pagina modale
- Una pagina modale può passare solo a un'altra pagina modale
Applicazione della modalità
Un'applicazione usa una pagina modale quando è necessario ottenere alcune informazioni dall'utente. L'utente deve essere vietato tornare alla pagina precedente fino a quando non vengono fornite tali informazioni. In iOS è facile fornire un pulsante Indietro e abilitarlo solo al termine della pagina. Tuttavia, per i dispositivi Android e Windows Phone, l'applicazione deve eseguire l'override del OnBackButtonPressed
metodo e restituire true
se il programma ha gestito il pulsante Indietro stesso, come illustrato nell'esempio ModalEnforcement .
L'esempio MvvmEnforcement illustra come funziona in uno scenario MVVM.
Varianti di spostamento
Se una determinata pagina modale può essere spostata più volte, deve conservare le informazioni in modo che l'utente possa modificare le informazioni anziché digitarlo di nuovo. È possibile gestirlo conservando l'istanza specifica della pagina modale, ma un approccio migliore (in particolare in iOS) mantiene le informazioni in un modello di visualizzazione.
Creazione di un menu di spostamento
L'esempio ViewGalleryType illustra l'uso di un TableView
oggetto per elencare le voci di menu. Ogni elemento è associato a un Type
oggetto per una determinata pagina. Quando l'elemento viene selezionato, il programma crea un'istanza della pagina e lo passa.
L'esempio ViewGalleryInst è leggermente diverso in quanto il menu contiene istanze di ogni pagina anziché tipi. Ciò consente di conservare le informazioni da ogni pagina, ma tutte le pagine devono essere create all'avvio del programma.
Modifica dello stack di navigazione
StackManipulation illustra diverse funzioni definite da INavigation
che consentono di modificare lo stack di navigazione in modo strutturato:
RemovePage
InsertPageBefore
PopToRootAsync
ePopToRootAsync
con animazione facoltativa
Generazione dinamica di pagine
L'esempio BuildAPage illustra la creazione di una pagina in fase di esecuzione in base all'input dell'utente.
Modelli di trasferimento dei dati
Spesso è necessario condividere dati tra pagine, per trasferire i dati a una pagina spostata e per restituire dati alla pagina che l'ha richiamata. Esistono diverse tecniche per eseguire questa operazione.
Argomenti del costruttore
Quando si passa a una nuova pagina, è possibile creare un'istanza della classe page con un argomento del costruttore che consente all'inizializzazione della pagina stessa. L'esempio SchoolAndStudents illustra questa situazione. È anche possibile che la pagina BindingContext
spostata sia impostata dalla pagina che vi si sposta.
Proprietà e chiamate al metodo
Gli esempi rimanenti di trasferimento dei dati esplorano il problema di passare informazioni tra le pagine quando una pagina passa a un'altra pagina e indietro. In queste discussioni, la home page passa alla pagina delle informazioni e deve trasferire le informazioni inizializzate alla pagina delle informazioni . La pagina info ottiene informazioni aggiuntive dall'utente e trasferisce le informazioni alla home page.
La home page può accedere facilmente a metodi e proprietà pubblici nella pagina informazioni non appena crea un'istanza di tale pagina. La pagina delle informazioni può anche accedere a metodi e proprietà pubblici nella home page, ma la scelta di un buon momento per questo può essere difficile. L'esempio DateTransfer1 esegue questa operazione nell'overrideOnDisappearing
. Uno svantaggio è che la pagina delle informazioni deve conoscere il tipo di home page.
MessagingCenter
La Xamarin.FormsMessagingCenter
classe offre un altro modo per comunicare tra due pagine. I messaggi vengono identificati da una stringa di testo e possono essere accompagnati da qualsiasi oggetto.
Un programma che desidera ricevere messaggi da un particolare tipo deve sottoscrivere i messaggi usando MessagingCenter.Subscribe
e specificare una funzione di callback. Successivamente può annullare la sottoscrizione chiamando MessagingCenter.Unsubscribe
. La funzione di callback riceve qualsiasi messaggio inviato dal tipo specificato con il nome specificato inviato tramite il Send
metodo .
Il programma DateTransfer2 illustra come trasferire i dati usando il centro di messaggistica, ma anche in questo caso è necessario che la pagina info conosca il tipo di home page.
Eventi
L'evento è un approccio time-honored per una classe per inviare informazioni a un'altra classe senza conoscere il tipo della classe. Nell'esempio DateTransfer3 la classe info definisce un evento che viene generato quando le informazioni sono pronte. Tuttavia, non esiste una posizione comoda per la home page per scollegare il gestore eventi.
Intermediario della classe App
L'esempio DateTransfer4 mostra come accedere alle proprietà definite nella App
classe sia dalla home page che dalla pagina informazioni. Questa è una buona soluzione, ma la sezione successiva descrive qualcosa di meglio.
Passaggio a un viewModel
L'uso di viewModel per le informazioni consente alla home page e alla pagina informazioni di condividere l'istanza della classe di informazioni. Questo è illustrato nell'esempio DateTransfer5 .
Salvataggio e ripristino dello stato della pagina
L'intermediario App
della classe o l'approccio ViewModel è ideale quando l'applicazione deve salvare le informazioni se il programma passa alla sospensione mentre la pagina delle informazioni è attiva. L'esempio DateTransfer6 illustra questa operazione.
Salvataggio e ripristino dello stack di spostamento
Nel caso generale, un programma a più pagine che passa alla sospensione dovrebbe passare alla stessa pagina quando viene ripristinato. Ciò significa che un programma di questo tipo deve salvare il contenuto dello stack di navigazione. Questa sezione illustra come automatizzare questo processo in una classe progettata per questo scopo. Questa classe chiama anche le singole pagine per consentire loro di salvare e ripristinare lo stato della pagina.
La Xamarin.Formslibreria Book.Toolkit definisce un'interfaccia denominata IPersistantPage
che le classi possono implementare per salvare e ripristinare elementi nel Properties
dizionario.
La MultiPageRestorableApp
classe nella Xamarin.Formslibreria Book.Toolkit deriva da Application
. È quindi possibile derivare la classe App
da MultiPageRestorableApp
ed eseguire alcune pulizie.
StackRestoreDemo illustra l'uso di MultiPageRestorableApp
.
Qualcosa di simile a un'app reale
L'esempio NoteTaker usa MultiPageRestorableApp
anche e consente l'immissione e la modifica di note salvate nel Properties
dizionario.