Desarrollando una aplicación en Windows Phone – Parte 2

Este post corresponde a la explicación del código fuente de la aplicación que se menciona en la parte 1.

El XAML es un código que se deriva del lenguaje XML y para las aplicaciones de Silverlight al igual que para los proyectos de tipo WPF, se utiliza para definir la interfaz gráfica de la aplicación, para el caso de la aplicación que estamos desarrollando, mi código XAML es el siguiente:

<phone:phoneapplicationpage d:designheight="768" d:designwidth="480" fontfamily="{StaticResource PhoneFontFamilyNormal}" fontsize="{StaticResource PhoneFontSizeNormal}" foreground="{StaticResource PhoneForegroundBrush}" loaded="PhoneApplicationPage_Loaded" mc:ignorable="d" orientation="Portrait" shell:systemtray.isvisible="True" supportedorientations="Portrait" x:class="TipoDeCambioCR.MainPage" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
 
     
    <grid background="Transparent" x:name="LayoutRoot">
        <grid.rowdefinitions>
            <rowdefinition height="Auto">
            <rowdefinition height="*">
        </rowdefinition></rowdefinition></grid.rowdefinitions>
 
         
        <stackpanel grid.row="0" margin="12,17,0,28" x:name="TitlePanel">
            <textblock text="Tipo de cambio del dólar en Costa Rica" x:name="ApplicationTitle">
            <textblock fontsize="56" margin="9,-7,0,0" text="USD $ -> ₡ CRC" x:name="PageTitle">
        </textblock></textblock></stackpanel>
 
         
        <grid grid.row="1" margin="12,0,12,0" x:name="ContentPanel">
            <textblock fontsize="28" height="43" horizontalalignment="Left" margin="30,60,0,0" name="lbl_compra" text="Compra:" verticalalignment="Top" width="115">
            <textblock fontsize="28" height="43" horizontalalignment="Left" margin="30,160,0,0" name="lbl_venta" text="Venta:" verticalalignment="Top" width="115">
            <button click="btn_refresh_Click" content="Actualizar" fontsize="28" height="75" horizontalalignment="Center" name="btn_refresh" verticalalignment="Center" width="430">
            <textblock fontsize="28" height="45" horizontalalignment="Right" margin="160,60,30,0" name="txt_compra" verticalalignment="Top" width="250">
            <textblock fontsize="28" height="45" horizontalalignment="Right" margin="160,160,30,0" name="txt_venta" verticalalignment="Top" width="250">
            <textblock fontsize="18" height="30" horizontalalignment="Right" margin="0,0,0,0" name="lbl_date" textalignment="Right" verticalalignment="Bottom" width="190">
            <textblock fontsize="18" height="30" horizontalalignment="Left" margin="0,0,0,0" name="lbl_source" text="Banco Central de Costa Rica" verticalalignment="Bottom" width="255">
            </textblock></textblock></textblock></textblock></button><button click="btn_about_Click" content="Acerca de la aplicación" fontsize="28" height="75" horizontalalignment="Center" margin="0,280,0,0" name="btn_about" verticalalignment="Center" width="430">
        </button></textblock></textblock></grid>
    </grid>
</phone:phoneapplicationpage>

Una vez que tenemos listo nuestro código XAML, podemos crear la referencia del servicio que vamos a consumir, para esto necesitaremos hacer clic derecho en el proyecto y luego clic en agregar referencia de servicio, en la ventana que se nos muestra en pantalla ingresamos la URL del servicio:
http://indicadoreseconomicos.bccr.fi.cr/indicadoreseconomicos/WebServices/wsIndicadoresEconomicos.asmx

Y luego nombramos el namespace para el servicio que vamos a utilizar, en mi caso es WSTipoCambio, como se muestra en la siguiente imagen:

Una vez que tenemos creada la referencia podemos seguir con el código fuente de la aplicación, sin embargo, es necesario importar las siguientes clases:

using TipoDeCambioCR.WSTipoCambio;
using System.Xml.Linq;
using System.Net.NetworkInformation;

Cabe mencionar que el nombre que le he dado a mi proyecto es TipoDeCambioCR, es importante tomarlo en cuenta a la hora de importar el namespace que creamos en la referencia de servicio.

A continuación tenemos el código fuente:

