may 27, 2011

Windows Phone Developer Tools 7.1 Beta

Recién salida del horno la nueva actualización de las herramientas de desarrollo para Windows Phone. Os dejo algunos links útiles para poder empezar a utilizar las nuevas funcionalidades:

  1. Descarga las herramientas de desarrollo.
  2. Documentación.
  3. Descarga los ejemplos.

Espero dentro de poco empezar a postear algunos ejemplos utilizando las nuevas funcionalidades tales como uso de la Base de Datos local.

Cambia el tema del emulador de Windows Phone

Os dejo un enlace para cambiar el tema de vuestro emulador de Windows Phone. Podréis emular vuestras aplicaciones en un nuevo tema con un móvil Samsung y de paso podréis aprender como crear vuestros propios temas para el emulador.

Acceder al artículo desde aquí (Jeff Wilcox Blog).

Espero que os sea de ayuda.

mar 31, 2011

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)

 

mar 31, 2011

Cambiar teclado de TextBox en WP7

Para cambiar el teclado que se abre al hacer click en un Control TextBox deberemos editar la propiedad InputScope del campo. Esto definirá el tipo de teclado que queremos abrir. Mostramos los tipos de teclado a escoger:

TelephoneNumber

Text

En este ejemplo de código XAML podemos observar como asignar el valor de InputScope a un TextBox.

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <TextBox Height="72" HorizontalAlignment="Left"  Margin="25,352,0,0" Name="CampoNumerico" Text="" VerticalAlignment="Top" Width="198" InputScope="TelephoneNumber"/>
</Grid>
mar 27, 2011

Sobre el diseño Metro para programadores de WP7

Metro es el nombre del nuevo lenguaje de diseño creado para interfaces Windows Phone 7. Se trata de un estilo limpio, simple pero que a mi personalmente me encanta. Minimalista y elegante. Para los desarrolladores de aplicaciones es una bendición que existan pautas de diseño ya que nos simplifican mucho las cosas, pero no es necesario seguirlas si no se quiere, evidentemente.

Para los que quieran aprender más sobre este tipo de diseño os dejo algunos links de pautas y recursos.

Jeff Wilcox Metro design guide

Windows Phone 7 Series UI Design and Interaction Guide

Metro Design Language for Windows Phone 7

 

mar 25, 2011

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!

mar 23, 2011

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:

 

mar 22, 2011

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:

mar 17, 2011

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:

Páginas:1234567...13»