Il controllo Panorama è sicuramente tra quelli più d’impatto dell’intero toolset di Windows Phone 7, sfortunatamente il controllo ha un difetto che si evidenzia durante il tombstoning oppure quando volete navigare verso una pagina che contiene un Panorama posizionandolo verso un PanoramaItem diverso dal primo.
Per capire meglio il problema supponiamo di avere questa pagina:

image

e di avere utilizzato questo codice per gestirne correttamente il tombstoning:

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
this.State["InitialIndex"] = MyPano.SelectedIndex;
}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (this.State.ContainsKey("InitialIndex"))
{
MyPano.DefaultItem = MyPano.Items[(int)this.State["InitialIndex"]];
this.State.Remove("InitialIndex");
}
}

Premiamo ora il tasto Tombstone il quale invoca un SearchTask, l’applicazione viene terminata:

image Ora premiamo il tasto Back per tornare alla nostra applicazione e otterremo il risultato visibile a destra.
Come potete notare il risultato è diverso da quello originale e, nei casi dove il background non è uniforme il risultato è tutt’altro che piacevole.
image

SmartPanorama è un controllo che deriva da Panorama e mette a disposizione una proprietà InitialIndex attraverso la quale è possibile ripristinare correttamente la situazione iniziale.
Il codice da utilizzare in questo caso è:

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
this.State["InitialIndex"] = MyPano.SelectedIndex;
}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (this.State.ContainsKey("InitialIndex"))
{
MyPano.InitialIndex = (int)this.State["InitialIndex"];
this.State.Remove("InitialIndex");
}
}

Il codice sorgente è disponibile qui percui non mi soffermerò nei dettagli ma mi limito a fare alcune precisazioni:

  • Nel codice c’è un po’ di magia nera derivante dalla non disponibilità di alcune informazioni e dall’analisi del codice sorgente via Reflector.
  • La soluzione ha un piccolo difetto: quando si ripristina l’ultimo item del Panorama, il primo scroll verso sinistra non è fluido, se trovate una soluzione migliore fatemi sapere.
  • La proprietà InitialIndex va usata esclusivamente per impostare il PanoramaItem all’inizializzazione della pagina, non per cambiare dinamicamente l’item a runtime.

 

Come sempre:  The software is provided “as is”, without any warranty.

Enjoy a “smarter panoraming”

Technorati Tags: ,