[WP7] Libro por capítulos: Programar en Silverlight para Windows Phone 7

Hola a todos!

Llevo un tiempo trabajando en este proyecto que hoy quiero compartir con vosotros.

Se trata de un libro sobre programación en Silverlight para Windows Phone 7, intentaré cubrir todos los puntos posibles del desarrollo e ir teniendo lista un capitulo al menos por mes y los iré dejando en formato PDF en el blog para que podáis descargarlos y usarlos a vuestro antojo Sonrisa.

Bueno, pues hoy arrancamos con el 1º capítulo, una introducción a Windows Phone 7 y Silverlight que nos preparará el terreno para los siguientes, este es el índice:

ACTUALIZACIÓN:

En azul están resaltadas las nuevas secciones sobre Windows Phone “Mango”, el resto de secciones han sufrido pequeños cambios o añadidos:

1º Capítulo: Conociendo Windows Phone 7

1.- Introducción.

2.- Arquitectura de Windows Phone 7.

2.1.- Modelo de Hardware.

2.2.- Modelo de Software.

2.2.1.- Modelo de Aplicación.

2.2.2.- Modelo de UI

2.2.3.- Integración con la nube.

2.2.4.- Application runtime.

3.- Preparando nuestro entorno.

3.1.- Descargando el SDK.

3.2.- Microsoft Visual Studio 2010 para Windows Phone 7.

3.2.1.- Windows Phone Application.

3.2.2.- Windows Phone Databound Application.

3.2.3.- Windows Phone Class Library.

3.2.4.- Windows Phone Panorama Application.

3.2.5.- Windows Phone Pivot Application.

3.2.6.- Windows Phone 3D Graphics Application.

3.2.7.- Windows Phone Audio Playback Agent.

3.2.8.- Windows Phone Audio Streaming Agent.

3.2.9.- Windows Phone Task Scheduler Agent.

3.3.- Microsoft Expression Blend 4 para Windows Phone 7.

3.4.- Emulador de Windows Phone 7.

4.- Silverlight para Windows Phone.

4.1.- ¿Qué es Silverlight para Windows Phone?.

4.2.- Silverlight para Windows Phone “Mango”

5.- Conclusión del capítulo.

 

Por supuesto, se admiten sugerencias sobre los temas a tratar o cualquier cosa sobre el tema que se os ocurra, este libro pretende aunar todos mis conocimientos sobre la plataforma en un lugar concreto y de forma ordenada para que sea sencillo para cualquiera acceder a ellos.

Aquí os dejo el enlace al primer capítulo:

Programar en Silverlight para Windows Phone 7, Capítulo 1: Conociendo Windows Phone 7

 ACTUALIZACIÓN:

Ya podéis descargar este capítulo en versión MobiPocket compatible con ebooks (iRiver, Kindle, Papyre…) aquí Espero que lo disfrutéis!!

ACTUALIZACIÓN WINDOWS PHONE “MANGO” :

Ya está disponible la versión actualizada al nuevo SDK de Mango del capítulo cubriendo las nuevas características de Mango, en el zip podéis encontrar el capítulo en pdf y en .mobi para eBooks:

Un saludo, espero que os guste y Happy Coding!

Estoy en la nube: Ya está en el marketplace de Windows Phone 7

ApplicationIcon

Hola a todos!

Desde hoy puedes descargar para tu Windows Phone 7 una aplicación que te mantendrá al día de las novedades de Windows Azure, Office 365 y todo este mundo del Cloud Computing de Microsoft, de la mano de Ibon Landa, uno de los mayores expertos en Azure que podemos encontrar en nuestro país, junto con artículos de Unai Zorrilla y otros compañeros, que podéis encontrar regularmente en www.estoyenlanube.com

screenshot001screenshot002

Puedes descargar la aplicación directamente en el siguiente enlace, espero que te guste!

download from marketplace

Un saludo y Happy Coding!

[EVENTO] Scrum Week Madrid 2011

Hola a todos!

