Algunos tutoriales de Windows Phone 7 (Parte 3)
Continuamos con la recopilación de tutoriales de programación en Windows Phone.
1. Cambiar el fondo de un Panorama dinámicamente con animación (Windows Phone Geek, inglés)
2. Windows Phone 7 Custom Message Box (Essential WPF and Young Brothers, inglés)
3. ListBox con reordernación en Windows Phone (Jason Ginchereau’s Blog, inglés)
4. Usando TiltEffect en Windows Phone 7 (Windows Phone Geek, inglés)
5. Animando un ListBox SelectedItem con con efecto flipping en WP7 (Windows Phone Geek, inglés)
Grabador de voz en Windows Phone
Excelente tutorial en la web de CodeProject sobre como crear un grabador de voz en Windows Phone. Aquí os dejo el enlace al sitio.
Enlace: Making a Voice Recorder On Windows Phone (CodeProject)
Base de datos XML en Windows Phone 7
En el post de hoy explicaremos la manera de tener nuestra propia Base de Datos en Windows Phone mediante un fichero XML local. Esta maravillosa alternativa me ha quitado muchos dolores de cabeza en una aplicación que estoy implementando. Se trata del sistema de almacenamiento llamado Linq to XML.
En este post implementaremos una simple aplicación con Windows Phone que almacenará y gestionará equipos de futbol de la Liga Española.
Para empezar crearemos un proyecto de Windows Phone y agregaremos un fichero XML en la raíz del proyecto haciendo click en Agregar -> New Item -> XML File. En nuestro caso a este fichero Base de Datos le llamaremos Equipos.xml. Y tendrá la siguiente estructura:
<?xml version="1.0" encoding="utf-8" ?>
<Equipos>
<Equipo Nombre="Real Madrid">
<Ciudad>Madrid</Ciudad>
<Estadio>Santiago Bernabeu</Estadio>
</Equipo>
<Equipo Nombre="FC Barcelona">
<Ciudad>Barcelona</Ciudad>
<Estadio>Camp Nou</Estadio>
</Equipo>
<Equipo Nombre="Atletico Madrid">
<Ciudad>Madrid</Ciudad>
<Estadio>Vicente Calderón</Estadio>
</Equipo>
</Equipos>Con esta estructura XML crearemos la clase Equipo.cs en C#. Primero deberemos añadir la referencia System.Xml.Linq en nuestra aplicación. Nuestra clase quedaría de la siguiente manera:
public class Equipo
{
[System.Xml.Serialization.XmlElement]
public string Nombre { get; set; }
[System.Xml.Serialization.XmlElement]
public string Ciudad { get; set; }
[System.Xml.Serialization.XmlElement]
public string Estadio { get; set; }
public Equipo()
{
this.Nombre = "";
this.Ciudad = "";
this.Estadio = "";
}
public Equipo(string nombre, string ciudad, string estadio)
{
this.Nombre = nombre;
this.Ciudad = ciudad;
this.Estadio = estadio;
}
public Equipo(XElement xElement)
{
this.Nombre = xElement.Attribute("Nombre").Value;
this.Ciudad = xElement.Element("Ciudad").Value;
this.Estadio = xElement.Element("Estadio").Value;
}
public XElement Information
{
get
{
return new XElement("Equipo",
new XAttribute("Nombre", this.Nombre),
new XElement("Ciudad", this.Ciudad),
new XElement("Estadio", this.Estadio));
}
}
}Necesitaremos además una clase donde definiremos nuestras funciones de carga, guardado y eliminado de elementos de XML. Se llamará ListaEquipos. Y estas son sus funciones:
public class CarList : List<Equipo>
{
public void Load(string strXMLFile)
{
IsolatedStorageFile isfData = IsolatedStorageFile.GetUserStoreForApplication();
XDocument doc = null;
IsolatedStorageFileStream isfStream = null;
if (isfData.FileExists(strXMLFile))
{
isfStream = new IsolatedStorageFileStream(strXMLFile, System.IO.FileMode.Open, isfData);
doc = XDocument.Load(isfStream);
isfStream.Close();
}
else
{
doc = XDocument.Load(strXMLFile);
isfStream = new IsolatedStorageFileStream(strXMLFile, System.IO.FileMode.CreateNew, isfData);
doc.Save(isfStream);
isfStream.Close();
}
var vCar = from s in doc.Descendants("Equipo")
select new Equipo(s);
this.Clear();
AddRange(vCar);
}
public void Save(string strXMLFile)
{
try
{
XElement xml = new XElement("Equipos",
from p in this
select p.Information);
IsolatedStorageFileStream isfStream = new IsolatedStorageFileStream(strXMLFile, System.IO.FileMode.Open, IsolatedStorageFile.GetUserStoreForApplication());
xml.Save(isfStream);
isfStream.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public void Remove(string registration, string strXMLFile)
{
IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream isoStream;
isoStream = new IsolatedStorageFileStream(strXMLFile, System.IO.FileMode.Open, System.IO.FileAccess.Read, isoStore);
XDocument xml = XDocument.Load(isoStream);
isoStream.Close();
XElement sectionElement = xml.Descendants("Equipo").Where(c => c.Attribute("Nombre").Value.Equals(registration)).FirstOrDefault();
sectionElement.Remove();
isoStream.Close();
isoStream = new IsolatedStorageFileStream(strXMLFile, FileMode.Create, FileAccess.Write, isoStore);
xml.Save(isoStream);
isoStream.Close();
}
}Un ejemplo de carga del XML sería este:
public MainPage()
{
InitializeComponent();
ListaEquipos l = new ListaEquipos();
l.Load("Equipos.xml");
}Aquí os podéis descargar el código:
Archivo: XMLDatabase.zip
Y el temazo que os dejo hoy se llama… (redoble de tambores)… REBIRTHING de Skillet… madre mía!
Windows Phone 7 Isolated Storage Explorer
Navegando por la red me he encontrado con una fantástica utilidad, un programa llamado Windows Phone 7 Isolated Storage Explorer. Este programa permite visualizar los archivos guardados en local mediante almacenamiento aislado. Mientras ejecutas tu aplicación de Windows Phone 7 con el emulador puedes acceder a los ficheros, descargarlos y revisar sus datos.
Esto es muy útil cuando programas porque a veces los errores de serialización de XML o JSon son difíciles de corregir si no sabes que tienes en los ficheros.

Los pasos para instalarlo y añadirlo a tu aplicación son los siguientes:
1. Instalar el archivo instalador descargado desde la web.
2. Añadir la referencia de IsolatedStorageExplorer en tu aplicación. La podrás encontrar en la pestaña de .NET.
3. Añadir el siguiente código en el evento Application_Launching del archivo App.xaml.cs
private void Application_Launching(object sender, LaunchingEventArgs e)
{
IsolatedStorageExplorer.Explorer.Start("localhost");
}4. Añadir el siguiente código en el evento Application_Activated del mismo archivo.
private void Application_Activated(object sender, ActivatedEventArgs e)
{
IsolatedStorageExplorer.Explorer.RestoreFromTombstone();
}Podéis encontrar mucha más información en la documentación del programa.
Y de propina os dejo este temazo:
Almacenamiento local de datos en Windows Phone
Almacenamiento de datos en WP7
La programación de aplicaciones para Windows Phone tiene, a mi modo de ver, un defecto importante en lo que se refiere a almacenamiento de datos. En esta plataforma no existe una Base de Datos interna del teléfono donde podamos guardar y acceder a los datos de nuestra aplicación. No sé si en un futuro esto cambiará pero de momento Microsoft sigue con su idea de almacenamiento en la nube. Es decir, la filosofía de Windows Phone es utilizaar Internet para guardar todos los datos. No es una mala teoría porque los datos estarían a salvo de problemas con el dispositivo y serían accesibles siempre, pero si no tenemos una tarifa de datos estamos perdidos.
En este post trataré de explicar las diferentes opciones para almacenar datos que tenemos. Básicamente son 2: Isolated Storage o almacenamiento en local y almacenamiento en Base de Datos en la nube. En este post nos centraremos en el almacenamiento con Isolated Storage.
¿Qué es Isolated Storage?
El almacenamiento de datos con Isolated Storage o almacenamiento aislado es una forma de guardar los datos en archivos locales que lleva en uso desde Silverlight 2. Solo nuestra aplicación tiene acceso a sus archivos, por eso se llama almacenamiento aislado. No es posible compartir datos entre dos aplicaciones con este sistema.
El almacenamiento de datos con Isolated Storage o almacenamiento aislado es una forma de guardar los datos en archivos locales que lleva en uso desde Silverlight 2. Solo nuestra aplicación tiene acceso a sus archivos, por eso se llama almacenamiento aislado. No es posible compartir datos entre dos aplicaciones con este sistema ya que no son visible entre dos espacios de aplicación diferentes.
Existen dos tipos de almacenamiento en local. Usando almacenamiento de pares clave y valor (IsolatedStorageSettings) y usando archivos y directorios (IsolatedStorageFile).
IsolatedStorageSettings
Este tipo de almacenamiento permite guardar parejas de nombre y valor directamente en tu dispositivo (sin necesidad de crear ni administrar la lista de datos). Una vez guardados los datos podemos recuperarlos mediante su clave.
La información permanecerá en el teléfono mientras la aplicación no se desinstale o se borre desde la aplicación. No se pierde al apagar el teléfono. En el siguiente código se implementa una función de almacenaje y otra de recuperación.
private void SaveValue(string clave, string valor)
{
if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
IsolatedStorageSettings.ApplicationSettings[clave] = valor;
else
IsolatedStorageSettings.ApplicationSettings.Add(clave, valor);
IsolatedStorageSettings.ApplicationSettings.Save();
}private string RetrieveValue(string clave)
{
if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
return IsolatedStorageSettings.ApplicationSettings[clave].ToString();
else
return default(string);
}Podemos saber la cantidad de pares clave-valor que hemos guardado mediante la función:
IsolatedStorageSettings.ApplicationSettings.Count
IsolatedStorageFile
Mediante el método IsolatedStorageFile nuestra aplicación será capaz de guardar datos de la aplicación en ficheros locales localizados en la partición privada de nuestra aplicación. Podemos gestionar carpetas para organizar mejor nuestros datos si queremos.
En la siguiente función podemos ver como guardar un objeto (instáncia de clase) en el archivo datos.xml.
public static void StoreObject(Object obj)
{
IsolatedStorageFile appStore = IsolatedStorageFile.GetUserStoreForApplication();
using (IsolatedStorageFileStream fileStream = appStore.OpenFile("datos.xml", System.IO.FileMode.Create))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(Object));
serializer.WriteObject(fileStream, obj);
}
}Y ahora recuperaremos el dato del fichero:
public static Object RetrieveObject()
{
Object obj = default(Object);
IsolatedStorageFile appStore = IsolatedStorageFile.GetUserStoreForApplication();
if (appStore.FileExists("datos.xml"))
{
using (IsolatedStorageFileStream fileStream = appStore.OpenFile("datos.xml", System.IO.FileMode.Open))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(Object));
obj = (Object)serializer.ReadObject(fileStream);
}
}
return obj;
}Aquí os dejo un artículo de “Un Informático en Construcción” que está muy bien y donde guardan textos en IsolatedStorageFile, por si os interesa.
Espero haber sido de ayuda. Iremos ampliando el contenido de nuestros tutoriales para Windows Phone 7.
Y para que os pongáis tontorrones os dejo este temazo de Daughtry:
Uso del control Popup en WP7
En este post intentaremos profundizar un poco en el uso del Control Popup en aplicaciones para Windows Phone 7. Crearemos una simple aplicación que muestre un menú dentro de un popup emergente. Lo primero será añadir un par de iconos que utilizaremos en nuestro Application bar. Al añadir un icono a nuestro proyecto es de vital importancia cambiar ciertas propiedades. El campo Build Action debe tener valor Content y el campo Copy to Output Directory debe ser Copy if newer. Si no seleccionamos estos parámetros no se mostrarán nuestros iconos en la aplicación.
Empecemos con el código, ésta es la definición XAML de nuestro Popup:
<Popup x:Name="ContextMenuPopup" Height="364" Width="389" Margin="38,0,29,6" VerticalAlignment="Bottom" HorizontalAlignment="Center">
<ListBox FontSize="40" SelectionChanged="ListBox_SelectionChanged">
<ListBoxItem Content="Item Number 1" />
<ListBoxItem Content="Item Number 2" />
<ListBoxItem Content="Item Number 3" />
<ListBoxItem Content="Item Number 4" />
</ListBox>
</Popup>Como podemos ver, el código anterior simplemente define un objeto Popup llamado ContextMenuPopup de 364 píxels de altura y 389 de ancho. Dentro definimos un ListBox que contendrá los items de nuestro menú. En este caso cargaremos 4 items.
Este Popup por defecto será invisible en la iterfaz de usuario. Ahora veremos como mostrarlo en el evento click de un item que hemos definido en la ApplicationBar:
private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
ContextMenuPopup.IsOpen = true;
}Como vemos es muy simple hacer visible nuestro Popup. De igual manera se puede hacer invisible:
ContextMenuPopup.IsOpen = false;En nuestra aplicación haremos invisible el Popup al hacer click en uno de sus items y seguidamente cargaremos una página diferente.
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ContextMenuPopup.IsOpen = false;
var sel = ((ListBox)ContextMenuPopup.Child).SelectedItem;
switch (((ListBoxItem)sel).Content.ToString())
{
case "Item Number 1":
NavigationService.Navigate(new Uri("/Pages/Page1.xaml", UriKind.Relative));
break;
case "Item Number 2":
NavigationService.Navigate(new Uri("/Pages/Page1.xaml", UriKind.Relative));
break;
case "Item Number 3":
NavigationService.Navigate(new Uri("/Pages/Page1.xaml", UriKind.Relative));
break;
case "Item Number 4":
NavigationService.Navigate(new Uri("/Pages/Page1.xaml", UriKind.Relative));
break;
}
}Es una aplicación muy simple pero que espero os sirva para entender mejor este control.
Aquí os podéis descargar el código:
Archivo: PopupControl.zip
Y que mejor que escuchar canciones potentes como esta mientras programas, ahí os dejo la coletilla:
Algunos tutoriales de Windows Phone 7 (Parte 2)
Seguimos con la serie de artículos y tutoriales de Windows Phone 7 con los que me voy topando:
1. Como usar la API de Youtube con Windows Phone 7 (MicrosoftFeed, inglés)
2. Aplicación con Mapas Bing en WP7 (Earthware.co.uk, inglés)
3. Creando un TextBox con scroll en WP7 (Alex Yakhnin’s Blog, inglés)
4. Comprobando si hay conexión en WP7 (Jesse Liberty, inglés)
5. Google Maps para Windows Phone usando Bing Maps (Codeproject, inglés)
6. Google Sky en Windows Phone 7 (ScottLogic, inglés)
7. Trucos MVP para Windows Phone 7 (The Microsoft MVP Award Program Blog, inglés)
8. Crear Splash Screen con Progress Bar en WP7 (Alex Yakhnin’s Blog, inglés)
9. Usando ChildWindows en WP7 (Shawn Wildermuth, inglés)
10. Trabajando con el almacenamiento aislado (Windows Phone Blog, castellano)
Espero que os sean de ayuda.
Y siguiendo con la extraña manía que tengo de recomendar canciones en mis posts de programación (no intentéis entenderlo), hoy os dejo este TEMAZO: Live Again de Sevendust.
Detectar si hay conexión de datos en WP7
En esta entrada explicaremos como detectar si existe conexión de datos en nuestra aplicación Windows Phone. Nos puede ser de mucha utilidad si queremos controlar errores en nuestra aplicación si es que esta utiliza acceso a la nube. La función es muy simple, detecta si hay conexión Wifi, 3G, etc. y devuelve el resultado.
Empezaremos añadiendo la referencia a System.Net.NetworkInformation.
using System.Net.NetworkInformation;Y esta sería nuestra función:
private bool InternetIsAvailable()
{
if (!NetworkInterface.GetIsNetworkAvailable())
{
MessageBox.Show("No tienes conexión de internet.");
return false;
}
else
{
MessageBox.Show("Tienes conexión de internet.");
return true;
}
}Un ejemplo de como se llama a la función desde el programa principal de la página.
public MainPage()
{
InitializeComponent();
if (InternetIsAvailable())
{
textBox1.Text = "Conectado a Internet";
}
else
{
textBox1.Text = "No Conectado a Internet";
}
}Aquí os podéis descargar el código:
Archivo: ConnectionTest.zip
Que menos que rematar este post con un tema de los que hacen época… Broken Wings de Alter Bridge. A disfrutar!
Uso del control ListBox en WP7
En este tutorial intentaremos explicar de una forma sencilla el a veces complejo uso del control ListBox en Windows Phone. A mi personalmente me ha parecido algo más lioso que en otros lenguajes pero trataré de resumirlo de manera que no lo parezaca.Lo primero que debemos hacer es añadir un control ListBox a nuestra aplicación arrastrándolo sobre la interfaz de nuestra página (PhoneApplicationPage). Tambien podemos escribir su código directamente en nuestro XAML. Nuestro ejemplo mostrará una lista de Empresas.
<ListBox Name="EnterprisesList" Margin="0,0,0,0">
</ListBox>Seguidamente crearemos una clase Empresa donde diseñaremos su estructura (atributos y funciones). Nuestra clase es muy simple,consta de 3 atributos: Nombre, Dirección y Actividad.
public class Enterprise
{
public String Name { get; set; }
public String Address { get; set; }
public String Activity { get; set }
public Enterprise(String name, String address, String activity)
{
this.Name = name;
this.Address = address;
this.Activity= activity;
}
}Finalmente el diseño XAML de nuestro ListBox quedaría de la siguiente manera. Hemos linkado los atributos de nuestra clase a los controles de cada item de la lista con la instrucción Binding seguida del nombre del atributo. En este código hemos implementado una plantilla para los items de nuestra lista compuesta de una imagen que definirá la actividad de la empresa, su nombre y dirección.
<ListBox Name="EnterprisesList" Margin="0,0,0,0">
<ListBox.ItemTemplate>
<DataTemplate>
<Button Width="460" Height="120">
<Button.Content>
<StackPanel Orientation="Horizontal" Width="400" Height="80">
<Image Source="{Binding Activity}" Width="80" Height="80"/>
<StackPanel Orientation="Vertical" Height="80">
<StackPanel Orientation="Horizontal" Height="40">
<TextBlock Width="100" FontSize="22" Text="Nombre:" Height="40"/>
<TextBlock Width="200" FontSize="22" Text="{Binding Name}" Height="40"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="40">
<TextBlock Width="100" FontSize="22" Text="Direccion:" Height="40"/>
<TextBlock Width="200" FontSize="22" Text="{Binding Address}" Height="40"/>
</StackPanel>
</StackPanel>
</StackPanel>
</Button.Content>
</Button>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>Finalmente escribiremos un código para probar nuestra aplicación. Es muy simple. En el main de la página cargaremos una serie de items de clase Empresa en una lista y después lo linkaremos a nuestro ListBox.
public MainPage()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MainPage_Loaded);
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
List<Enterprise> listaEmpresas = new List<Enterprise>();
for (int i = 0; i < 10; i++)
{
listaEmpresas.Add(new Enterprise("Empresa" + i, "Direccion" + i, "Telefonia"));
}
EnterprisesList.ItemsSource = listaEmpresas;
}El resultado sería este:
Aquí os podéis descargar el código:
Archivo: ControlListbox.zip
Y para no defraudar a mis lectores aquí pongo mi sello con una canción coj*** maravillosa, Dance with the Devil de Breaking Benjamin.
Carga de diferentes páginas en WP7 (Aplicación Multipágina)
Este post se ha escrito más a modo de ayuda para recién iniciados. Explicaremos como cargar diferentes páginas en nuestra aplicación WP7.
Para empezar haremos el ejemplo más sencillo que será cargar una segunda página desde la inicial cuando hagamos click en un botón. El código del evento del botón será algo así:
private void page2Button_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/PageTwo.xaml", UriKind.Relative));
}Donde page2Button será el nombre de nuestro botón y PageTwo.xaml será nuestra segunda página. También podremos pasarla parámetros a esta página de la siguiente manera:
private void page3Button_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/PageThree.xaml?info=" + infoTextBox.Text, UriKind.Relative));
}En este segundo ejemplo cargaremos una tercera página pero pasándole por parámetro la variable info, cuyo valor recogemos de un textbox. Para recoger el valor desde la página 3 lo haremos de la siguiente manera:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
string info = "";
if (NavigationContext.QueryString.TryGetValue("info", out info) ) {
infoTextBlockFromQuery.Text = info;
}
}Mi Manual de Windows Phone
Ultimos Posts
- Windows Phone Developer Tools 7.1 Beta
- Cambia el tema del emulador de Windows Phone
- Algunos tutoriales de Windows Phone 7 (Parte 3)
- Grabador de voz en Windows Phone
- Cambiar teclado de TextBox en WP7
- Sobre el diseño Metro para programadores de WP7
- Base de datos XML en Windows Phone 7
- Windows Phone 7 Isolated Storage Explorer
- Almacenamiento local de datos en Windows Phone
- Uso del control Popup en WP7
Windows Phone
Nuestras lecturas
Blankenblog
Libre y extremo
Windows Phone Blog













