Windows 8. Cache de navegación como en Windows Phone

Todos los que hemos desarrollado en Windows Phone, conocemos el sistema de navegación de páginas y mecanismo de cache que almacena las páginas para que cuando se vuelva atrás, no se tenga que volver a cargar y se muestre la página cacheada. Este mismo procedimiento lo esperamos cuando desarrollamos en Windows 8, y nos encontramos que no se comporta de este mismo modo.

Por defecto, Windows 8 tiene deshabilitada la cache de páginas y cuando habilitamos la misma, usando la plantilla LayoutAwarePage, es capaz de guardar el estado de la página, pero no detecta cuando la página es nueva y, por definición, siempre muestra la página que tiene cacheada. Os pongo un ejemplo, a ver si me explico:

  1. Iniciamos nuestra aplicación
  2. Navegamos a una página que carga los álbumes de fotos locales.
  3. Navegamos atrás, al inicio de nuestra aplicación.
  4. Volvemos a la misma página de álbumes de fotos locales y comprobamos que la cache funciona correctamente porque no vuelve a cargar nada.
  5. Navegamos a la página de inicio.
  6. Ahora, navegamos a la página de álbumes, pero esta vez cargamos los álbumes que tenemos en SkyDrive. PROBLEMA. La cache ha actuado correctamente, vemos los álbumes locales y NO los de SkyDrive.

¿Por qué nos pasa esto?

Cuando habilitamos la cache, usando el Page.NavigationCacheMode, el LayoutAwarePage comprueba, en el método OnNavigatedTo, que vengas de una página cacheada y no realiza la carga del LoadState, aunque la página venga de un Back.

protected override void OnNavigatedTo(NavigationEventArgs e)


{


// Returning to a cached page through navigation shouldn't trigger state loading


if (_pageKey != null) return;


 

….


}


 

¿Cómo lo solucionamos?

Como lo que estamos buscando es tener cache, siempre y cuando la página venga de un Back, tendremos que corregir este If como sigue:

protected override void OnNavigatedTo(NavigationEventArgs e)


{


// Returning to a cached page through navigation shouldn't trigger state loading


if (_pageKey != null && e.NavigationMode == NavigationMode.Back) return;


 

….


}


Así, solo utilizaremos la página cacheada siempre que vengamos de un Back y no, por ejemplo, cuando es una página nueva.

 

Saludos a todos…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *