Il concetto di navigazione di Windows Phone 7

Print Content | More

Ieri ho avuto la fortuna di partecipare ad un evento riservato ad alcune aziende dedicato a Windows Phone 7, nel quale la maggior parte delle sessioni è stata tenuta da Jaime Rodriguez, Microsoft Principal Evangelist specializzato su WPF, Silverlight e Windows Phone.

La giornata è stata molto interessante: Jaime Rodriguez ha trattato diversi argomenti, partendo da una introduzione a Silverlight per poi focalizzarsi su Windows Phone, con alcuni esempi concreti e mettendo in evidenza le differenze tra Silverlight  e Silverlight per WP. Il pomeriggio invece è stato dedicato all'interfacciamento con l'hardware e alle policy del marketplace (di cui vi ho parlato nel post precedente).

Ho avuto anche modo di provare di persona il device per la prima volta e le prime impressioni confermano quanto era trapelato dal video del TechEd:  l’interfaccia grafica si presenta pulita e originale e il sistema è veramente reattivo e veloce, anche fin troppo (in senso positivo) tenendo conto che stiamo parlando di una versione ancora in fase di sviluppo di un sistema operativo che non uscirà prima della fine dell’anno.

In questo post vorrei focalizzarmi su uno degli aspetti più interessanti di Windows Phone, che avevo già menzionato in un altro post: il Navigation Control.
Si tratta di una delle novità di Silverlight  ed è stata una delle feature più apprezzate e richieste degli sviluppatori: basata sul concetto di Frame e Pages, permette di realizzare applicazioni Silverlight in cui è possibile spostarsi avanti e indietro tra le varie viste, mantenendone lo storico. Il paragone con il Web è immediato: si tratta infatti dello stesso concetto ampiamente utilizzato nella navigazione su Internet e implementato da tutti i browser sul mercato.

Il concetto su Windows Phone è lo stesso, ma ampliato ed esteso a tutto il device: la history che viene mantenuta non è relativa solamente alle varie viste dell'applicazione corrente, ma si estende a tutte le applicazioni che sono state utilizzate in precedenza. La cosa interessante è che ciò non vale solamente per le applicazioni standard di WP7, ma anche per tutte quelle sviluppate da terze parti. Fanno eccezione i giochi (che ricordo, sono sviluppati in XNA), dato che non sono basati sul concetto di pagine come le applicazioni Silverlight. In linea di massima, infatti, nei giochi la pressione del tasto Back non deve portare alla pagina immediatamente precedente, ma mostrare un menu di pausa, tramite il quale poter selezionare le varie opzioni ed, eventualmente, consentire all’utente di tornare all’applicazione precedente tramite una seconda pressione del tasto Back,
Tornando alle applicazioni “tradizionali”, il concetto di "navigazione" si sposa alla perfezione con la presenza (obbligatoria e imposta a tutti i vendor) di un tasto hardware "Back", che serve proprio a questo scopo.

WP7

In cosa si traduce tutto ciò? Facciamo un esempio, aiutandoci con l’immagine qui sopra: dal menù iniziale premo sull'hub (così si chiamo i "blocchi quadrati" presenti nell'home page che portano alle applicazioni) People, per accedere alla rubrica. Poi premo il tasto Start (che mette in pausa l'applicazione e torna al menu principale, vedremo in un secondo momento il concetto di "Paused") e da li accedo all'applicazione Games, dalla quale posso visualizzare tutti i giochi che ho installato e interagire con la piattaforma di social gaming XBox Live. Infine premo nuovamente il pulsante Start e decido di avviare la mia applicazione. Ora premo il pulsante Back, per ritrovarmi alla home dell'applicazione Games. Se premo nuovamente Back, il sistema mi farà tornare alla rubrica, perché nella history è "la pagina" (che in questo caso coincide con un'applicazione diversa da quella corrente) che è stata aperta prima di quella attuale.
Interessante vero?

