Technology Experience
.NET World

Applicazioni UWP: come gestire correttamente il tasto Back

Le applicazioni Universal Windows Platform sono organizzate attraverso pagine (classe Page), esattamente come accadeva nelle precedenti versioni di Windows 8 ed 8.1. Questo significa che l’app parte mostrando una pagina iniziale, poi l’utente naviga e si sposta secondo un flusso che dipende dall’app stessa. L’utente può ovviamente anche tornare indietro fra le pagine, con diverse modalità dipendentemente dal software e dall’hardware che ha a disposizione. Ad esempio:

  • su uno smartphone l’utente può utilizzare il tasto hardware fisico Back, oppure può toccare il tasto software previsto da Windows (come ad esempio su un Lumia 640 LTE)
  • su un tablet o su un PC Windows 10 il tasto hardware Back non esiste, per cui l’utente può solamente cliccare/toccare il tasto Back software previsto dal sistema operativo. Questo tasto si può trovare in due punti distinti: se la modalità Tablet è spenta, allora il pulsante si trova sulla barra del titolo relativo all’app stessa. Se la modalità Tablet è attiva, allora il pulsante si trova sulla taskbar di Windows
  • Da notare che l’utente può posizionare la taskbar su uno dei quattro lati dello schermo, per cui il tasto Back fisicamente può ritrovarsi ai quattro angoli dello schermo:
    – taskbar inferiore : tasto Back nell’angolo in basso a sinistra
    – taskbar sul lato sinistro : tasto Back nell’angolo in alto a sinistra
    – taskbar superiore : tasto Back nell’angolo in alto a sinistra
    – taskbar sul lato destro : tasto Back nell’angolo in alto a destra
  • L’app può ovviamente anche contenere un pulsante Back previsto dallo sviluppatore ed inserito all’interno della pagina: aspetto, posizionamento e comportamento dipendono ovviamente da chi scrive il codice ed implementa la pagina

Qualche screenshot è d’obbligo per chiarire meglio le cose.

image

Sopra : Pulsante Back sulla barra del titolo in un’app UWP con modalità Tablet spenta.

image

Sopra : Pulsante Back sulla taskbar di Windows agganciata al lato sinistro dello schermo, con modalità Tablet attiva.

image

Sopra : Pulsante Back sulla taskbar di Windows agganciata al lato inferiore dello schermo, con modalità Tablet attiva.

Rendere visibile o invisibile il tasto Back 
Vediamo adesso qualche riga di codice C# per gestire tutti questi scenari.

Innanzitutto, occorre controllare la visibilità del pulsante Back, che di default è e rimane nascosto. Con Windows 10 questo pulsante non fa parte della nostra UI, non è un contenuto inserito nelle nostre pagine tramite XAML, per cui se vogliamo controllarlo dobbiamo passare da classi che consentono l’accesso a questo componente messo a disposizione dal sistema operativo. Ad esempio, se vogliamo rendere visibile il pulsante Back ogni volta che si naviga verso una nuova pagina il codice necessario è il seguente:

SystemNavigationManager.GetForCurrentView()
.AppViewBackButtonVisibility =
((Frame)sender).CanGoBack ?
AppViewBackButtonVisibility.Visible :
AppViewBackButtonVisibility.Collapsed;

Dove posizionare questo blocco di codice? Ecco il codice completo che suggerisco:

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;

if (rootFrame == null)
{
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
rootFrame.Navigated += RootFrame_Navigated;
Window.Current.Content = rootFrame;
}

if (rootFrame.Content == null)
{
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}

Window.Current.Activate();
}

private void RootFrame_Navigated(object sender,
NavigationEventArgs e)
{
SystemNavigationManager.GetForCurrentView()
.AppViewBackButtonVisibility =
((Frame)sender).CanGoBack ?
AppViewBackButtonVisibility.Visible :
AppViewBackButtonVisibility.Collapsed;
}
Nel metodo OnLaunched() definito nella classe App sottoscrivo l’evento Navigated della classe Frame, che si scatena ogni qualvolta viene completata la navigazione verso una nuova pagina. Il bottone Back, di conseguenza, viene reso visibile se la proprietà CanGoBack del Frame è true.
Questo, però, completa solo metà del problema. Il bottone è visibile, ma se viene cliccato non accade nulla: per portare l’utente sulla pagina precedente dobbiamo scrivere ancora qualche riga di codice C#.

 

Intercettare la pressione del tasto Back e spostarsi alla pagina precedente

Capire quando l’utente clicca o tocca il pulsante Back e reagire di conseguenza è semplice:

public SecondPage()
{
this.InitializeComponent();

SystemNavigationManager.GetForCurrentView()
.BackRequested += SecondPage_BackRequested;
}

private void SecondPage_BackRequested(object sender,
BackRequestedEventArgs e)
{
if (this.Frame.CanGoBack)
{
this.Frame.GoBack();
}

e.Handled = true;
}

Si utilizza la classe SystemNavigationManager, si ottiene un riferimento alla view corrente e si sottoscrive l’evento BackRequested. Nell’event handler si effettua la navigazione alla pagina precedente: un buon modo per evitare eccezioni o problemi da questo punto di vista è verificare se sia possibile controllando la proprietà CanGoBack esposta da Frame.

 
Ed in un mondo MVVM?
Quando si sviluppa un’app con il pattern MVVM, le cose sono un po’ diverse, ma non molto. Non scriviamo codice nel code-behind della Page, bensì abbiamo a che fare con una classe ViewModel. Nel costruttore di ciascuna classe ViewModel sottoscriviamo l’evento BackRequested:
 
public AboutViewModel()
{
SystemNavigationManager.GetForCurrentView()
.BackRequested += (s, e) =>
{
e.Handled = true;
base.GoBack();
};
}
Si può evitare di sottoscrivere l’evento nella classe ViewModel relativa alla prima pagina che parte con l’app, perchè da questa pagina non si può tornare indietro da alcuna parte. Nel momento in cui l’utente clicca/tocca il tasto Back, viene scatenato l’evento BackRequested. Nel mio esempio qui sopra, vado a chiamare il metodo GoBack() esposto da tutti i miei ViewModel, che fa semplicemente:
 
protected void GoBack()
{
Frame rootFrame =
Windows.UI.Xaml.Window.Current.Content as Frame;

if (rootFrame.CanGoBack)
{
rootFrame.GoBack();
}
}
 
In questo modo si evita di andare a lavorare nel code-behind: qui semplicemente si recupera il Frame relativo alla vista corrente e se possibile si scatena la navigazione all’indietro.
 
Et voilà, il gioco è fatto!
Send to Kindle

Igor Damiani

La sua passione per l'informatica nasce nella prima metà degli anni '80, quando suo padre acquistò un Texas Instruments TI-99. Da allora ha continuato a seguire l'evoluzione sia hardware che software avvenuta nel corso degli anni. E' un utente, un videogiocatore ed uno sviluppatore software a tempo pieno. Igor ha lavorato e lavora anche oggi con le più moderne tecnologie Microsoft per lo sviluppo di applicazioni: .NET Framework, XAML, Universal Windows Platform, su diverse piattaforme, tra cui spiccano Windows 10 piattaforme mobile. Numerose sono le app che Igor ha creato e pubblicato sul marketplace sotto il nome VivendoByte, suo personale marchio di fabbrica. Adora mantenere i contatti attraverso Twitter e soprattutto attraverso gli eventi delle community .NET.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.