Browsing articles in "Windows Phone"
mar 16, 2011

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.

mar 15, 2011

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!

 

mar 13, 2011

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.

 

mar 3, 2011

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;
    }
}

Acciones al iniciar y cerrar tu aplicación WP7

Siguiendo con los posts de programación con Windows Phone, explicaremos como crear el evento que se ejecuta cuando se inicia la aplicación y cuando ésta se cierra. Esto es muy útil cuando queremos que la aplicación realice ciertas acciones en esos momentos como por ejemplo cargar variables de un fichero.

Para crear estos eventos deberemos abrir nuestra página App.xaml. En ella deberemos añadir los eventos Startup y Exit como puedes ver a continuación:

<Application
    x:Class="wp702.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" Startup="Application_Startup" Exit="Application_Exit">
 
</Application>

El código que hemos añadido es:  Startup=”Application_Startup” Exit=”Application_Exit”. A continuación para definir los eventos haremos click derecho encima de cada uno de ellos y seleccionaremos Navigate to Event Handler. Se nos creará el siguiente código:

private void Application_Startup(object sender, StartupEventArgs e)
{
}
 
private void Application_Exit(object sender, EventArgs e)
{
}

Ya tenemos creados nuestros eventos donde podremos insertar el código que necesitemos. Os dejo un ejemplo de evento que crea el fichero datos.xml al iniciar la aplicación si éste no existe.

private void Application_Startup(object sender, StartupEventArgs e)
        {
            var store = IsolatedStorageFile.GetUserStoreForApplication();
 
            if (store.FileExists("data.xml") == false)
            {
                IsolatedStorageFileStream rootFile = store.CreateFile("data.xml");
                rootFile.Close();
                try
                {
                    using (StreamWriter sw = new StreamWriter(store.OpenFile("data.xml", FileMode.Open, FileAccess.Write)))
                    {
                        sw.WriteLine(@"<?xml version=""1.0"" encoding=""utf-8""?>");
                        sw.WriteLine("<root></root>");
                    }
                }
                catch { }
            }
        }

 

Espero haberos sido de ayuda.

 

feb 25, 2011

Tutorial de programación para Windows Phone

Como ahora me ha dado por aprender a programar aplicaciones para Windows Phone he estado buscando mucha información sobre el tema. Os dejo un link a un tutorial muy completo en PDF que he encontrado por ahí, me ha parecido muy didáctico e imprescindible ya que la información acerca de este entorno no es que sobre precisamente. A algunos les decepcionará el que esté en inglés pero que se le va a hacer… no pienso ponerme a traducirlo…

Programming Windows Phone 7

feb 25, 2011

Acceso a datos desde WP7 a tablas MySQL

 

Supongo que empiezo la casa por el tejado pero mi primer post sobre desarrollo para Windows Phone 7 va a estar dedicado a la captura de datos de MySQL. El ejemplo que voy a implementar os ayudará a capturar datos desde vuestra aplicación WP7 de una Base de Datos MySQL que tengáis accesible en vuestro servidor.

La verdad es que este tema me ha generado bastantes dolores de cabeza y la auséncia de información en Internet me ha llevado a resumiros el procedimiento que he seguido. Espero que os sea de ayuda. Empezamos:

Bien, el primer concepto que debemos tener en cuenta es que no se puede acceder directamente desde vuestra aplicación de WP7 a las tablas MySQL, o eso es lo que he deducido después de buscar información. Necesitaremos crear un servicio WCF que resumiendo torpemente, es la aplicación puente que utilizaremos para acceder a datos externos alojados en la nube. En esta aplicación implementaremos todas las funciones necesárias para recoger o insertar y las llamaremos más tarde desde nuestra aplicación WP7.

El primer paso será crear un proyecto tipo WCF Service Application. Seguidamente descargaremos el Connector MySQL para .NET desde aquí. Después de instalar el fichero descargado tendremos que añadir la referencia a nuestra aplicación WCF de la DLL MySql.Data.dll que se encuentra en mi caso en la ruta C:\Program Files\MySQL\MySQL Connector Net 6.2.4\Assemblies\.

Ahora ya podemos añadir las referencias a la librería en el fichero Service1.svc.cs.

using System.Data;
using System.Data.Sql;
using System.Data.OleDb;
using MySql.Data.MySqlClient;

Ahora imeplementaré una función que devolverá un valor de la Base de Datos MySQL recibiendo como parámetro un filtro.

namespace WcfService1
{
 
    public class Service1 : IService1
    {
 
        MySqlConnection myConn;
        string a;
 
        public string GetData(int value)
        {
            myConn = new MySqlConnection("user id=usuario; password=contraseña; database=basededatos; server=ipservidor");
            myConn.Open();
            string[] myList = new string[10];
            string strSQL = "SELECT * FROM EMPRESAS WHERE ID_EMPRESA="+value;
 
            MySqlCommand mysqlCmd = new MySqlCommand(strSQL, myConn);
            MySqlDataReader mysqlReader = mysqlCmd.ExecuteReader();
 
            int i = 0;
            while (mysqlReader.Read())
            {
 
                if (mysqlReader.GetString(1).ToString() != null)
                {
                    a = mysqlReader.GetString(1).ToString();
                    //myList = mysqlReader.GetString(0).ToString();
                }
                else
                {
                    a = null;
                }
                i++;
 
            }
            myConn.Close();
 
            return string.Format(a);
        }
    }
}

