<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Un informático en construcción</title>
	<atom:link href="http://labloguera.net/cesar/feed/" rel="self" type="application/rss+xml" />
	<link>http://labloguera.net/cesar</link>
	<description></description>
	<lastBuildDate>Thu, 02 Feb 2012 03:19:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>[WP7] Usando los servicios de Live</title>
		<link>http://labloguera.net/cesar/2012/02/02/wp7-usando-los-servicios-de-live/</link>
		<comments>http://labloguera.net/cesar/2012/02/02/wp7-usando-los-servicios-de-live/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 00:20:22 +0000</pubDate>
		<dc:creator>cesar</dc:creator>
				<category><![CDATA[Sin categoría]]></category>
		<category><![CDATA[smartphones]]></category>
		<category><![CDATA[windows phone 7]]></category>
		<category><![CDATA[wp7]]></category>

		<guid isPermaLink="false">http://labloguera.net/cesar/?p=307</guid>
		<description><![CDATA[Preparando una idea para un juego que tengo entre manos se me ha ocurrido que podría intentar conectar con los servicios que ofrece Live para ofrecer una experiencia mas social en el juego a parte de lo que es el propio juego. El SDK de Live nos permite hacer uso de Skydrive, los contactos y el [...]]]></description>
			<content:encoded><![CDATA[<p>Preparando una idea para un juego que tengo entre manos se me ha ocurrido que podría intentar conectar con los servicios que ofrece Live para ofrecer una experiencia mas social en el juego a parte de lo que es el propio juego.</p>
<p>El SDK de Live nos permite hacer uso de Skydrive, los contactos y el calendario de Hotmail, podemos hacer uso del chat de Messenger y por supuesto autenticarnos en Live y acceder a algunos datos de nuestro perfil.</p>
<p>Bueno pues es esto último lo que voy a mostrar y posteriormente iré mostrando como hacer uso de los demás servicios. Para empezar vamos a descargar e instalar el SDK de Live a través de este <a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=28195" target="_blank">link</a> .</p>
<p align="center"><a href="http://labloguera.net/cesar/files/2012/02/cap1.png"><img style="padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap1_thumb.png" alt="cap1" width="427" height="337" border="0" /></a></p>
<p>Una vez instalado abrimos Visual Studio y creamos un proyecto de Silverlight para Windows Phone y lo primero que tenemos que hacer es agregar las referencias a nuestro proyecto de <strong>Microsoft.Live</strong> y <strong>Microsoft.Live.Controls</strong> y añadir al ToolBox el componente que nos autentica en el servicio.</p>
<p align="center"><a href="http://labloguera.net/cesar/files/2012/02/cap2.png"><img style="padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap2_thumb.png" alt="cap2" width="427" height="305" border="0" /></a></p>
<p align="center"><a href="http://labloguera.net/cesar/files/2012/02/cap3.png"><img style="padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap3_thumb.png" alt="cap3" width="427" height="307" border="0" /></a></p>
<p>Antes de seguir construyendo el programa necesitamos un identificador para que la aplicación pueda acceder al servicio de Live, para eso vamos a ir al gestor de aplicaciones de <a href="https://manage.dev.live.com" target="_blank">Live Connect</a>, donde tenemos que registrar el nombre de la aplicación, el idioma y si la aplicación que accede es movil o no. A cambio de esto obtenemos un identificador de cliente y un codigo secreto de cliente.</p>
<p align="center"><a href="http://labloguera.net/cesar/files/2012/02/cap5.png"><img style="padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap5_thumb.png" alt="cap5" width="427" height="216" border="0" /></a></p>
<p align="center"><a href="http://labloguera.net/cesar/files/2012/02/cap6.png"><img style="padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap6_thumb.png" alt="cap6" width="427" height="223" border="0" /></a></p>
<p align="justify">Ahora ya podemos añadir el componente que hemos agregado a la caja de herramientas, este componente simplifica la conexión con el servicio Connect de Live:</p>
<p align="center"><a href="http://labloguera.net/cesar/files/2012/02/cap4.png"><img style="padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap4_thumb.png" alt="cap4" width="427" height="272" border="0" /></a></p>
<p>A continuación rellenamos el <strong>Client ID</strong> que hemos obtenido de registrar la aplicación en Live:</p>
<p align="center"><a href="http://labloguera.net/cesar/files/2012/02/cap8.png"><img style="padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap8_thumb.png" alt="cap8" width="293" height="449" border="0" /></a></p>
<p>Podemos personalizar más cosas, una de ellas, la propiedad <strong>Scopes</strong>, esta propiedad nos permite definir el nivel de los permisos de acceso a nuestros datos que va a tener la aplicación.</p>
<p>Existen varios tipos de permisos según el servicio de Live que queramos utilizar pero como de momento estamos probando la autenticación y el acceso a los datos de nuestro perfil solamente tenemos que fijarnos en tres que son comunes a todos los servicios:</p>
<ul>
<li><strong>wl.basic</strong>:  este permiso nos da acceso a los datos del usuario y también a su lista de contactos.</li>
<li><strong>wl.offline_access</strong>: como el anterior nos da acceso a la lectura y actualización de los datos del usuario. Si no lo usamos tenemos que iniciar sesión.</li>
<li><strong>wl.signin</strong>: inicio de sesión único, los usuarios quedan conectados para todos los servicios.</li>
</ul>
<p>El que yo he utilizado es el básico como podéis ver en la imagen de arriba, es mas que suficiente para poder acceder a los datos del usuario.</p>
<p>Bueno pues ya solo queda construir la interfaz, es simplemente el botón de logueo y un par de textblocks para mostrar que estas conectando y otro para enseñar la info del usuario, quedaría de la siguiente manera:</p>
<p><a href="http://labloguera.net/cesar/files/2012/02/cap9.png"><img class="aligncenter" style="padding-left: 0px;padding-right: 0px;float: none;margin-left: auto;margin-right: auto;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap9_thumb.png" alt="cap9" width="333" height="538" border="0" /></a></p>
<p align="left">El código en XAML sería el siguiente:</p>
<div class="wlWriterEditableSmartContent" style="margin: 0px;float: none;padding: 0px">
<pre class="brush: xml; auto-links: false; title: ; notranslate">
&lt;phone:PhoneApplicationPage
    x:Class=&quot;DemoLive1.MainPage&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
    xmlns:phone=&quot;clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone&quot;
    xmlns:shell=&quot;clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone&quot;
    xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
    xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
    mc:Ignorable=&quot;d&quot; d:DesignWidth=&quot;480&quot; d:DesignHeight=&quot;768&quot;
    FontFamily=&quot;{StaticResource PhoneFontFamilyNormal}&quot;
    FontSize=&quot;{StaticResource PhoneFontSizeNormal}&quot;
    Foreground=&quot;{StaticResource PhoneForegroundBrush}&quot;
    SupportedOrientations=&quot;Portrait&quot; Orientation=&quot;Portrait&quot;
    shell:SystemTray.IsVisible=&quot;True&quot; xmlns:my=&quot;clr-namespace:Microsoft.Live.Controls;assembly=Microsoft.Live.Controls&quot;&gt;

    &lt;!--LayoutRoot is the root grid where all page content is placed--&gt;
    &lt;Grid x:Name=&quot;LayoutRoot&quot; Background=&quot;Transparent&quot;&gt;
        &lt;Grid.RowDefinitions&gt;
            &lt;RowDefinition Height=&quot;Auto&quot;/&gt;
            &lt;RowDefinition Height=&quot;*&quot;/&gt;
        &lt;/Grid.RowDefinitions&gt;

        &lt;!--TitlePanel contains the name of the application and page title--&gt;
        &lt;StackPanel x:Name=&quot;TitlePanel&quot; Grid.Row=&quot;0&quot; Margin=&quot;12,17,0,28&quot;&gt;
            &lt;TextBlock x:Name=&quot;ApplicationTitle&quot; Text=&quot;Conectando con los servicios de Live&quot; Style=&quot;{StaticResource PhoneTextNormalStyle}&quot;/&gt;
            &lt;TextBlock x:Name=&quot;PageTitle&quot; Text=&quot;DemoLive&quot; Margin=&quot;9,-7,0,0&quot; Style=&quot;{StaticResource PhoneTextTitle1Style}&quot;/&gt;
        &lt;/StackPanel&gt;

        &lt;!--ContentPanel - place additional content here--&gt;
        &lt;StackPanel x:Name=&quot;ContentPanel&quot; Grid.Row=&quot;1&quot; Margin=&quot;12,0,12,0&quot;&gt;
            &lt;my:SignInButton Content=&quot;Button&quot; Height=&quot;113&quot; HorizontalAlignment=&quot;Left&quot; Margin=&quot;102,29,0,0&quot; Name=&quot;signInButton1&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;264&quot; TextType=&quot;SignIn&quot; ClientId=&quot;000000004C07BBAD&quot; Scopes=&quot;wl.basic&quot; SessionChanged=&quot;signInButton1_SessionChanged&quot; /&gt;
            &lt;TextBlock Height=&quot;30&quot; Name=&quot;txtStatus&quot; Text=&quot;&quot; Width=&quot;397&quot; TextAlignment=&quot;Center&quot; /&gt;
            &lt;TextBlock Height=&quot;Auto&quot; HorizontalAlignment=&quot;Left&quot; Name=&quot;txtInfo&quot; Text=&quot;TextBlock&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;438&quot; TextWrapping=&quot;Wrap&quot; Visibility=&quot;Collapsed&quot; /&gt;
        &lt;/StackPanel&gt;
    &lt;/Grid&gt;
&lt;/phone:PhoneApplicationPage&gt;
</pre>
</div>
<p align="left">En la parte de código, en la clase MainPage.xaml.cs vamos a utilizar dos objetos LiveConnectClient y LiveConnectSession, el primero para obtener los datos del usuario y el segundo para determinar si hemos conectado correctamente con el servicio de Live.</p>
<div class="wlWriterEditableSmartContent" style="margin: 0px;float: none;padding: 0px">
<pre class="brush: csharp; auto-links: false; title: ; notranslate">
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 Microsoft.Live;
using Microsoft.Live.Controls;

namespace DemoLive1
{
    public partial class MainPage : PhoneApplicationPage
    {

        private LiveConnectClient client;
        private LiveConnectSession session;

        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }

        private void signInButton1_SessionChanged(object sender, LiveConnectSessionChangedEventArgs e)
        {
            if (e.Status == LiveConnectSessionStatus.Connected)
            {
                session = e.Session;
                client = new LiveConnectClient(session);
                txtStatus.Text = &quot;Obteniendo información...&quot;;
                client.GetCompleted += new EventHandler&lt;LiveOperationCompletedEventArgs&gt;(client_GetCompleted);
                client.GetAsync(&quot;me&quot;);
            }
            else
            {
                txtStatus.Text = &quot;No estás conectado!!&quot;;
                client = null;
            }
        }

        void client_GetCompleted(object sender, LiveOperationCompletedEventArgs e)
        {
            ocultarControles();
            txtInfo.Text = e.RawResult.ToString();
            txtInfo.Visibility = System.Windows.Visibility.Visible;
        }

        private void ocultarControles()
        {
            txtStatus.Visibility = System.Windows.Visibility.Collapsed;
            signInButton1.Visibility = System.Windows.Visibility.Collapsed;
        }
    }
}
</pre>
</div>
<p align="left">En el evento <strong>Session_Changed</strong> comprobamos si esta conectado o no. En el caso de estar conectado mostramos un mensaje indicando que es esta obteniendo la información, una vez esté descargada ocultamos los botones de conexión y el mensaje anterior para mostrar solamente los datos del usuario.</p>
<p align="center"> <a href="http://labloguera.net/cesar/files/2012/02/cap91.png"><img style="padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap91_thumb.png" alt="cap91" width="134" height="244" border="0" /></a>     <a href="http://labloguera.net/cesar/files/2012/02/cap92.png"><img style="margin: 0px;padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap92_thumb.png" alt="cap92" width="132" height="244" border="0" /></a></p>
<p align="center"><a href="http://labloguera.net/cesar/files/2012/02/cap93.png"><img style="margin: 0px;padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap93_thumb.png" alt="cap93" width="133" height="244" border="0" /></a>     <a href="http://labloguera.net/cesar/files/2012/02/cap94.png"><img style="padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://labloguera.net/cesar/files/2012/02/cap94_thumb.png" alt="cap94" width="132" height="244" border="0" /></a></p>
<p align="left">Como podéis ver es bastante sencillo conectarse a Live y obtener los datos del usuario.</p>
<p align="left">Espero que os sirva, os dejo el <a href="https://skydrive.live.com/redir.aspx?cid=bce19a4c8804f321&amp;resid=BCE19A4C8804F321!117&amp;parid=BCE19A4C8804F321!115" target="_blank">código de ejemplo aquí </a>para que podáis ejecutarlo (debéis rellenar el ClientID). En el próximo post veremos ya como hacer uso de alguno de los otros servicios que nos ofrece Live.</p>
<p align="left">Un saludo</p>
]]></content:encoded>
			<wfw:commentRss>http://labloguera.net/cesar/2012/02/02/wp7-usando-los-servicios-de-live/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WP7] Como usar LongListSelector</title>
		<link>http://labloguera.net/cesar/2011/12/22/wp7-como-usar-longlistselector/</link>
		<comments>http://labloguera.net/cesar/2011/12/22/wp7-como-usar-longlistselector/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 08:56:05 +0000</pubDate>
		<dc:creator>cesar</dc:creator>
				<category><![CDATA[Sin categoría]]></category>
		<category><![CDATA[windows phone 7]]></category>
		<category><![CDATA[wp7]]></category>

		<guid isPermaLink="false">http://labloguera.net/cesar/?p=251</guid>
		<description><![CDATA[Si navegamos por el Hub de People podemos ver que para recorrer nuestro listado de contactos disponemos aparte de arrastrar la lista, de una serie de cuadrados que contienen la letra inicial de los nombres que vienen a continuación. Si pulsamos en uno de esos cuadrados aparece un panel con todas las letras del abecedario, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Si navegamos por el Hub de People podemos ver que para recorrer nuestro listado de contactos disponemos aparte de arrastrar la lista, de una serie de cuadrados que contienen la letra inicial de los nombres que vienen a continuación.</p>
<p style="text-align: justify">Si pulsamos en uno de esos cuadrados aparece un panel con todas las letras del abecedario, seleccionando una de ellas nos posiciona en la sección que comienza por la letra que hemos pulsado.</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon1.jpg" alt="" /></p>
<p style="text-align: justify">Este componente que se llama <strong>LongListSelector</strong> también lo podemos usar en nuestras aplicaciones, para ello tenemos que instalar Silverlight Toolkit for Windows Phone disponible en la siguiente dirección: <a href="http://silverlight.codeplex.com/">http://silverlight.codeplex.com/</a></p>
<p style="text-align: justify">LongListSelector está estructurado en siete partes (o templates) que podemos personalizar como queramos:</p>
<ul>
<li>ListHeaderTemplate</li>
<li>ListFooterTemplate</li>
<li><strong>GroupHeaderTemplate</strong></li>
<li>GroupFooterTemplate</li>
<li><strong>GroupItemsPanel</strong></li>
<li><strong>GroupItemTemplate</strong></li>
<li><strong>ItemTemplate</strong></li>
</ul>
<p style="text-align: justify">Para que funcione necesitamos que al menos GroupHeaderTemplate, GroupItemTemplate, GroupItemsPanel e ItemTemplate sean usados, los demás dependiendo de nuestras necesidades los podemos usar o no.</p>
<p style="text-align: justify">Para que os hagáis una idea de a que equivale cada template aquí tenéis un par de imágenes que aclararán un poco el asunto:</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon2.png" alt="" /></p>
<p style="text-align: justify">Para comenzar, una vez que tenemos instalado el Toolkit, abrimos Visual Studio y creamos un nuevo proyecto de Silverlight para Windows Phone 7:</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon3.png" alt="" /></p>
<p style="text-align: justify">Ahora vamos a preparar las clases que necesitamos para mostrar una lista de modelos de coche agrupados por su marca.</p>
<p style="text-align: justify">Lo primero que necesitamos es definir la entidad que representa a un coche:</p>
<p style="text-align: justify"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon4.png" alt="" /></p>
<p style="text-align: justify">Tengo creada una clase que se llama BaseViewModel.cs de la que me sirvo para notificar los cambios en una propiedad y saber si estoy en tiempo de diseño o no.</p>
<p style="text-align: justify">La idea es centralizar todos los métodos o propiedades en una sola clase para no tener que reescribir el código en el resto de clases que necesiten esas funciones.</p>
<p style="text-align: justify"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon5.png" alt="" /><span style="color: #2b91af;font-family: Consolas;font-size: 9pt"><br />
</span></p>
<p style="text-align: justify">Ahora tenemos que crear la clase que va a manejar la lista de coches, en este caso se va a llamar BrandViewModel.cs.</p>
<p style="text-align: justify">Como podéis ver tenemos una lista ObservableCollection que nos permite aumentar o disminuir la lista de forma dinámica sin tener que volverla a construir y ¿de qué tipo? pues el tipo es una lista de coches.</p>
<p style="text-align: justify">Es decir, <span style="color: #2b91af;font-family: Consolas">Group </span>es una clase que os enseñare más adelante que nos permite almacenar en una lista los coches de una misma marca, por lo que al final lo que estamos haciendo es una lista BrandGroupList, que contiene varias listas Group (una por cada marca) de coches<span style="color: #2b91af;font-family: Consolas;font-size: 9pt"><br />
</span></p>
<p style="text-align: justify">A continuación lo que podeis ver es el método LoadExampleInfo para cargar los datos de ejemplo en una lista y a continuación ordenarlos con DoOrder.</p>
<p>          <img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon6.png" alt="" align="center" /></p>
<p><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon7.png" alt="" /></p>
<p style="text-align: justify">El método DoOrder agrupa los coches en listas de tipo Group y luego los añade a la lista que vamos a enlazar con la interfaz (Brand_Group_List).</p>
<p style="text-align: justify">Ya solo nos queda ver lo que hace la clase Group:</p>
<p style="text-align: justify"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon8.png" alt="" /></p>
<p style="text-align: justify">Básicamente tenemos el constructor que crea la lista y dos propiedades una que será &#8220;Key&#8221; que es la clave por la que organizamos los grupos y &#8220;HasElements&#8221; que nos dice si tiene elementos un grupo o no.</p>
<p style="text-align: justify">La clase es genérica para poderla usar en otros proyectos y no tener que volverla a modificar <img src='http://labloguera.net/cesar/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p style="text-align: justify">Vale, pues con esto (que no es poco) ya tenemos nuestro origen de datos y podemos comenzar a trabajar en la interfaz. Para ello tenemos que añadir la referencia al Microsoft.Phone.Controls.Toolkit en nuestro proyecto, pulsando con el botón derecho del ratón en referencias, seleccionamos agregar referencia en el menú que aparece y luego buscamos la librería en la ventana que aparece:</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon9.png" alt="" /></p>
<p style="text-align: justify">De tal manera que obtendremos esto en nuestro proyecto una vez pulsemos sobre OK:</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon10.png" alt="" /></p>
<p style="text-align: justify">Además podéis añadir el componente LongListSelector a la caja de herramientas pulsando con el botón derecho del ratón y seleccionando &#8220;Choose item&#8221; en el menú contextual, en la ventana que se abre, seleccionáis el componente pulsáis en Ok.</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon11.png" alt="" /><span style="font-family: Consolas;font-size: 9pt"><br />
</span></p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon12.png" alt="" /><span style="font-family: Consolas;font-size: 9pt"><br />
</span></p>
<p style="text-align: justify">Ahora el componente aparece en la caja de herramientas, podéis usar el componente simplemente arrastrándolo desde la caja de herramientas a MainPage.xaml en la vista de diseño.</p>
<p style="text-align: justify">También se puede editar la interfaz con Expression Blend o ir trabajando directamente en XAML añadiendo los templates que deseéis usar, en cualquier caso tendréis algo parecido a esto:</p>
<p><img class="aligncenter" src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon13.png" alt="" /></p>
<p style="text-align: justify">Template de ListHeader:</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon14.png" alt="" /></p>
<p style="text-align: justify">Template de ListFooter:</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon15.png" alt="" /><span style="font-family: Consolas;font-size: 9pt"><br />
</span></p>
<p style="text-align: justify">Template de GroupItems:</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon16.png" alt="" /><span style="font-family: Consolas;font-size: 9pt"><br />
</span></p>
<p>Template de GroupItem:</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon17.png" alt="" /><span style="font-family: Consolas;font-size: 9pt"><br />
</span></p>
<p>Template de GroupHeader:</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon18.png" alt="" /></p>
<p>Template de GroupHeader:</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon19.png" alt="" /></p>
<p style="text-align: justify">Una vez está terminada la interfaz hay que ir al MainPage.xaml.cs y apuntar la propiedad ItemSource del componente para que cuando arranque la aplicación la lista este rellena:</p>
<p style="text-align: center"><img src="http://labloguera.net/cesar/files/2011/12/121311_0855_ComousarLon20.png" alt="" /><span style="font-family: Consolas;font-size: 9pt"><br />
</span></p>
<p>Espero que esto os ayude a usar este componente, podéis acceder al código del ejemplo desde <a title="Ejemplo LongListSelector" href="https://skydrive.live.com/redir.aspx?cid=bce19a4c8804f321&amp;resid=BCE19A4C8804F321!116&amp;parid=BCE19A4C8804F321!115" target="_blank">aquí </a> <img src='http://labloguera.net/cesar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span style="font-family: Consolas;font-size: 9pt"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://labloguera.net/cesar/2011/12/22/wp7-como-usar-longlistselector/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Links] Links of the week</title>
		<link>http://labloguera.net/cesar/2011/09/24/links-links-of-the-week-2/</link>
		<comments>http://labloguera.net/cesar/2011/09/24/links-links-of-the-week-2/#comments</comments>
		<pubDate>Sat, 24 Sep 2011 16:37:15 +0000</pubDate>
		<dc:creator>cesar</dc:creator>
				<category><![CDATA[Links]]></category>

		<guid isPermaLink="false">http://labloguera.net/cesar/?p=207</guid>
		<description><![CDATA[Hola a todos!! pues nada aquí estoy un sábado más con unos enlaces la mar de interesantes El primero de todos es Raspberry Pi, un pedazo de proyecto que promete para finales de este año un mini ordenador por 25 dolares. Se trata de una máquina justa en prestaciones pensada para la los más necesitados. [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a todos!!</p>
<p><a href="http://labloguera.net/cesar/files/2011/09/bob-esponja.png"><img class="size-full wp-image-204 aligncenter" src="http://labloguera.net/cesar/files/2011/09/bob-esponja.png" alt="" width="180" height="198" /></a></p>
<p>pues nada aquí estoy un sábado más con unos enlaces la mar de interesantes <img src='http://labloguera.net/cesar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<ul>
<li>El primero de todos es <a href="http://www.raspberrypi.org" target="_blank">Raspberry Pi</a>, un pedazo de proyecto que promete para finales de este año un mini ordenador por 25 dolares. Se trata de una máquina justa en prestaciones pensada para la los más necesitados. Usa GNU-Linux como sistema operativo y lo mejor de todo es que el Quake III ¡¡FUNCIONA!! <img src='http://labloguera.net/cesar/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </li>
<li>La nueva versión de Windows empieza a verse en la red y no solo trae novedades para los usuarios, sino también para los desarrolladores. Os dejo un resumen en este <a href="http://dev.eugenioestrada.es/2011/09/que-es-winrt" target="_blank">post </a>escrito por Eugenio Estrada.</li>
<li>Este enlace va dedicado a los profes de mi universidad que dicen &#8220;no&#8221; a usar productos de Microsoft sin dar explicación alguna. Creo que dedicare un post a esto pero de momento dejo esto: &#8220;<a href="http://www.genbetadev.com/actualidad/microsoft-ha-muerto-ja" target="_blank">Microsoft ha muerto</a>&#8220;.</li>
</ul>
<p>&nbsp;</p>
<p>Un saludo</p>
]]></content:encoded>
			<wfw:commentRss>http://labloguera.net/cesar/2011/09/24/links-links-of-the-week-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Links] Links of the week</title>
		<link>http://labloguera.net/cesar/2011/09/03/links-links-of-the-week/</link>
		<comments>http://labloguera.net/cesar/2011/09/03/links-links-of-the-week/#comments</comments>
		<pubDate>Sat, 03 Sep 2011 09:39:47 +0000</pubDate>
		<dc:creator>cesar</dc:creator>
				<category><![CDATA[Links]]></category>

		<guid isPermaLink="false">http://labloguera.net/cesar/?p=178</guid>
		<description><![CDATA[Hola a tod@s, ¡¡es sábado!! y con este post inauguro la nueva sección de mi blog &#8220;Links of the week&#8221; que intentare que aparezca los sábados con aquellos enlaces a sitios que me han llamado la atención durante la semana y que merecen la pena ser nombrados. Los links de esta semana son: Saving trees [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a tod@s, ¡¡es sábado!!</p>
<p><a href="http://labloguera.net/cesar/files/2011/09/bob-esponja.png"><img class="size-full wp-image-204 aligncenter" src="http://labloguera.net/cesar/files/2011/09/bob-esponja.png" alt="" width="180" height="198" /></a></p>
<p>y con este post inauguro la nueva sección de mi blog &#8220;Links of the week&#8221; que intentare que aparezca los sábados con aquellos enlaces a sitios que me han llamado la atención durante la semana y que merecen la pena ser nombrados.</p>
<p>Los links de esta semana son:</p>
<ul>
<li><a href="http://www.microsoft.eu/cloud-computing/posts/cloud-helps-the-city-of-madrid-stay-green-one-tree-at-a-time.aspx" target="_blank">Saving trees for a greener City of Madrid</a>. Aquí os dejo un artículo que habla de una herramienta que se encuentra a disposición de los habitantes de Madrid para pedir que planten arboles en su barrio, informarse de las especies de arboles plantadas en la ciudad, notificar deficiencias, etc,. Y todo ello usando Windows Azure y Silverlight</li>
<li><a title="Photoduino" href="http://code.google.com/p/photoduino/" target="_blank">Photoduino </a>es una iniciativa para contruir un controlador para cámara de fotos basado en Arduino. Tiene muy buena pinta sobre todo si quieres hacer time lapses o fotografiar tormentas.</li>
<li><a title="Intervaluino" href="http://www.sporez.com/honeyjar/?p=347" target="_blank">Intervaluino </a>este es un aparato similar a photoduino en cuanto al objetivo del proyecto pero con menos funciones que el anterior.Usa .NET y Netduino.</li>
<li>El <a href="http://thenextweb.com/shareables/2011/08/28/ever-wonder-where-the-windows-xp-default-wallpaper-came-from/" target="_blank">wallpaper de XP</a>. Si quieres saber de donde ha salido entra en el enlace, es bastante curioso.</li>
<li><a href="http://www.sciencystuff.com/?p=24" target="_blank">Autopsia de un Pentium III. </a>Creo que el título lo dice todo <img src='http://labloguera.net/cesar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li><a href="http://channel9.msdn.com/Series/CampusTours/Surface-20-Stress-Test-Robot-PaTTY" target="_blank">PaTTY el tester de la Surfac2.0</a></li>
</ul>
<p>Espero que os resulten tan curiosos como a mi <img src='http://labloguera.net/cesar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://labloguera.net/cesar/2011/09/03/links-links-of-the-week/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WP7] Nueva versión del toolkit de Silverlight para Windows Phone</title>
		<link>http://labloguera.net/cesar/2011/08/19/wp7-nueva-version-del-toolkit-de-silverlight-para-windows-phone/</link>
		<comments>http://labloguera.net/cesar/2011/08/19/wp7-nueva-version-del-toolkit-de-silverlight-para-windows-phone/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 02:31:26 +0000</pubDate>
		<dc:creator>cesar</dc:creator>
				<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[windows phone 7]]></category>
		<category><![CDATA[wp7]]></category>

		<guid isPermaLink="false">http://labloguera.net/cesar/?p=160</guid>
		<description><![CDATA[Hola a tod@s, hace un par de días ha aparecido la versión estable del Silverlight Toolkit for Windows Phone, la última versión estable salio por febrero de este año. Pero bueno, el caso es que ya la tenemos aquí y trae algunas novedades. Antes de nada para los que no se hallan actualizado, es necesario [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a tod@s,</p>
<p>hace un par de días ha aparecido la versión estable del Silverlight Toolkit for Windows Phone, la última versión estable salio por febrero de este año.</p>
<p>Pero bueno, el caso es que ya la tenemos aquí y trae algunas novedades. Antes de nada para los que no se hallan actualizado, es necesario tener instalado la ultima versión de las herramientas de desarrollo para &#8220;Mango&#8221;.</p>
<p>Se han añadido algunos componentes: PhoneTextBox, DateTimePickers, LockablePivots, MultiSelectList, LongListSelector, HubTitle, ExpanderView y HeaderedItemsControl. Y como siempre se han solucionado algunos fallos y se ha optimizado el rendimiento de los componentes.</p>
<p><a href="http://labloguera.net/cesar/files/2011/08/siltoolkit.png"><img class="size-full wp-image-173 aligncenter" src="http://labloguera.net/cesar/files/2011/08/siltoolkit.png" alt="" width="274" height="64" /></a></p>
<p>La verdad es que viene bastante completo, podeis ver la descripción de todas las novedades en el <a href="http://www.jeff.wilcox.name/2011/08/august2011phonetoolkit/" target="_blank">blog de Jeff Wilcox</a>.</p>
<p>Y nada a parte de dejaros los enlaces correspondientes os recomiento que os bajeis el XAP de ejemplo y que lo metais en el emulador o en vuestro movil para ver como funciona <img src='http://labloguera.net/cesar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Recursos:</p>
<p style="padding-left: 60px"> <a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=26648" target="_blank">Windows Phone SDK 7.1 Beta 2</a></p>
<p style="padding-left: 60px"><a href="http://silverlight.codeplex.com/releases/view/71550" target="_blank">Silverlight Toolkit for Windows Phone</a></p>
<p> Saludetes <img src='http://labloguera.net/cesar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="padding-left: 60px">
]]></content:encoded>
			<wfw:commentRss>http://labloguera.net/cesar/2011/08/19/wp7-nueva-version-del-toolkit-de-silverlight-para-windows-phone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google compra la división de móviles de Motorola</title>
		<link>http://labloguera.net/cesar/2011/08/15/google-compra-la-division-de-moviles-de-motorola/</link>
		<comments>http://labloguera.net/cesar/2011/08/15/google-compra-la-division-de-moviles-de-motorola/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 14:25:33 +0000</pubDate>
		<dc:creator>cesar</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Motorola]]></category>
		<category><![CDATA[smartphones]]></category>

		<guid isPermaLink="false">http://labloguera.net/cesar/?p=88</guid>
		<description><![CDATA[Pues con esta interesante noticia me he levantado esta mañana. Parece que este año nadie quiere descansar en agosto y si hace unos días se despertaban los rumores sobre la salida de Mango, la nueva versión de Windows Phone, al mercado este proximo 1 de septiembre hoy es que Google intentando plantar cara a Apple [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><img class="size-full wp-image-87 aligncenter" src="http://labloguera.net/cesar/files/2011/08/motorola-google.jpg" alt="" width="473" height="281" /></p>
<p>Pues con esta interesante noticia me he levantado esta mañana.</p>
<p>Parece que este año nadie quiere descansar en agosto y si hace unos días se despertaban los rumores sobre la salida de Mango, la nueva versión de Windows Phone, al mercado este proximo 1 de septiembre hoy es que Google intentando plantar cara a Apple y Microsoft en el terreno de los smartphones ha comprado la división de telefonía movil de Motorola.</p>
<p>¿Como nos puede afectar esto? pues en primer lugar los teléfonos que van a llevar la voz cantante en cuanto a implementar nuevas caracteristicas en sus terminales serán Apple, Nokia y Motorola, además de que serán los primeros de la cola en pedir y adquirir nuevas funcionalidades el los sistemas operativos.</p>
<p>Eso si, aunque efectivamente Google sale reforzada en su lucha contra Apple y Microsoft por las patentes en móviles, ahora Android no resulta tan neutral ya que Motorola sera la cabeza visible en la que todo el mundo se fijara para ver el camino que sigue Android por lo que muchas empresas quizás se empiecen a plantear lazar algunos modelos más con el sistema Windows Phone de Microsoft para no quedarse en desventaja frente a Motorola.</p>
<p>En cualquier caso para los desarrolladores es mas lo que ganamos que lo que perdemos pues la experiencia que tiene Motorola aportada a Android seguro que hace mejorar las herramientas de desarrollo en este sistema y tanto a los demás fabricantes de móviles como a Microsoft y Apple competir más por sacar nuevas caracteristicas tanto en el hardware como en el software, que al final siempre mejora la experiencia del usuario final del teléfono.</p>
<p>Más opiniones en <a href="http://www.xataka.com/moviles/google-adquiere-motorola-mobility-por-12500-millones-de-dolares" target="_blank">Xataka </a>y <a href="http://www.engadget.com/2011/08/15/google-acquiring-motorola-mobility/" target="_blank">Engadget</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://labloguera.net/cesar/2011/08/15/google-compra-la-division-de-moviles-de-motorola/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WP7] Detectar la reproducción de música</title>
		<link>http://labloguera.net/cesar/2011/01/03/wp7-detectar-la-reproducci-n-de-m-sica/</link>
		<comments>http://labloguera.net/cesar/2011/01/03/wp7-detectar-la-reproducci-n-de-m-sica/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 09:39:00 +0000</pubDate>
		<dc:creator>cesar</dc:creator>
				<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">/labloguera/blogs/csharp/archive/2011/01/03/wp7-detectar-la-reproducci-n-de-m-sica.aspx</guid>
		<description><![CDATA[Uno de los puntos en los que tenemos que estar atentos para que nuestras aplicaciones logren pasar el proceso de certificación del MarketPlace es si el dispositivo está reproduciendo música en el momento de ejecutar nuestra aplicación. En el caso de que el usuario esté escuchando música nuestra aplicación debería  pedirle permiso antes de poder [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los puntos en los que tenemos que estar atentos para que nuestras aplicaciones logren pasar el proceso de certificación del MarketPlace es si el dispositivo está reproduciendo música en el momento de ejecutar nuestra aplicación.</p>
<p>En el caso de que el usuario esté escuchando música nuestra aplicación debería  pedirle permiso antes de poder cortar esa reproducción.</p>
<p>Detectar si se reproduce música es sencillo, simplemente vamos a añadir a la clase <strong>App.xaml.cs</strong> el namespace <strong>Microsoft.XNA.Framework.Media</strong> y así podremos hacer uso de una variable booleana <strong>MediaPlayer.GameHasControl </strong>esta variable nos dice si tu programa tiene el control sobre la reproducción de sonido.</p>
<p>El ejemplo que muestro a continuación lo he realizado usando Silverlight por lo que el namespace que indico arriba no viene por defecto , así que pulsamos con el botón derecho del ratón en la carpeta de referencias y pulsamos en agregar referencia y del listado que obtenemos usamos Microsoft.XNA.Framework.</p>
<p><img class="alignnone size-full wp-image-103" src="http://labloguera.net/cesar/files/2011/08/wp7sound1.png" alt="" width="399" height="214" /></p>
<p><a href="http://labloguera.net/cesar/files/2011/08/wp7sound2.png"><img class="alignnone size-full wp-image-104" src="http://labloguera.net/cesar/files/2011/08/wp7sound2.png" alt="" width="540" height="417" /></a></p>
<p>Al añadir la referencia Visual Studio nos advierte de que pueden aparecer “rayos y centellas” cuando menos lo esperemos, no tengáis miedo y decidle que SI queréis continuar <img class="wlEmoticon wlEmoticon-smile" style="border-style: none" src="http://labloguera.net/blogs/csharp/wlEmoticon-smile_3E9A252D.png" alt="Sonrisa" />.</p>
<p><a href="http://labloguera.net/cesar/files/2011/08/wp7sound3.png"><img class="alignnone size-full wp-image-105" src="http://labloguera.net/cesar/files/2011/08/wp7sound3.png" alt="" width="530" height="229" /></a></p>
<p>Es hora de abrir la clase App.xaml.cs y añadir el siguiente código al evento Application_Launching que ejecuta lo que sea necesario cuando se está iniciando la aplicación:</p>
<p>        private void Application_Launching(object sender, LaunchingEventArgs e)<br />
        {<br />
            FrameworkDispatcher.Update();</p>
<p>            if (MediaPlayer.GameHasControl==false)<br />
            {</p>
<p>                if (MessageBox.Show(&#8220;Quieres cortar la reproducción de música en background&#8221;, &#8220;Aviso&#8221;, MessageBoxButton.OKCancel) == MessageBoxResult.Cancel)<br />
                {<br />
                    Application.Current.Exit+=new EventHandler(Current_Exit);<br />
                }<br />
            }<br />
        }</p>
<p>Antes de nada lo primero que podéis ver es la instrucción FrameworkDispacher.Update(). En XNA la clase Game se encarga automáticamente de llamar a este método para conocer el estado de diferentes componentes del dispositivo, como el proyecto lo estamos realizando con Silverlight debemos ser nosotros quienes llamemos al método en el momento que lo necesitemos.</p>
<p>A continuación pregunto por el control del sonido, en el caso de que no lo tenga mi aplicación lanzo un MessageBox, si el usuario pulsa “Ok” la aplicación corta automáticamente la reproducción de sonido en background y toma el control y en el caso de pulsar “Cancel” sale de la aplicación inmediatamente.</p>
<p>Creo que es la forma mas sencilla que tenemos de programar nuestra aplicación para que pase este punto de la certificación.</p>
<p>Espero que sirva, un saludo <img class="wlEmoticon wlEmoticon-smile" style="border-style: none" src="http://labloguera.net/blogs/csharp/wlEmoticon-smile_3E9A252D.png" alt="Sonrisa" /></p>
]]></content:encoded>
			<wfw:commentRss>http://labloguera.net/cesar/2011/01/03/wp7-detectar-la-reproducci-n-de-m-sica/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WP7] Estados de certificado de una aplicación</title>
		<link>http://labloguera.net/cesar/2010/12/31/wp7-estados-de-certificado-de-una-aplicaci-n/</link>
		<comments>http://labloguera.net/cesar/2010/12/31/wp7-estados-de-certificado-de-una-aplicaci-n/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 01:11:00 +0000</pubDate>
		<dc:creator>cesar</dc:creator>
				<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">/labloguera/blogs/csharp/archive/2010/12/31/wp7-estados-de-certificado-de-una-aplicaci-n.aspx</guid>
		<description><![CDATA[Actualmente cuando terminados una aplicación para Windows Phone 7 y la subimos al MarketPlace de Microsoft para su certificado y posterior publicación, se nos va informando del estado en el que se encuentra este proceso de certificación. Voy a enumerar al menos los que conocemos los usuarios del APP Hub: Submission in Progress Tienes que [...]]]></description>
			<content:encoded><![CDATA[<p>Actualmente cuando terminados una aplicación para Windows Phone 7 y la subimos al MarketPlace de Microsoft para su certificado y posterior publicación, se nos va informando del estado en el que se encuentra este proceso de certificación.</p>
<p>Voy a enumerar al menos los que conocemos los usuarios del <a href="http://create.msdn.com" target="_blank">APP Hub</a>:</p>
<p><strong>Submission in Progress</strong></p>
<p>Tienes que finalizar el proceso de subida de la aplicación pulsando el botón de finalización.</p>
<p><strong>Ready for Testing</strong></p>
<p>La aplicación todavía no ha sido introducida en el proceso de testing.</p>
<p><strong>Testing in Progress </strong></p>
<p>La aplicación se encuentra en la cola de testing a la espera de que un tester se encuentre disponible.</p>
<p><strong>Ready for Signing </strong></p>
<p>La aplicación ha pasado las pruebas de certificación y está preparada para pasar a la fase de publicación.</p>
<p><strong>Ready for Publishing</strong></p>
<p>En esta fase la aplicación es publicada automáticamente en el MarketPlace si así lo hemos elegido durante el proceso de subida, sino deberemos activar la publicación manualmente.</p>
<p><strong>Published to Marketplace </strong></p>
<p>La aplicación se encuentra publicada, aunque algunas veces tarda un día en aparecer en el MarketPlace.</p>
<p><strong>Certification Failed </strong></p>
<p>La aplicación ha fallado la publicación y tienes que arreglar la parte en la que falla, para ello Microsoft proporciona un reporte bastante concreto en mi opinión sobre como debería comportarse la aplicación y como reproducir el error en nuestro ordenador.</p>
<p><strong>None </strong></p>
<p>Si en algún momento te encuentras tu aplicación en este estado ponte en contacto con la gente de soporte pues puede que halla ocurrido algún error durante el proceso de subida.</p>
<p>Por último quiero indicar que el tiempo de publicación de una aplicación en el caso de que pase la certificación oscila entre cuatro y cinco días laborables.</p>
<p>Espero que os sirva, un saludo y que tengáis una buena entrada y salida de año <img class="wlEmoticon wlEmoticon-smile" style="border-style: none" src="http://labloguera.net/blogs/csharp/wlEmoticon-smile_63B6BFCF.png" alt="Sonrisa" /></p>
]]></content:encoded>
			<wfw:commentRss>http://labloguera.net/cesar/2010/12/31/wp7-estados-de-certificado-de-una-aplicaci-n/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WP7] Tombstoning o que hacer cuando nos llaman al movil</title>
		<link>http://labloguera.net/cesar/2010/12/13/wp7-tombstoning-o-que-hacer-cuando-nos-llaman-al-tel-fono/</link>
		<comments>http://labloguera.net/cesar/2010/12/13/wp7-tombstoning-o-que-hacer-cuando-nos-llaman-al-tel-fono/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 19:54:00 +0000</pubDate>
		<dc:creator>cesar</dc:creator>
				<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">/labloguera/blogs/csharp/archive/2010/12/13/wp7-tombstoning-o-que-hacer-cuando-nos-llaman-al-tel-fono.aspx</guid>
		<description><![CDATA[Como ya sabréis el cambio en la forma de desarrollar aplicaciones para Windows Phone 7 ha sido bastante radical con respecto a como se hacía en Windows Mobile 6.5. Ahora tenemos que seguir unas guías de estilo, tener en cuenta los botones del dispositivo, el contenido del programa, etc,. Pues bien, una de las diferencias [...]]]></description>
			<content:encoded><![CDATA[<p>Como ya sabréis el cambio en la forma de desarrollar aplicaciones para Windows Phone 7 ha sido bastante radical con respecto a como se hacía en Windows Mobile 6.5. Ahora tenemos que seguir unas guías de estilo, tener en cuenta los botones del dispositivo, el contenido del programa, etc,. Pues bien, una de las diferencias más notables que podemos encontrar es la imposibilidad de correr mas de una aplicación al mismo tiempo, no hay manera de cambiar de una aplicación a otra  sin cerrar la primera (siempre que la aplicación no sea nativa del sistema). Aquí voy a aclarar una expresión que ha llevado a muchas discusiones / criticas, que es: ¿¡Windows Phone 7 no proporciona multitarea!? la respuesta es por un lado “no”, no nos permite a los desarrolladores en general mantener nuestras aplicaciones en segundo plano al estilo de WM6.5 y por otro lado “si”, si permite multitarea pero lo restringe a las aplicaciones propias del sistema operativo (y supongo que a las aplicaciones de terceros a los que Microsoft de su consentimiento). ¿Por que han hecho esto así? bueno pues básicamente para dar más agilidad a la máquina y que no se produzca un desperdicio de recursos en el aparato, además disponemos de mecanismos como las notificaciones para avisar al usuario de cambios o actualizaciones de los datos de nuestro programa. Esta restricción de la multitarea no solo es idea de Microsoft, antes que ellos ya la ha practicado Apple con su IPhone. En Android por ejemplo esta faceta no se controla, dejando al desarrollador al cuidado de estas tareas. Pero vamos al tema del post de hoy “tombstoning”, como ya he dicho solo podemos tener ejecutándose una aplicación al mismo tiempo sin contar con las del sistema y además existen situaciones en las cuales el sistema se “apropia” de la pantalla, como es en el caso de las llamadas de teléfono. Cuando nos llaman al teléfono la aplicación que tenemos en pantalla se cierra inmediatamente y no tenemos opción de guardar la información con la que trabajábamos en ese momento. Para estos casos tenemos el “tombstoning”, que nos permite programar el guardado automático de la información del programa cuando el sistema o nosotros detenemos su ejecución. Disponemos de algunos eventos para guardar o cargar nuestros datos, estos son:</p>
<ul>
<li>Launching</li>
<li>Activated</li>
<li>Closing</li>
<li>Deactivated</li>
</ul>
<p>Launching y Closing se producen cuando lanzamos la aplicación y cuando la cerramos, por otro lado disponemos de Activated y Deactivated que suceden cuando nos llaman al teléfono o pulsamos el botón de Volver. Voy a mostrar un ejemplo en el que persisto el texto de un textbox y donde muestro la hora a la que se desactivo la aplicación. Lo primero de todo es abrir Visual Studio y elegir un nuevo proyecto de tipo “Windows Phone Application”</p>
<p align="center"><a href="http://labloguera.net/cesar/files/2010/12/640x444.aspx_.jpg"><img class="alignnone size-full wp-image-120" src="http://labloguera.net/cesar/files/2010/12/640x444.aspx_.jpg" alt="" width="640" height="444" /></a></p>
<p>Lo creamos y abrimos la clase App.xaml.cs, aproximadamente a la mitad de la clase podemos ver los eventos que os comentaba arriba. Bueno ponemos el cursor del ratón en el evento Deactivated y haciendo uso de PhoneApplicationService guardamos la hora en la que el programa se interrumpe por una llamada:  privatevoid Application_Deactivated(object sender, DeactivatedEventArgs e) { PhoneApplicationService.Current.State["desactivadoHora"] = DateTime.Now; }  Ahora abrimos MainPage.xaml, veremos algo como esto:</p>
<p align="center"><a href="http://labloguera.net/cesar/files/2010/12/412x480.aspx_.jpg"><img class="alignnone size-full wp-image-121" src="http://labloguera.net/cesar/files/2010/12/412x480.aspx_.jpg" alt="" width="412" height="480" /></a></p>
<p>Tenemos que añadir a la interfaz un TexBox y un TexBlock para que quede de la siguiente forma:</p>
<p align="center"><a href="http://labloguera.net/cesar/files/2010/12/298x480.aspx_.jpg"><img class="alignnone size-full wp-image-122" src="http://labloguera.net/cesar/files/2010/12/298x480.aspx_.jpg" alt="" width="298" height="480" /></a></p>
<p>&nbsp;</p>
<p>&lt;Grid x:Name=&#8221;LayoutRoot&#8221; Background=&#8221;Transparent&#8221;&gt;<br />
&lt;Grid.RowDefinitions&gt;<br />
&lt;RowDefinition Height=&#8221;Auto&#8221;/&gt;<br />
&lt;RowDefinition Height=&#8221;*&#8221;/&gt;<br />
&lt;/Grid.RowDefinitions&gt;</p>
<p>&lt;!&#8211;TitlePanel contains the name of the application and page title&#8211;&gt;<br />
&lt;StackPanel x:Name=&#8221;TitlePanel&#8221; Grid.Row=&#8221;0&#8243; Margin=&#8221;12,17,0,28&#8243;&gt;<br />
&lt;TextBlock x:Name=&#8221;ApplicationTitle&#8221; Text=&#8221;MY APPLICATION&#8221; Style=&#8221;{StaticResource PhoneTextNormalStyle}&#8221;/&gt;<br />
&lt;TextBlock x:Name=&#8221;PageTitle&#8221; Text=&#8221;page name&#8221; Margin=&#8221;9,-7,0,0&#8243; Style=&#8221;{StaticResource PhoneTextTitle1Style}&#8221;/&gt;<br />
&lt;/StackPanel&gt;</p>
<p>&lt;!&#8211;ContentPanel &#8211; place additional content here&#8211;&gt;<br />
&lt;Grid x:Name=&#8221;ContentPanel&#8221; Grid.Row=&#8221;1&#8243; Margin=&#8221;12,0,12,0&#8243;&gt;<br />
&lt;TextBox Height=&#8221;279&#8243; HorizontalAlignment=&#8221;Left&#8221; Margin=&#8221;36,50,0,0&#8243; Name=&#8221;textBox1&#8243; Text=&#8221;" VerticalAlignment=&#8221;Top&#8221; Width=&#8221;384&#8243; TextChanged=&#8221;textBox1_TextChanged&#8221;/&gt;<br />
&lt;TextBlock Height=&#8221;57&#8243; HorizontalAlignment=&#8221;Left&#8221; Margin=&#8221;36,361,0,0&#8243; Name=&#8221;textBlock1&#8243; Text=&#8221;" VerticalAlignment=&#8221;Top&#8221; Width=&#8221;389&#8243;/&gt;<br />
&lt;/Grid&gt;<br />
&lt;/Grid&gt;</p>
<p>Ahora en el evento TextChanged del TextBox añadimos la siguiente línea:</p>
<p>private void textBox1_TextChanged(object sender, TextChangedEventArgs e)<br />
{<br />
PhoneApplicationService.Current.State["textoEscrito"] = textBox1.Text;<br />
}</p>
<p>De esta manera guardamos el texto cada vez que cambia. Cuando el programa se ve interrumpido por la llamada de teléfono y volvemos a la aplicación MainPage llama automáticamente al método OnNavigatedTo  (este evento ocurre cada vez que se carga una clase que deriva de Page). Nosotros lo sobrescribimos para que cuando se ejecute cargue los datos que hemos guardado anteriormente:</p>
<p>protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)<br />
{<br />
if (PhoneApplicationService.Current.State.ContainsKey(&#8220;textoEscrito&#8221;))<br />
{<br />
textBox1.Text = (string)PhoneApplicationService.Current.State["textoEscrito"];<br />
}</p>
<p>if (PhoneApplicationService.Current.State.ContainsKey(&#8220;desactivadoHora&#8221;))<br />
{<br />
textBlock1.Text =&#8221;La aplicación se desactivo a las:&#8221;;<br />
textBlock1.Text += ((DateTime)PhoneApplicationService.Current.State["desactivadoHora"]).TimeOfDay.ToString();<br />
}<br />
else<br />
{<br />
textBlock1.Text=&#8221;";<br />
}<br />
}</p>
<p>Simplemente tenemos que comprobar que existen las claves que indicamos y en caso afirmativo mostrar la información. Ahora ejecutamos el programa e introducimos texto en el TextBox, para simular la llamada de teléfono o que abrimos otro programa pulsamos la tecla de Windows.</p>
<p align="center"><a href="http://labloguera.net/cesar/files/2010/12/260x480.aspx_.jpg"><img class="alignnone size-full wp-image-130" src="http://labloguera.net/cesar/files/2010/12/260x480.aspx_.jpg" alt="" width="260" height="480" /></a></p>
<p align="center"> <a href="http://labloguera.net/cesar/files/2010/12/263x480.aspx_.jpg"><img class="alignnone size-full wp-image-131" src="http://labloguera.net/cesar/files/2010/12/263x480.aspx_.jpg" alt="" width="263" height="480" /></a></p>
<p>Cuando queramos ir hacia atrás, pulsamos la tecla de Volver y veremos una pantalla en la que se está recuperando la información:</p>
<p align="center"><a href="http://labloguera.net/cesar/files/2010/12/264x480.aspx_.jpg"><img class="alignnone size-full wp-image-132" src="http://labloguera.net/cesar/files/2010/12/264x480.aspx_.jpg" alt="" width="264" height="480" /></a></p>
<p align="center"><a href="http://labloguera.net/cesar/files/2010/12/imagenTombstoning7.png"><img class="alignnone size-full wp-image-134" src="http://labloguera.net/cesar/files/2010/12/imagenTombstoning7.png" alt="" width="262" height="477" /></a></p>
<p>Por último aquí podéis ver la información recuperada y la hora a la que el programa quedo inactivo. Espero que os sirva a todos los que estáis programando en WP7, el código lo tenéis <a href="https://hxmgtw.blu.livefilestore.com/y1plydScsYeGCsQHXRfXWFp1w4_7OQlzyMpjOS95lNgPdO6JJl84ELg22J61id7jtFVTWR1XelmTwCHo01C7CH9_A/DemoTombstoning.rar?download&amp;psid=1" target="_blank">aquí</a>.</p>
<p>Saludos <img class="wlEmoticon wlEmoticon-smile" style="border-style: none" src="http://labloguera.net/blogs/csharp/wlEmoticon-smile_5B52D092.png" alt="Sonrisa" /></p>
]]></content:encoded>
			<wfw:commentRss>http://labloguera.net/cesar/2010/12/13/wp7-tombstoning-o-que-hacer-cuando-nos-llaman-al-tel-fono/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Silverlight] Comenzando con un ejemplo sencillo</title>
		<link>http://labloguera.net/cesar/2010/12/09/silverlight-comenzando-con-un-ejemplo-sencillo/</link>
		<comments>http://labloguera.net/cesar/2010/12/09/silverlight-comenzando-con-un-ejemplo-sencillo/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 12:28:00 +0000</pubDate>
		<dc:creator>cesar</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">/labloguera/blogs/csharp/archive/2010/12/09/silverlight-comenzando-con-un-ejemplo-sencillo.aspx</guid>
		<description><![CDATA[A pesar del tiempo que hace que colgué mi último post (hace casi dos meses), no he parado quieto y he seguido programando: &#160; &#160; y asistiendo a eventos como el de “Coding Camp de Windows Phone 7” que organizó Microsoft hace un par de semanas entre otros. Últimamente estoy tocando tecnologías como WPF, Silverlight [...]]]></description>
			<content:encoded><![CDATA[<p>A pesar del tiempo que hace que colgué mi último post (hace casi dos meses), no he parado quieto y he seguido programando:</p>
<p>&nbsp;</p>
<div style="padding: 0px;width: 425px;float: none;margin-left: auto;margin-right: auto" class="wlWriterEditableSmartContent">
</div>
<p>&nbsp;</p>
<p>y asistiendo a eventos como el de “<a href="http://www.facebook.com/album.php?aid=297826&amp;id=174210887494" target="_blank">Coding Camp de Windows Phone 7</a>” que organizó Microsoft hace un par de semanas entre otros. </p>
<p align="justify">Últimamente estoy tocando tecnologías como WPF, Silverlight (sobre todo en WP7) y con ellas algo de MVVM (Model View ViewModel). Este último tiene algo de historia hasta que te acostumbras pero poco a poco me voy haciendo a su uso. </p>
<p align="justify">Así que voy a colgar artículos (algo básicos al principio) sobre estas tecnologías por si pudieran ayudar a alguien a comenzar a trabajar con ellas. </p>
<p align="justify">El de hoy se podría decir que es un “hola mundo” en Silverlight, se trata de un reloj de agujas para el cual no nos va a hacer falta tocar demasiado código. </p>
<p align="justify">Lo primero de todo es abrir Expression Blend y crear un nuevo proyecto de tipo “Silverlight Application”. </p>
<p align="center">&nbsp;<img src="http://labloguera.net/photos/csharp/images/195046/563x480.aspx" border="0" height="426" width="500"></p>
<p>A continuación vamos a añadir dos elipses (tenéis la herramienta en la parte izquierda) la primera con un ancho y alto de 260 y un borde o StrokeThickness de 3, y la segunda algo menor en sus dimensiones, asignar 240 tanto al alto y al ancho y al borde le asignáis valor 1. </p>
<p>Para facilitar el proceso una vez tenéis añadida la primera elipse podéis duplicarla en la vista de “Objects and Timeline” (copiando y pegando) y ya simplemente tendréis que cambiar los valores que mencione anteriormente en la vista de propiedades. Así conseguiréis que una quede dentro de la otra.</p>
<p align="center"><img src="http://labloguera.net/photos/csharp/images/195047/640x367.aspx" border="0" height="306" width="533"></p>
<p>Ahora añadiremos los números al reloj, agregamos cuatro TextBlocks con el texto 3, 6, 9 y 12. Y los colocamos de la misma forma que veis en la imagen:  </p>
<p align="center"><img src="http://labloguera.net/photos/csharp/images/195048/640x281.aspx" border="0" height="231" width="527"></p>
<p>Para terminar vamos a añadir tres rectángulos que harán de agujas del reloj. Añadimos el primero que va a ser la aguja que cuente las horas con los siguientes parámetros, RadiusX y RadiusY a 4 y el borde a 1, el ancho de rectángulo va a ser 9 y el alto 69, y para terminar el valor de RenderTransformOrigin lo ponemos a 0,5 y 0. </p>
<p>El RenderTransformOrigin define el origen de las transformaciones, o lo que es lo mismo, el punto sobre el que vamos a realizar las rotaciones de las agujas del reloj. </p>
<p>La aguja del minutero tendrá los siguientes parámetros: RadiusX y RadiusY a 0,5 y el borde a 1, el ancho de rectángulo va a ser 1 y el alto 91, y para terminar el valor de RenderTransformOrigin lo ponemos a 0,5 y 0. </p>
<p>Los parámetros del segundero son exactamente iguales a los del minutero simplemente ponedla de color rojo para distinguirla.&nbsp; </p>
<p align="center"><a href="http://labloguera.net/photos/csharp/picture195049.aspx" target="_blank"><img src="http://labloguera.net/photos/csharp/images/195049/640x299.aspx" style="width: 523px;height: 244px" border="0"></a></p>
<p align="justify">Algo muy importante en esta última parte es dar nombre a las agujas para distinguirlas y poderles asignar valores. </p>
<p align="justify">El código completo de la interfaz es este:</p>
<div style="padding: 0px;width: 500px;float: none;margin-left: auto;margin-right: auto" class="wlWriterEditableSmartContent">
<pre style="width: 500px;height: 239px;background-color: White;overflow: auto;font-family: Microsoft Sans Serif">
<div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span> 1</span> <span>&lt;</span><span>Grid x:Name</span><span>=</span><span>"</span><span>LayoutRoot</span><span>"</span><span> Background</span><span>=</span><span>"</span><span>White</span><span>"</span><span>&gt;</span><span></span><span> 2</span> <span>      </span><span>&lt;</span><span>Ellipse x:Name</span><span>=</span><span>"</span><span>BordeExterior</span><span>"</span><span> Fill</span><span>=</span><span>"</span><span>White</span><span>"</span><span> Margin</span><span>=</span><span>"</span><span>194,110,186,110</span><span>"</span><span> Stroke</span><span>=</span><span>"</span><span>Black</span><span>"</span><span> StrokeThickness</span><span>=</span><span>"</span><span>3</span><span>"</span><span> Width</span><span>=</span><span>"</span><span>260</span><span>"</span><span> Height</span><span>=</span><span>"</span><span>260</span><span>"</span><span>/&gt;</span><span></span><span> 3</span> <span>      </span><span>&lt;</span><span>Ellipse x:Name</span><span>=</span><span>"</span><span>BordeInterior</span><span>"</span><span> Margin</span><span>=</span><span>"</span><span>204,121,196,119</span><span>"</span><span> Stroke</span><span>=</span><span>"</span><span>Black</span><span>"</span><span> Width</span><span>=</span><span>"</span><span>240</span><span>"</span><span> Height</span><span>=</span><span>"</span><span>240</span><span>"</span><span>/&gt;</span><span></span><span> 4</span> <span>      </span><span>&lt;</span><span>TextBlock Height</span><span>=</span><span>"</span><span>23</span><span>"</span><span> Margin</span><span>=</span><span>"</span><span>308,121,302,0</span><span>"</span><span> TextWrapping</span><span>=</span><span>"</span><span>Wrap</span><span>"</span><span> Text</span><span>=</span><span>"</span><span>12</span><span>"</span><span> VerticalAlignment</span><span>=</span><span>"</span><span>Top</span><span>"</span><span> FontSize</span><span>=</span><span>"</span><span>21.333</span><span>"</span><span> FontFamily</span><span>=</span><span>"</span><span>Arial Rounded MT Bold</span><span>"</span><span> TextAlignment</span><span>=</span><span>"</span><span>Center</span><span>"</span><span>/&gt;</span><span></span><span> 5</span> <span>      </span><span>&lt;</span><span>TextBlock Height</span><span>=</span><span>"</span><span>23</span><span>"</span><span> Margin</span><span>=</span><span>"</span><span>308,0,302,119</span><span>"</span><span> TextWrapping</span><span>=</span><span>"</span><span>Wrap</span><span>"</span><span> Text</span><span>=</span><span>"</span><span>6</span><span>"</span><span> VerticalAlignment</span><span>=</span><span>"</span><span>Bottom</span><span>"</span><span> FontSize</span><span>=</span><span>"</span><span>21.333</span><span>"</span><span> FontFamily</span><span>=</span><span>"</span><span>Arial Rounded MT Bold</span><span>"</span><span> TextAlignment</span><span>=</span><span>"</span><span>Center</span><span>"</span><span>/&gt;</span><span></span><span> 6</span> <span>      </span><span>&lt;</span><span>TextBlock Margin</span><span>=</span><span>"</span><span>0,224,196,233</span><span>"</span><span> TextWrapping</span><span>=</span><span>"</span><span>Wrap</span><span>"</span><span> Text</span><span>=</span><span>"</span><span>3</span><span>"</span><span> FontSize</span><span>=</span><span>"</span><span>21.333</span><span>"</span><span> FontFamily</span><span>=</span><span>"</span><span>Arial Rounded MT Bold</span><span>"</span><span> TextAlignment</span><span>=</span><span>"</span><span>Center</span><span>"</span><span> HorizontalAlignment</span><span>=</span><span>"</span><span>Right</span><span>"</span><span> Width</span><span>=</span><span>"</span><span>30</span><span>"</span><span>/&gt;</span><span></span><span> 7</span> <span>      </span><span>&lt;</span><span>TextBlock Margin</span><span>=</span><span>"</span><span>207,224,0,233</span><span>"</span><span> TextWrapping</span><span>=</span><span>"</span><span>Wrap</span><span>"</span><span> Text</span><span>=</span><span>"</span><span>9</span><span>"</span><span> FontSize</span><span>=</span><span>"</span><span>21.333</span><span>"</span><span> FontFamily</span><span>=</span><span>"</span><span>Arial Rounded MT Bold</span><span>"</span><span> TextAlignment</span><span>=</span><span>"</span><span>Center</span><span>"</span><span> HorizontalAlignment</span><span>=</span><span>"</span><span>Left</span><span>"</span><span> Width</span><span>=</span><span>"</span><span>30</span><span>"</span><span>/&gt;</span><span></span><span> 8</span> <span>      </span><span>&lt;</span><span>Rectangle x:Name</span><span>=</span><span>"</span><span>Segundos</span><span>"</span><span> Fill</span><span>=</span><span>"</span><span>Red</span><span>"</span><span> HorizontalAlignment</span><span>=</span><span>"</span><span>Right</span><span>"</span><span> Margin</span><span>=</span><span>"</span><span>0,238,316,151</span><span>"</span><span> Stroke</span><span>=</span><span>"</span><span>Red</span><span>"</span><span> Width</span><span>=</span><span>"</span><span>1</span><span>"</span><span> RenderTransformOrigin</span><span>=</span><span>"</span><span>0.5,0</span><span>"</span><span> RadiusY</span><span>=</span><span>"</span><span>0.5</span><span>"</span><span> RadiusX</span><span>=</span><span>"</span><span>0.5</span><span>"</span><span>/&gt;</span><span></span><span> 9</span> <span>      </span><span>&lt;</span><span>Rectangle x:Name</span><span>=</span><span>"</span><span>Minutos</span><span>"</span><span> Fill</span><span>=</span><span>"</span><span>Black</span><span>"</span><span> HorizontalAlignment</span><span>=</span><span>"</span><span>Right</span><span>"</span><span> Margin</span><span>=</span><span>"</span><span>0,238,316,151</span><span>"</span><span> Stroke</span><span>=</span><span>"</span><span>Black</span><span>"</span><span> Width</span><span>=</span><span>"</span><span>1</span><span>"</span><span> RenderTransformOrigin</span><span>=</span><span>"</span><span>0.5,0</span><span>"</span><span> RadiusY</span><span>=</span><span>"</span><span>0.5</span><span>"</span><span> RadiusX</span><span>=</span><span>"</span><span>0.5</span><span>"</span><span>/&gt;</span><span></span><span>10</span> <span>      </span><span>&lt;</span><span>Rectangle x:Name</span><span>=</span><span>"</span><span>Horas</span><span>"</span><span> Fill</span><span>=</span><span>"</span><span>Black</span><span>"</span><span> HorizontalAlignment</span><span>=</span><span>"</span><span>Right</span><span>"</span><span> Margin</span><span>=</span><span>"</span><span>0,237,312,174</span><span>"</span><span> Width</span><span>=</span><span>"</span><span>9</span><span>"</span><span> RenderTransformOrigin</span><span>=</span><span>"</span><span>0.5,0</span><span>"</span><span> RadiusY</span><span>=</span><span>"</span><span>4</span><span>"</span><span> RadiusX</span><span>=</span><span>"</span><span>4</span><span>"</span><span>/&gt;</span><span></span><span>11</span> <span></span><span>&lt;/</span><span>Grid</span><span>&gt;</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p align="justify">Ahora vamos a añadir el código para que se muevan las agujas según pasa el tiempo, para ello podemos pulsar con el botón derecho sobre la solución y abrir desde Blend el VisualStudio.</p>
<p align="center">&nbsp; <a href="http://labloguera.net/photos/csharp/picture195050.aspx" target="_blank"><img src="http://labloguera.net/photos/csharp/images/195050/428x319.aspx" border="0"></a></p>
<p align="justify">Si abrimos MainPage.xaml.cs evidentemente va a estar vacío, aquí lo que vamos a hacer es crearnos un Timer que cuando “salte” actualice la rotación de las agujas. </p>
<p align="justify">Para ello tenemos que añadir un namespace System.Windows.Threading y declararnos un objeto global de tipo DispacherTimer. Este objeto que creamos dentro del constructor de la clase se tiene que actualizar cada segundo y cada vez que se actualice llamaremos al método correspondiente para que renueve la posición de las agujas.</p>
<div style="padding: 0px;width: 583px;float: none;margin-left: auto;margin-right: auto" class="wlWriterEditableSmartContent">
<pre style="width: 583px;height: 259px;background-color: White;overflow: auto;font-family: Microsoft Sans Serif">
<div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span> 1</span> <span>using</span><span> System;</span><span> 2</span> <span></span><span>using</span><span> System.Collections.Generic;</span><span> 3</span> <span></span><span>using</span><span> System.Linq;</span><span> 4</span> <span></span><span>using</span><span> System.Net;</span><span> 5</span> <span></span><span>using</span><span> System.Windows;</span><span> 6</span> <span></span><span>using</span><span> System.Windows.Controls;</span><span> 7</span> <span></span><span>using</span><span> System.Windows.Documents;</span><span> 8</span> <span></span><span>using</span><span> System.Windows.Input;</span><span> 9</span> <span></span><span>using</span><span> System.Windows.Media;</span><span>10</span> <span></span><span>using</span><span> System.Windows.Media.Animation;</span><span>11</span> <span></span><span>using</span><span> System.Windows.Shapes;</span><span>12</span> <span></span><span>using</span><span> System.Windows.Threading;</span><span>13</span> <span></span><span>14</span> <span></span><span>namespace</span><span> relojDeAgujas</span><span>15</span> <span>{</span><span>16</span> <span>  </span><span>public</span><span> </span><span>partial</span><span> </span><span>class</span><span> MainPage : UserControl</span><span>17</span> <span>  {</span><span>18</span> <span>        DispatcherTimer miReloj;</span><span>19</span> <span></span><span>20</span> <span>    </span><span>public</span><span> MainPage()</span><span>21</span> <span>    {</span><span>22</span> <span>      InitializeComponent();</span><span>23</span> <span></span><span>24</span> <span>            miReloj </span><span>=</span><span> </span><span>new</span><span> DispatcherTimer();</span><span>25</span> <span>            miReloj.Interval </span><span>=</span><span> TimeSpan.FromSeconds(</span><span>1</span><span>);</span><span>26</span> <span>            miReloj.Tick </span><span>+=</span><span> </span><span>new</span><span> EventHandler(miReloj_Tick);</span><span>27</span> <span>            miReloj.Start();</span><span>28</span> <span>    }</span><span>29</span> <span></span><span>30</span> <span>        </span><span>void</span><span> miReloj_Tick(</span><span>object</span><span> sender, EventArgs e)</span><span>31</span> <span>        {</span><span>32</span> <span>            RotateTransform rotateTransform </span><span>=</span><span> </span><span>new</span><span> RotateTransform();</span><span>33</span> <span>            rotateTransform.Angle </span><span>=</span><span> DateTime.Now.Second </span><span>*</span><span> </span><span>6</span><span> </span><span>+</span><span> </span><span>180</span><span>;</span><span>34</span> <span>            Segundos.RenderTransform </span><span>=</span><span> rotateTransform;</span><span>35</span> <span></span><span>36</span> <span>            rotateTransform </span><span>=</span><span> </span><span>new</span><span> RotateTransform();</span><span>37</span> <span>            rotateTransform.Angle </span><span>=</span><span> DateTime.Now.Minute </span><span>*</span><span> </span><span>6</span><span> </span><span>+</span><span> </span><span>180</span><span>;</span><span>38</span> <span>            Minutos.RenderTransform </span><span>=</span><span> rotateTransform;</span><span>39</span> <span></span><span>40</span> <span>            rotateTransform </span><span>=</span><span> </span><span>new</span><span> RotateTransform();</span><span>41</span> <span>            </span><span>int</span><span> lahora </span><span>=</span><span> Convert.ToInt32(DateTime.Now.ToString(</span><span>"</span><span>hh</span><span>"</span><span>));</span><span>42</span> <span>            rotateTransform.Angle </span><span>=</span><span> (lahora</span><span>*</span><span>30</span><span>) </span><span>+</span><span> (DateTime.Now.Minute</span><span>*</span><span> </span><span>0.5</span><span>) </span><span>+</span><span> </span><span>180</span><span>;</span><span>43</span> <span>            Horas.RenderTransform </span><span>=</span><span> rotateTransform;</span><span>44</span> <span>        }</span><span>45</span> <span>  }</span><span>46</span> <span>}</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p align="justify">&nbsp; </p>
<p align="justify">Para calcular los grados que tengo que avanzar cada aguja del reloj hay que tener en cuenta lo siguiente: el reloj analógico se divide en 12 partes y cada una de ellas en 5, por lo que durante una hora la aguja que la marca las horas de mueve 30 grados. </p>
<ul>
<li>
<p align="justify">El recorrido de 30 grados no lo hace de golpe sino que cada minuto avanza un poco, exactamente 0,5 grados (30 / 60 = 0,5).</p>
</li>
<li>
<p align="justify">El minutero da la vuelta entera al reloj por lo que recorre 360 grados en una hora o lo que es lo mismo 6 grados cada minuto.</p>
</li>
<li>
<p align="justify">Por último tenemos al segundero que al igual que el minutero se mueve de 6 en 6 grados pero al segundo.</p>
</li>
</ul>
<p align="justify">Si repasamos el código que mueve el minutero y segundero lo que vemos es que hago uso de un objeto RotateTransform que me ayuda a rotar cada objeto de la pantalla. El ángulo lo obtengo multiplicando el minuto o segundo de ese instante por 6 y le sumo 180, esto último es para corregir el ángulo resultante y que aparezca en el lugar adecuado. Por ultimo aplico la transformación al objeto. </p>
<p align="justify">&nbsp;</p>
<div style="padding: 0px;width: 583px;float: none;margin-left: auto;margin-right: auto" class="wlWriterEditableSmartContent">
<pre style="width: 583px;height: 151px;background-color: White;overflow: auto;font-family: Microsoft Sans Serif">
<div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span>1</span> <span>            RotateTransform rotateTransform </span><span>=</span><span> </span><span>new</span><span> RotateTransform();</span><span>2</span> <span>            rotateTransform.Angle </span><span>=</span><span> DateTime.Now.Second </span><span>*</span><span> </span><span>6</span><span> </span><span>+</span><span> </span><span>180</span><span>;</span><span>3</span> <span>            Segundos.RenderTransform </span><span>=</span><span> rotateTransform;</span><span>4</span> <span></span><span>5</span> <span>            rotateTransform </span><span>=</span><span> </span><span>new</span><span> RotateTransform();</span><span>6</span> <span>            rotateTransform.Angle </span><span>=</span><span> DateTime.Now.Minute </span><span>*</span><span> </span><span>6</span><span> </span><span>+</span><span> </span><span>180</span><span>;</span><span>7</span> <span>            Minutos.RenderTransform </span><span>=</span><span> rotateTransform;</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>De la misma manera realizo el cálculo para la aguja de las Horas solo que debo tener en cuenta que el sistema me da las horas en formato 24H y yo necesito que me devuelva un valor que no pase del 12, para ello formateo la salida de DateTime.Now y la convierto a entero.</p>
<div style="padding: 0px;width: 583px;float: none;margin-left: auto;margin-right: auto" class="wlWriterEditableSmartContent">
<pre style="width: 583px;height: 86px;background-color: White;overflow: auto;font-family: Microsoft Sans Serif">
<div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span>1</span> <span>            rotateTransform </span><span>=</span><span> </span><span>new</span><span> RotateTransform();</span><span>2</span> <span>            </span><span>int</span><span> lahora </span><span>=</span><span> Convert.ToInt32(DateTime.Now.ToString(</span><span>"</span><span>hh</span><span>"</span><span>));</span><span>3</span> <span>            rotateTransform.Angle </span><span>=</span><span> (lahora</span><span>*</span><span>30</span><span>) </span><span>+</span><span> (DateTime.Now.Minute</span><span>*</span><span> </span><span>0.5</span><span>) </span><span>+</span><span> </span><span>180</span><span>;</span><span>4</span> <span>            Horas.RenderTransform </span><span>=</span><span> rotateTransform;</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>Y con estas pocas líneas tenemos nuestro primer programa en Silverlight <img src='http://labloguera.net/cesar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  a continuación tenéis el código disponible para descargar.</p>
]]></content:encoded>
			<wfw:commentRss>http://labloguera.net/cesar/2010/12/09/silverlight-comenzando-con-un-ejemplo-sencillo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