namespace TipoDeCambioCR
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }
        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            getDate();
            getResults();
        }
 
        private void btn_refresh_Click(object sender, RoutedEventArgs e)
        {
            getDate();
            getResults();
        }
 
        private void getDate()
        {
            try
            {
                String date_time = String.Format("{0:d/M/yyyy h:mm tt}", DateTime.Now);
                lbl_date.Text = date_time;
            }
            catch (Exception)
            {
                MessageBox.Show("La aplicación ha detectado un problema a la hora de obtener la fecha y hora. Por favor, verifique la configuración del dispositivo."); //En caso de error al realizar la consulta de la fecha y hora, se muestra un problema de conexión
            }
        }
 
        private void getResults()
        {
            if (NetworkInterface.GetIsNetworkAvailable() == true)
            {
                try
                {
                    txt_compra.Text = "Cargando...";
                    txt_venta.Text = "Cargando...";
                    String date = String.Format("{0:d/M/yyyy}", DateTime.Now); //Formato de fecha requerido por el servicio web.
 
                    wsIndicadoresEconomicosSoapClient compra = new wsIndicadoresEconomicosSoapClient(); //Se crea un cliente para el indicador de tipo de cambio de compra
 
                    compra.ObtenerIndicadoresEconomicosXMLCompleted += new EventHandler< obtenerindicadoreseconomicosxmlcompletedeventargs >(compra_ObtenerIndicadoresEconomicosXMLCompleted);
 
                    compra.ObtenerIndicadoresEconomicosXMLAsync("317", date, date, "Windows Phone", "N"); //Se realiza una sincronización asincrónica con los parámetros requeridos para el indicador de compra
 
                    wsIndicadoresEconomicosSoapClient venta = new wsIndicadoresEconomicosSoapClient(); //Se crea un cliente para el indicador de tipo de cambio de venta
 
                    venta.ObtenerIndicadoresEconomicosXMLCompleted += new EventHandler< obtenerindicadoreseconomicosxmlcompletedeventargs >(venta_ObtenerIndicadoresEconomicosXMLCompleted);
 
                    venta.ObtenerIndicadoresEconomicosXMLAsync("318", date, date, "Windows Phone", "N");//Se realiza una sincronización asincrónica con los parámetros requeridos para el indicador de venta
                }
                catch (Exception e)
                {
                    MessageBox.Show("La aplicación ha detectado un error durante la ejecucción."); //En caso de error al realizar la sincronización, se muestra un problema de conexión
                }
            }
            else
            {
                MessageBox.Show("La aplicación ha detectado que no hay una conexión de datos disponible. Por favor, verifique la conexión del dispositivo.");
                txt_compra.Text = "Sin conexión";
                txt_venta.Text = "Sin conexión";
            }
        }
 
        void venta_ObtenerIndicadoresEconomicosXMLCompleted(object sender, ObtenerIndicadoresEconomicosXMLCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                XDocument xdoc = XDocument.Parse(e.Result); //Se convierte a un archivo XDocument el resultado obtenido de venta
 
                string resultado = xdoc.Descendants("INGC011_CAT_INDICADORECONOMIC").Descendants("NUM_VALOR").FirstOrDefault().Value; //Se accede al resultado atravez del Xdocument
 
                txt_venta.Text = "₡" + resultado.Remove(5); //Se imprime el resultado en pantalla con la función de remover todos los valores luego del separador y el primer decimal
            }
        }
 
        void compra_ObtenerIndicadoresEconomicosXMLCompleted(object sender,  ObtenerIndicadoresEconomicosXMLCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                XDocument xdoc = XDocument.Parse(e.Result);//Se convierte a un archivo XDocument el resultado obtenido de compra
 
                string resultado = xdoc.Descendants("INGC011_CAT_INDICADORECONOMIC").Descendants("NUM_VALOR").FirstOrDefault().Value;//Se accede al resultado atravez del Xdocument
 
                txt_compra.Text = "₡" + resultado.Remove(5);//Se imprime el resultado en pantalla con la función de remover todos los valores luego del separador y el primer decimal
            }
        }
 
        private void btn_about_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Versión del producto: 1.0\nDesarrollado por: David Sánchez Aguilar\nSan Jose, Costa Rica", "Acerca de la aplicación", MessageBoxButton.OK);
        }
    }
}

Si deseas descargar la fuente del proyecto puedes seguir este link

Si únicamente deseas el archivo XAP de la aplicación puedes descargarlo de acá