Esta función devuelve el nombre de una empresa pasándole como parámetro su ID.  Es una función chorras pero me sirve para el propósito de este post.


Lo siguiente que haremos será vincular el servicio WCF a una aplicación WP7.

Desde nuestro proyecto WCF si hacemos click derecho encima del proyecto tenemos la opción View in Browser (Ver en navegador), aceptamos y se nos abrirá una página web, copiamos la dirección al clipboard.

Creamos un proyecto tipo Windows Phone Application y iremos a Add Service Reference, solo deberemos pegar la dirección web que habíamos copiado anteriormente y ya tendremos vinculado nuestro servicio web.

Como ejemplo he añadido a la aplicación un boón y una área de texto. En el evento click del boón le pasaremos un parámetro id de empresa al web service y el nombre de empresa que devuelve lo pondremos en el campo de texto de la aplicación móvil.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
 
using WindowsPhoneApplication4.ServiceReference1;
 
namespace WindowsPhoneApplication4
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Service1Client client = new Service1Client();
            client.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(client_GetDataCompleted);
            client.GetDataAsync(5, client);
        }
 
        void client_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
        {
            Service1Client client = e.UserState as Service1Client;
            client.GetDataCompleted -= client_GetDataCompleted;
 
            if (e.Error != null)
            {
                //TODO: Gestionar el error
                return;
            }
 
            string getDataResult = e.Result;
            //getDataResult = "You entered: 5";
            textBox1.Text = e.Result;
        }
 
    }
}

Ya solo queda probar nuestra aplicación. Así de cutre y así de complicado se me ha hecho encontrar este método. Espero haberos sido de ayuda.

 

**** Actualización 08/04/11 ****

Se ha añadido el código de la aplicación de test de este capítulo. Podréis observar que lo he variado un poco pero es prácticamente el mismo. Además se han añadido algunas capturas de pantalla nuevas para hacer más comprensible el método.

Archivo: MySQLConnection-1.0.zip (Versión 1.0)

 

**** Actualización 10/05/11 ****

Consulta que devuelve más de un valor

En esta segunda revisión del ejemplo se han añadido las funciones para capturar múltiples valores de un registro de la Base de Datos MySQL.  En este ejemplo os muestro como quedaría la función en nuestro servicio WCF.

public List<Models.Empresa> DatosEmpresa2(int idEmpresa)
        {
            List<Models.Empresa> ListaEmpresas = new List<Models.Empresa>();
 
            myConn = new MySqlConnection(Models.Config.ConnectionString);
            myConn.Open();
 
            string Sql = "SELECT * FROM EMPRESAS WHERE ID_EMPRESA=" + idEmpresa;
 
            MySqlCommand mysqlCmd = new MySqlCommand(Sql, myConn);
            MySqlDataReader mysqlReader = mysqlCmd.ExecuteReader();
 
            //int i = 0;
            while (mysqlReader.Read())
            {
                if (mysqlReader.GetString(1).ToString() != null)
                {
                    Models.Empresa Item = new Models.Empresa();
                    Item.Id = Convert.ToInt32(mysqlReader.GetString("ID_EMPRESA").ToString());
                    Item.Nombre = mysqlReader.GetString("NOMBRE").ToString();
                    Item.Actividad = mysqlReader.GetString("ACTIVIDAD").ToString();
                    Item.Contacto = mysqlReader.GetString("CONTACTO").ToString();
                    Item.Zona = mysqlReader.GetString("ZONA").ToString();
 
                    ListaEmpresas.Add(Item);
                }
                //i++;
            }
            myConn.Close();
            return ListaEmpresas;
        }

Archivo: MySQLConnection-2.0.zip (Versión 2.0)

 

**** Actualización 20/05/11 ****

Consulta de inserción (INSERT)

Aprovecho para colgar una función de inserción en la Base de Datos. Es una función de ejemplo muy simple pero quizá os pueda servir para vuestros propósitos.

public void InsertItem(string Nombre, string Actividad, string Contacto)
        {
            myConn = new MySqlConnection(Models.Config.ConnectionString);
            myConn.Open();
 
            String Sql = "INSERT INTO EMPRESAS (NOMBRE, ACTIVIDAD, CONTACTO) VALUES ( " +
                "'" + Nombre + "', '" + Actividad + "', '" + Contacto + "')";
 
            MySqlCommand mysqlCmd = new MySqlCommand(Sql, myConn);
            mysqlCmd.ExecuteNonQuery();
        }

Y este sería el código de la aplicación WP7 que llama a la función de insertar. Está testeado y a mi personalmente me ha funcionado. Es un código muy simple, mediante el evento de un botón se inserta en la BBDD MySQL el valor de 3 campos de texto.

private void InsertButton_Click(object sender, RoutedEventArgs e)
        {
            Service1Client client = new Service1Client();
 
            client.InsertItemAsync(textBox3.Text, textBox4.Text, textBox5.Text);
 
        }

Actualizo el fichero con el código testeado.

Archivo: MySQLConnection-3.0.zip

PD: El proyecto WCF no podréis crearlo sin la plantilla del proyecto instalada y la mala notícia es que no viene con Windows Phone Toolkit. Necesitaréis descargarla o tener el Visual Studio completo.

 

Páginas:«12