Entrando un po’ più nel tecnico, come si traduce questa cosa? Innanzitutto il framework ci mette a disposizione una serie di eventi per gestire il passaggio da una pagina all’altra e che vengono scatenati ogni qualvolta si preme il tasto Back. Tali eventi ci vengono forniti “aggratis” grazie al fatto che le varie Pages di un’applicazione Windows Phone derivano dalla classe PhoneApplicationPage. Ma scendiamo nei dettagli e vediamo meglio questi eventi, prendendo come esempio una semplice applicazione che fa uso di due viste: MainPage e Page1 (che corrispondono a due XAML diversi).

 

OnNavigatedFrom

Questo evento viene scatenato ogni qualvolta che lasciamo la pagina corrente: ad esempio, se ci troviamo nella Page1 e premiamo il pulsante Back, nella pagina Page1 verrà scatenato l’evento OnNavigatedFrom.

protected override void OnNavigatedFrom(Microsoft.Phone.Navigation.PhoneNavigationEventArgs e)
{
    base.OnNavigatedFrom(e);
    MessageBox.Show("Sto andando via dalla MainPage");
}

Queste semplici linee di codice fanno si che, ogni qualvolta siamo nella Page1 e premiamo il pulsante Back, venga mostrato a video un alert con il testo “Sto andando via dalla Page1”.

OnNavigatedTo

Queste evento viene invece scatenato ogni qualvolta che viene visualizzata la pagina corrente: ad esempio, se ci troviamo nella Page1 e premiamo il pulsante Back, nella pagina MainPage verrà scatenato l’evento OnNavigatedTo.

protected override void OnNavigatedTo(Microsoft.Phone.Navigation.PhoneNavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    MessageBox.Show("Sono arrivato in questa pagina");
}

Analogamente all’esempio di prima, queste linee di codice fanno che si l’alert venga mostrato ogni qualvolta la pagina corrente venga visualizzata sullo schermo del device.

OnNavigatingFrom

Questo evento viene scatenato ogni qualvolta si sta per lasciare la pagina corrente. Il suo scopo è quello di dare la possibilità di annullare la pressione del tasto back, settando la proprietà Cancel, che fa parte degli argomenti che vengono passati dall’evento, a true.

protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
{
    base.OnNavigatingFrom(e);
    if (MessageBox.Show("Vuoi lasciare la pagina?", "Conferma", MessageBoxButton.OKCancel) == MessageBoxResult.Cancel)
        e.Cancel = true;
  
}

Il semplice esempio riportato qui sopra non fa altro che mostrare all’utente un alert, in cui gli viene chiesta conferma se voglia o meno lasciare la pagina corrente. Se viene premuto il pulsante Cancel (MessageBoxResult.Cancel) allora andiamo a impostare a true il valore della proprietà Cancel dell’oggetto e, che è un’istanza della classe NavigatingCancelEventArgs: il risultato sarà che la navigazione verso la pagina precedente sarà annullata e rimarremo nella pagina corrente.

Sono molti gli scenari in cui è possibile utilizzare questi tre eventi: ad esempio, OnNavigatedFrom e OnNavigatedTo possono essere usati per salvare e ripristinare lo stato di una pagina al suo caricamento, in modo da non perdere dati o informazioni nel momento in cui l’utente decide di spostarsi da una pagina all’altra. L’evento OnNavigatinFrom va invece utilizzato con cautela, in quanto in linea di massima l’utente deve sempre avere la possibilità di utilizzare il tasto Back per tornare indietro: può però essere molto utile in alcuni scenarim come un form di inserimento dati per garantire la consistenza delle informazioni. Se l’utente ha già compilato i vari campi parzialmente o nella loro totalità e decide di premere il tasto Back, possiamo avvertirlo che così facendo perderà il lavoro svolto: a questo punto sarà sua la decisione se continuare o meno e la perdita di dati sarà causata da una sua scelta e non da un nostro errore di progettazione.

Spero di avervi messo un po’ di curiosità riguardo allo sviluppo su Windows Phone: a breve torneremo sul concetto di navigazione, per parlare di come si comporta Windows Phone quando passiamo ad un’altra applicazione o quando qualche evento dall’esterno (una chiamata o un sms, ad esempio) va ad interferire con il nostro programma.

Alla prossima!


Microsoft , Silverlight , XNA , Jaime Rodriguez , Hub

0 comments

Related Post


(will not be published)
(es: http://www.mysite.com)