Por Alejandro Hidalgo Fernández

Isolated Storage

Cuando tenemos una aplicación Silverlight en cliente toda la información creada se perderá al cerrar la página. En caso de que necesitemos guardar datos de nuestra aplicación Silverlight de forma permanente podemos usar el Isolated Storage. Aportando un sistema de ficheros virtual cuya localización en disco estará ofuscada.

El funcionamiento que le daremos será muy similar al de las cookies del navegador. Además como depende del Sistema Operativo, podemos usar el mismo Isolated Storage tanto en Internet Explorer como en Firefox. Debido a que para cada XAP tendremos un Isolated Storage asignado al nombre del fichero XAP.

Para usar el Isolated Storage utilizaremos el espacio de nombres System.IO.IsolatedStorage. Desde el code behind ponemos:

IsolatedStorageFile almacen = IsolatedStorageFile.GetUserStoreForApplication();

Los métodos que podemos utilizar para el IsolatedStorageFile:

MétodoDescripción
CreateDirectory()Para crear una nueva carpeta en el IS.
DeleteDirectory()Para borrar una carpeta en IS.
CreateFile()Para crear un fichero en el IS y devuelve IsolatedStorageFileStream.
DeleteFile()Borra un fichero en el IS.
Remove()Borra el Isolated Storage.
OpenFile()Abre un fichero del IS y devuelve IsolatedStorageFileStream
FileExists()Comprueba si existe tal fichero.
DirectoryExists()Comprueba si existe tal directorio.
GetFileNames()Devuelve los ficheros de un directorio.
GetDirectoryNames()Devuelve los directorios de un directorio.

En un principio la aplicación Silverlight sólo recibe 1 MB de espacio en el Isolated Storage, para ampliarlo podemos usar “IncreaseQuotaTo()”. Y para ver el espacio libre en memoria podemos usar el método “AvailableFreeSpace()”.

Por ejemplo para guardar en un fichero una cadena de texto podríamos hacer:

using (almacen)

{

using(IsolatedStorageFileStream stream = almacen.CreateFile(nombreFichero))

{

StreamWriterwriter = new StreamWriter(stream);

             writer.Write(cadenaDeTexto);

             writer.Close();

}

}

Pero el usar StreamWriter es poco eficiente cuando queremos almacenar objetos, para ello utilizaremos XmlSerializer. Siendo el repruductor una instancia del Objeto reproductor, que nos permitirá almacenar la información de uno de los reproductores Zune que utilizaremos para el ejemplo.

private XmlSerializer serializador = new XmlSerializer(typeof(Reproductor));

using (IsolatedStorageFile almacen = IsolatedStorageFile.GetUserStoreForApplication())

{

using (FileStream stream = almacen.CreateFile(reproductor.Nombre + ".reproductor"))

{

serializador.Serialize(stream, reproductor);

       }

Carrito.ItemsSource = almacen.GetFileNames("*.reproductor");

       ActualizarTotal();

 }

Para borrar un reproductor almacenado en el Isolated Storage creamos un botón “borrar” con el siguiente código en el manejador del evento click:

private void BorrarReproductor_Click(object sender, RoutedEventArgs e)

{

if(Carrito.SelectedItem != null)

       {

using (IsolatedStorageFile almacen = IsolatedStorageFile.GetUserStoreForApplication())

       {

             almacen.DeleteFile(Carrito.SelectedItem.ToString());

             Carrito.ItemsSource = almacen.GetFileNames("*.reproductor");

             ActualizarTotal();

       }

       }

}

Mientras que para borrar el carrito haremos:

private void BorrarCarrito_Click(object sender, RoutedEventArgs e)

{

IsolatedStorageFile almacen = IsolatedStorageFile.GetUserStoreForApplication();

       almacen.Remove();

       almacen = IsolatedStorageFile.GetUserStoreForApplication();

       Carrito.ItemsSource = almacen.GetFileNames("*.reproductor");

       ActualizarTotal();

}

En cuanto al xaml principalmente necesitaremos un datagrid para mostrar los reproductores que hemos almacenado como constantes de la siguiente forma:

public static List<Reproductor> ObtenerReproductores()

{

return new List<Reproductor>

       {

new Reproductor("Zune 4", "Imagenes/4G.png", 99.99, "Capacidad para 1.000 canciones, 25.000 fotografías, o 12 horas de video."),

new Reproductor("Zune 8", "Imagenes/8G.png", 139.99, "Capacidad para 2.000 canciones, 25.000 fotografías, o 24 horas de video."),

new Reproductor("Zune 16", "Imagenes/16G.png", 179.99, "Capacidad para 4.000 canciones, 25.000 fotografías, o 48 horas de video."),

new Reproductor("Zune 80", "Imagenes/80G.png", 229.99, "Capacidad para 20.000 canciones,25.000 fotografías,o 250 horas de video."),

new Reproductor("Zune 120", "Imagenes/120G.png", 249.99, "Capacidad para 30.000 canciones, 25.000 fotografías, o 375 horas de video.")

             };

}

El datagrid y un listbox para mostrar los reproductores almacenados en el Isolated Storage quedarían de la siguiente forma:

<data:DataGridHeight="254" Width="420" Canvas.Left="319" Canvas.Top="31"

Name="ListaReproductores" SelectionChanged="DataGrid_SelectionChanged" AutoGenerateColumns="False" CanUserSortColumns="False"

GridLinesVisibility="All" HeadersVisibility="None" IsReadOnly="True" HorizontalScrollBarVisibility="Disabled" ItemsSource="{Binding}" Background="#AAFFFFFF">

                    <data:DataGrid.Columns>

                        <data:DataGridTemplateColumnHeader="Imagen">

                            <data:DataGridTemplateColumn.CellTemplate>

                                <DataTemplate>

                                    <ImageSource="{Binding Foto}" />

                                </DataTemplate>

                            </data:DataGridTemplateColumn.CellTemplate>

                        </data:DataGridTemplateColumn>

    <data:DataGridTextColumn Header="Nombre" Binding="{Binding Nombre}" Width="60" />

<data:DataGridTextColumn Header="Precio" Binding="{Binding Precio}" Width="57" />

                        <data:DataGridTemplateColumnHeader="Descripcion">

                            <data:DataGridTemplateColumn.CellTemplate>

                                <DataTemplate>

<TextBlock Text="{BindingDescripcion}"/>

                                </DataTemplate>

                            </data:DataGridTemplateColumn.CellTemplate>

                        </data:DataGridTemplateColumn>

                    </data:DataGrid.Columns>

                </data:DataGrid>

<ListBox x:Name="Carrito" Height="90" Width="418" Canvas.Left="320" Canvas.Top="330" Background="#AAFFFFFF"></ListBox>

Después de aplicar algunos estilos y añadir algunas imágenes podemos obtener una aplicación como la siguiente en la que podemos agregar los reproductores que queramos a nuestra lista de favoritos, y quedarás guardados en el Isolated Storage, por lo que la próxima vez que entremos a la página nuestro carrito seguirá teniendo los mismos elementos.

Además podemos eliminarlos, borrar el carrito, crear uno nuevo y ver el total de nuestra compra. Para añadir un nuevo reproductor simplemente seleccionamos uno del datagrid.

Código fuente del tutorial

Descargar tutorial y código fuente en C#
Descargar tutorial y código fuente en VB