la semana del 4 de abril se llevará a cabo una semana de formación Ágil con grandes ponentes como Rodrigo Corral, Jose Luis Soria, Ibon Landa, Angel Medinilla, Unai Zorrilla y Alejandro Barrera.

Si te interesa aprender de una forma profesional y de primera mano sobre Arquitecturas ágiles, Coaching de equipos ágiles, Scrum, pruebas unitarias, y muchas cosas más no puedes perdertela, un must have en el calendario de formación anual:

http://www.scrumweek.com/proximas-ediciones/scrumweek-madrid-4-8-de-abril-de-2011/

Un saludo y Happy Coding

[BMOS] Barcelona Mobile Open Space 2011

Hola a todos,

Este sábado 19 de marzo de 2011 he tenido la suerte y el gran placer de asistir a un evento organizado por Agile Barcelona y Catdroid  sobre agilismo y tecnologías móviles, con  115 inscritos oficialmente y 75 asistentes finalmente.

En principio pensé que me encontraría en lo que yo llamo “territorio comanche”, puesto que la mayoría de los asistentes son profesionales del desarrollo móvil para Android e Iphone, y yo era en principio el único desarrollador de Windows Phone 7.

El formato open space se basa en la auto organización de los asistentes, los cuales proponen los temas de los que quieren hablar, debatir o exponer, y luego entre todos se eligen por votación las sesiones y se colocan en su horario por importancia:

WP_000068

@vgaltes poniendo orden en el panel jeje

Es sorprendente como se consigue meter a 75 personas que no se conocen casi de nada en una sala, con intereses muy diferentes, incluso en algunos casos intereses contrapuestos o enfrentados, y estos son capaces de organizar una agenda de 24 sesiones, a lo largo de 9 horas de una forma cívica y respetuosa, un aplauso a todos los asistentes de mi parte, sois un ejemplo único para cualquiera.

Las sesiones que pudimos ver fueron de lo más variado, Contratos Ágiles, Introducción al agilismo, tecnología NFC, accesibilidad en aplicaciones móviles,  localización de aplicaciones móviles, monetización de aplicaciones móviles… por mi parte propuse dos charlas, una mesa redonda sobre las tres plataformas presentes: iOS, Android y Windows Phone 7, y un taller práctico de Windows Phone 7, al principio tuve mis serias dudas de que la gente se apuntase a ellas, pero la gente las votó y finalmente, junto con un taller de Android y un taller de Iphone realizamos el taller de Windows Phone 7 y la mesa redonda (antes de los talleres) a modo de introducción.

WP_000071

Taller de Android con @sergiandreplace

 

WP_000072

Taller de iOS con @openinput y @pedromsantos

 

260489005

Taller de Windows Phone 7 con @josueyeray (ese soy yo… )

 

Por mi parte tengo que decir, Android me sorprendió gratamente, Eclipse ha mejorado mucho (aunque aun está lejos de Visual Studio) y funciona bastante bien, aunque nos comentó @sergiandreplace que el emulador fallaba bastante (en eso también ganamos, nuestro emulador va muuy bien). Lamentablemente, aunque me pareció una charla muy interesante, iOS me parece igual que siempre, aunque estábamos viendo la ultima versión de las herramientas de desarrollo (XCode 4.3) me dio la impresión de herramienta complicada y un poco revuelta, eso sin hablar de Objetive-C, creo que Apple se ha quedado en los 80 en cuanto a sus herramientas de desarrollo.

También me sorprendió mucho lo maravillada que se quedo la gente con Visual Studio 2010 y Expression Blend, teniendo en cuenta que la mayoría de los asistentes eran desarrolladores Android e iOS, creo que se sorprendieron de lo bien que funcionan las herramientas de Microsoft para Windows Phone y lo productivas que son. Estos son algunos tweets al respecto durante la charla de Windows Phone 7:

“iOs y Android toca ponerse las pilas q llega WP7 con muchas ganas. Genial demo de @JosueYeray en #bmos”

“Que bien nos ha vendido WP7 @JosueYeray en el #bmos. En la mesa redonda sólo ha convencido esta plataforma y yo programo para Android”