David Sánchez Aguilar, consultor enfocado en tecnologías Microsoft. Cuenta con varias certificaciones como MCP, MCT, MCSD, MCITP, MCTS y Microsoft Specialist. Es graduado de la carrera de Ingeniería en Sistemas Computacionales y actualmente cursa la Maestría de Administración de Tecnologías de la Información (MATI). Cuenta con más de siete años de experiencia trabajando con plataformas de colaboración. Ha participado en distintos proyectos para Latinoamérica y Norteamérica con tecnologías como SharePoint, Office 365, Microsoft Azure, Team Foundation, SQL Server, System Center y también soluciones de desarrollo basadas en .NET Framework y HTML5. Adicionalmente, es instructor certificado de Microsoft.

Publicado en Windows Phone
2 comments on “Desarrollando una aplicación en Windows Phone – Parte 2
  1. Buenas noches David muchas gracias por el aporte, quería comentarte que estoy trabajando con el código para montarlo en ASP.net, pero estoy teniendo un problema el cual no se como solucionar en donde me gustaría ver la posibilidad de que me puedas ayudar, sucede que el código esta sin errores y levanta la pagina de lo mas bien, pero a la hora de realizar la consulta no me trae datos de vuelta, lo trate de hacer paso a paso mediante el depurador y al parecer las variables si se cargan bien, este seria el código, de antemano muchas gracias.

    private void obtenerResultado()
    {

    try
    {
    txtCompra.Text = “Cargando…”;
    txtVenta.Text = “Cargando…”;
    string fecha = txtFecha.Text;

    wsIndicadoresEconomicos compra = new wsIndicadoresEconomicos();

    compra.ObtenerIndicadoresEconomicosXMLCompleted +=new ObtenerIndicadoresEconomicosXMLCompletedEventHandler(compra_ObtenerIndicadoresEconomicosXMLCompleted);

    compra.ObtenerIndicadoresEconomicosXML(“317”, fecha, fecha, “proyecto”, “N”);

    wsIndicadoresEconomicos venta = new wsIndicadoresEconomicos();

    venta.ObtenerIndicadoresEconomicosXMLCompleted +=new ObtenerIndicadoresEconomicosXMLCompletedEventHandler(venta_ObtenerIndicadoresEconomicosXMLCompleted);

    venta.ObtenerIndicadoresEconomicosXML(“318”, fecha, fecha, “Proyecto”, “N”);
    }
    catch (Exception ex)
    {
    txtError.Text = ex.Message;
    }

    }

    void venta_ObtenerIndicadoresEconomicosXMLCompleted(object sender,
    ObtenerIndicadoresEconomicosXMLCompletedEventArgs e)
    {
    if (e.Error == null )
    {
    XDocument xdoc = XDocument.Parse(e.Result);
    string resultado = xdoc.Descendants(“INGC011_CAT_INDICADORECONOMIC”).Descendants(“NUM_VALOR”).FirstOrDefault().Value;
    txtVenta.Text = “₡” + resultado.Remove(5);
    }
    }

    void compra_ObtenerIndicadoresEconomicosXMLCompleted(object sender, ObtenerIndicadoresEconomicosXMLCompletedEventArgs e)
    {

    if (e.Error == null)
    {

    XDocument xdoc = XDocument.Parse(e.Result);
    string resultado = xdoc.Descendants(“INGC011_CAT_INDICADORECONOMIC”).Descendants(“NUM_VALOR”).FirstOrDefault().Value;
    txtCompra.Text = “₡” + resultado.Remove(5);
    }
    }

    Me gusta

  2. Muchas gracias por el blog me es de mucha utilidad, con el codigo presentado se me presenta los siguientes errores, los cuales no sé como resolver, por lo que si me puedes dar una ayuda te lo agradezco.

    Error 1 No se puede convertir implícitamente el tipo ‘System.EventHandler’ en ‘proyecto.WsTipoCambio.ObtenerIndicadoresEconomicosXMLCompletedEventHandler’

    Error 2 No se puede convertir implícitamente el tipo ‘System.EventHandler’ en ‘proyecto.WsTipoCambio.ObtenerIndicadoresEconomicosXMLCompletedEventHandler’

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Microsoft MVP
Microsoft Most Valuable Professional
Certificaciones
Certificaciones

Haz clic para seguir este blog y recibir notificaciones de nuevos mensajes por correo electrónico.

Únete a otros 1.346 seguidores

Visitantes
Follow me on Twitter
Visitas
  • 31,034 en total.