Riepilogo del capitolo 24. Spostamento tra le pagine

Download Sample Scaricare l'esempio

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.

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:

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 tipo IReadOnlyList<Page> per lo stack senza modalità
  • ModalStack di tipo IReadOnlyList<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.

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.

Triple screenshot of View Gallery Type

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:

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.

evento

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.