Podéis encontrar todos los tweets del día buscando el hashtag #bmos.

Mientras nosotros nos divertíamos picando Java, Objetive-C y C#, @vgaltes y otros abnegados justicieros del agilismo celebraban una dura sesión sobre contratos ágiles:

WP_000073

Esto es trabajar duro por el agilismo… pobrecitos jeje.

Como no todo en esta vida es agilismo y picar código, también tuvimos un descanso para comer y… seguir debatiendo Sonrisa

cabr

Hay estamos @josueyeray y @vgaltes, haciendo imagen corporativa con nuestros polos de Plain Concepts

 

En definitiva un muy buen evento, donde todos hemos aprendido y donde primaron el respeto y las ganas de conocer, frente a las diferencias y los fanatismos.

Enhorabuena a la organización y a todos los asistentes, espero que pronto podamos coincidir en otro evento.

[WP7] Actualización de Marzo de Cloud Services SDK (Project Hawaii)

image

Hola a todos!

 

El 4 de marzo Microsoft actualizó el SDK de Cloud Services para Windows Phone, si no has oído hablar de él, revisa esta entrada de mi blog para encontrar una introducción a este kit de desarrollo que nos permite aprovechar el potencial de azure desde nuestros teléfonos de forma sencilla.

En esta nueva versión se ha incluido un nuevo sample y documentación para usarlo sobre una de las características más interesantes de Cloud Services: STT (Speech To Text o Reconocimiento de voz) que nos permite usar nuestro dispositivo WP7 como si de una grabadora se tratase para acto seguido enviar el audio a azure y obtener como resultado una transcripción del audio enviado.

Una vez enviado el audio, recibimos varias opciones de transcripción del mismo, para que podamos escoger la que mejor se ajuste a la realidad, en la siguiente imagen le enviamos un “Hello World” y esto son los resultados que obtenemos:

image

Como podemos observar varios resultados coinciden completamente, por lo que podríamos obtener el resultado que es igual un mayor numero de veces y aceptarlo como bueno si quisiésemos realizar este paso sin mostrar opciones al usuario.

Por ahora solo cuenta con un tipo de diccionario de voz: independiente del contexto y en ingles, pero debemos recordar que todavía hablamos de un SDK en pleno desarrollo y no de una versión final.

En el sample incluido en el SDK disponemos de un archivo wav pregrabado que podemos usar para probar que el servicio funciona correctamente. Para que funcione correctamente debemos realizar varios pasos, os dejo un video explicando cada uno de ellos y viendo el sample en acción:

WP7 Speech to Text en acción

No dejéis de descargaros esta nueva versión y jugar con ella (aquí), creo que es uno de los grandes potenciales de WP7 y que en el futuro dará mucho juego a los desarrolladores.

Un saludo a todos y Happy Coding!

[WPF] Localización de aplicaciones

Hola a todos!

Ayer hablando con Jorge Serrano, Lluis Franco, Javier Torrecilla y Eduard Tomàs por twitter surgía la duda de como y cual es la mejor forma de localizar aplicaciones en WPF.

Actualmente existen dos métodos ampliamente usados para localizar nuestra aplicación WPF.

El más extendido se basa en usar archivos de recursos (resx) que contengan los textos en diferentes idiomas y, usando una clase wrapper, mediante un ObjectDataProvider enlazar a estos recursos de forma que cuando el idioma cambie en la cultura de la aplicación, el ObjectDataProvider refresque los bindings de los textos hacia el idioma correcto.

El otro método se basa en el uso de ensamblados satélites. Debemos marcar los objetos que queramos traducir en XAML con el atributo Uid, luego, usando una herramienta llamada BamlTool exportaremos todos estos objetos junto a sus textos a un fichero que podemos editar y traducir para acto seguido, usando la herramienta BamlTool de nuevo generar un ensamblado con nuestros textos traducidos. Repetimos estos pasos por tantos idiomas como deseemos controlar y automáticamente cuando la aplicación detectará el idioma actual y usará el ensamblado apropiado.

Oficialmente, a partir de .NET 3.5 Microsoft recomienda usar el segundo método, los ensamblados satélites, aunque ambos métodos presentan sus más y sus menos.

Mucha gente (la mayoría de hecho) siguen usando el método de archivos de recursos resx, aunque Microsoft se empeña en dejar bien claro que los archivos resx están obsoletos para estos menesteres.

El problema principalmente lo encontramos en que, cada vez que añadamos un control nuevo a nuestra aplicación, con la solución de los archivos de recursos, solo debemos añadir el texto de este control a cada archivo resx en su correspondiente idioma, mientras que con la técnica de bamltool debemos regenerar los ensamblados satélites una y otra vez, lo cual nos obliga a ir a la linea de comandos, ejecutar la herramienta,… además, la herramienta bamltool está actualmente en estado beta, por lo que, aunque Microsoft nos recomienda usarla, la usamos “as is” sin ninguna garantía… lo cual hace que a muchos les tiemble la mano al tener que usarla en entornos de producción, algo totalmente comprensible.

Bueno, aun así, como estos son los dos métodos mayoritariamente aceptados como válidos (supongo que habrá más formas de localizar una app, los caminos del código son infinitos) vamos a ver un ejemplo de cada uno de ellos y que el lector se encargue de elegir por sí mismo el camino más adecuado para su situación.

Usando recursos

Bueno, para empezar, vamos a crear una aplicación WPF nueva con una interface muy sencilla, unos botones (3) y un textblock, algo así:

image

El código XAML necesario es realmente sencillo:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width=".3*"></ColumnDefinition>
        <ColumnDefinition Width=".3*"></ColumnDefinition>
        <ColumnDefinition Width=".3*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="30"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <TextBlock Grid.ColumnSpan="3" Grid.Row="0"
                HorizontalAlignment="Center"
                VerticalAlignment="Top"
                Text="Prueba de cambio dinámico de idiomas"></TextBlock>
        
    <Button Content="Español" Grid.Row="1" Grid.Column="0" Margin="5"></Button>
    <Button Content="Ingles" Grid.Row="1" Grid.Column="1" Margin="5"></Button>
    <Button Content="Italiano" Grid.Row="1" Grid.Column="2" Margin="5"></Button>
</Grid>

Una vez creado nuestro interface de usuario, el cual tiene los textos Hard coded en el propio XAML algo que no es demasiado elegante, vamos a crear unos archivos de recursos para poder tener nuestra aplicación en español, ingles e italiano, para mantener algo de orden en la solución los agruparemos en una carpeta idiomas y los llamaremos idiomas.resx, idiomas.en.resx e idiomas.it.resx, uno para cada idioma:

image

Una vez creados, es muy importante que entremos en cada archivo de recursos y establezcamos su modificador de acceso (Access Modifier) a public, para poder acceder a las cadenas de texto de los recursos usando nombres fuertemente tipados:

image

Una vez hecho todo esto, vamos a crear en cada archivo unos recursos para el textblock y otro para cada botón. Recuerda, querido lector, que para que todo funcione correctamente en todos los archivos de recursos una cadena debe tener el mismo nombre, aunque cambiemos su valor dependiendo del idioma:

image

Ahora ya tenemos los textos de nuestra aplicación en un archivo de recursos, vamos a crear una clase Wrapper que nos permita acceder a ellos desde un ObjectDataProvider y enlazarnos a el mediante XAML:

public class WrapperIdiomas
{
    private static ObjectDataProvider m_provider;
        
    public WrapperIdiomas()
    {
    }

    //devuelve una instancia nueva de nuestros recursos.
    public idiomas GetResourceInstance()
    {
        return new idiomas();
    }

    //Esta propiedad devuelve el ObjectDataProvider en uso.
    public static ObjectDataProvider ResourceProvider
    {
        get
        {
            if (m_provider == null)
                m_provider = (ObjectDataProvider)App.Current.FindResource("IdiomasRes");
            return m_provider;
        }
    }

    //Este método cambia la cultura aplicada a los recursos y refresca la propiedad ResourceProvider.
    public static void ChangeCulture(CultureInfo culture)
    {
        Properties.Resources.Culture = culture;
        ResourceProvider.Refresh();
    }
}

Esta clase es muy sencilla, se compone de varios métodos que se encargan de refrescar el idioma (cultura) aplicado en la aplicación y devolver los recursos apropiados para la cultura establecida.

Una vez hecho esto, vamos a crear nuestro ObjectDataProvider en el archivo App.Xaml:

Primero debemos referenciar el namespace donde se encuentra nuestro wrapper:

xmlns:idiomas="clr-namespace:Resources.idiomas"

Ahora crearemos el ObjectDataProvider:

<ObjectDataProvider x:Key="IdiomasRes" 
                    ObjectType="{x:Type idiomas:WrapperIdiomas}" 
                    MethodName="GetResourceInstance">
</ObjectDataProvider

Ahora ya podremos enlazar nuestros controles en XAML, usando Databinding, directamente al recurso que deseemos. Es recomendable recompilar el proyecto antes de enlazar en XAML:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width=".3*"></ColumnDefinition>
        <ColumnDefinition Width=".3*"></ColumnDefinition>
        <ColumnDefinition Width=".3*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="30"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <TextBlock Grid.ColumnSpan="3" Grid.Row="0"
        HorizontalAlignment="Center"
        VerticalAlignment="Top"
        Text="{Binding Texto, Source={StaticResource IdiomasRes}}"></TextBlock>

    <Button Content="{Binding Boton_español, Source={StaticResource IdiomasRes}}" 
            Grid.Row="1" Grid.Column="0" Margin="5" Click="Español_Click"></Button>
    <Button Content="{Binding Boton_ingles, Source={StaticResource IdiomasRes}}" 
            Grid.Row="1" Grid.Column="1" Margin="5" Click="Ingles_Click"></Button>
    <Button Content="{Binding Boton_italiano, Source={StaticResource IdiomasRes}}" 
            Grid.Row="1" Grid.Column="2" Margin="5" Click="Italiano_Click"></Button>
</Grid>

Como podemos ver, ahora ya tenemos una solución mucho más decente, que nos permite reutilizar cadenas y no tener textos escritos por nuestro XAML. Si todo ha ido bien, si abres la vista de diseño, verás los textos en el idioma del sistema operativo (siempre que esté en español, ingles o italiano) ya queda muy poco para terminar, vamos a indicarle a cada botón en el evento click, que cambie la cultura de la aplicación a la que le corresponda y que llame al método ChangeCulture de nuestro wrapper:

private void Español_Click(object sender, RoutedEventArgs e)
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-ES");
    idiomas.WrapperIdiomas.ChangeCulture(Thread.CurrentThread.CurrentUICulture);
}

private void Ingles_Click(object sender, RoutedEventArgs e)
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB");
    idiomas.WrapperIdiomas.ChangeCulture(Thread.CurrentThread.CurrentUICulture);
}

private void Italiano_Click(object sender, RoutedEventArgs e)
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("it-IT");
    idiomas.WrapperIdiomas.ChangeCulture(Thread.CurrentThread.CurrentUICulture);
}

Y con esto, si ejecutamos nuestra aplicación, veremos que por defecto usa el idioma de nuestro  S.O. y podemos cambiar el idioma pulsando cada uno de los botones.

Conclusión

Como os comente al inicio, cada uno de los métodos que podemos usar tiene sus inconvenientes, el gran inconveniente que tiene a mi entender esta aproximación mediante recursos es que no es interoperable entre WP7, Silverlight y WPF, puesto que Silverlight, tanto en su versión web como móvil, carecen del objeto ObjectDataProvider, lo que evita que podamos compartir de forma incondicional este método.

En un próximo artículo veremos como generar ensamblados satélites y traducir nuestras aplicaciones, también veremos como localizar aplicaciones silverlight y Wp7.

Os dejo una demo con código, espero que os guste tanto leer este artículo como a mi escribirlo.

Un gran saludo y Happy Coding!