March 2012 - Artículos

[OFF TOPIC] Nokia Developer Champion 2012

nok_champion

Hola a todos!

Me ha hecho mucha ilusión ver en mi bandeja de entrada este correo:

“Since 2006, Forum Nokia has been selecting individuals from the Nokia developer community to join the Nokia Developer Champion program; a recognition and reward program that honors a select group of mobile developers from around the world. We are pleased to inform you that as one of the outstanding talents in our developer community,you have been selected as one of a few elite members of the Nokia Developer Champion Program. Congratulations!”

Y quería compartirlo con todos vosotros.

Muchas gracias a todos por el apoyo que me dais y por leer mi blog, preguntar y escuchar mis respuestas. Esto es gracias a vosotros!

Un saludo y Happy Coding!

Publicado por Josué Yeray Julián Ferreiro con 3 comment(s)
Archivado en: ,

[Windows Phone 7.5] Promociones y Concursos

Hola a todos!

   

Hoy para empezar el fin de semana con buen pie quiero comentaros algunos concursos y promociones sobre desarrollo para Windows Phone que se han puesto en marcha recientemente por parte de Microsoft y Nokia. En todos ellos tenemos la posibilidad de conseguir móviles Lumia 800 de Nokia para poder realizar  nuestras aplicaciones así que no se puede dejar escapar!

Microsoft a vuelto a arrancar el concurso semanal de desarrollo para Windows Phone que habían llevado a cabo en Navidades. El premio: 5 Lumia 800 a la semana, ¿Cómo conseguirlo? Desarrollas una aplicación y la subes al marketplace, luego vas a la página del concurso (aquí) e inscribes tu aplicación. Entre todos los participantes semanales se sortearán 3 Nokia Lumia 800. Pero la gran novedad de esta edición es que, antes de realizar el sorteo, un jurado compuesto por gente de Microsoft escogerá semanalmente 2 aplicaciones por su calidad, originalidad, UX, uso de capacidades, etc... y estos dos se llevarán directamente un Lumia 800 y no participarán en el sorteo. Moraleja: Dale toda la calidad que puedas a tu aplicación, trabájala y tendrás muchas posibilidades de tener un Lumia 800 en tus manos!

El concurso se llevará acabo desde el 16 de abril hasta el 10 de junio, así que ya puedes correr a empezar a desarrollar. Cuando tengas tu aplicación en el marketplace registrate en el concurso para optar al sorteo de esa misma semana y mucha suerte :)

Cuenta de publicador

Yeray, todo esto está muy bien pero... Tengo que hacerme una cuenta de publicador y cuesta 75 € y soy estudiante/estoy en paro/no quiero pagar... ¿Qué puedo hacer? Pues no hay problema. Microsoft puede ayudaros con un cupón de subscripción gratuita de 1 año al marketplace de Windows Phone. Para esto tenéis que escribir a la gente de soporte de Windows Phone en Microsoft Ibérica: sopwp7@microsoft.com les contáis que queréis desarrollar apps para Windows Phone y que os gustaría tener un cupón de registro. Pedirán que les habléis de las aplicaciones, que mandéis alguna captura de la App ejecutándose en el emulador y sin poneros ningún problema y muy rápidamente os enviarán el cupón y ya está! solucionado, un año gratis en el marketplace para que podáis realizar el próximo Angry Birds, eso sí, si os hacéis ricos, el segundo año ya lo tenéis que pagar!

Esto es todo amigos!

Espero que todo esto ayude a decidiros a apostar por Windows Phone y el desarrollo. Ya me contaréis que apps han salido de estas promociones.

Un saludo y Happy Coding!

[Windows Phone 7.5] Creando un DataContextProxy

Hola a todos!

Hoy vamos a ver un tema muy interesante y que puede salvarnos en alguna ocasión. Hablamos del DataContextProxy pero… ¿Qué es esto Yeray? Vamos allá!

¿Qué es un DataContextProxy y para que sirve?

Cuando creamos una aplicación Windows Phone usando el patrón MVVM (esto es, siempre. Porque siempre usamos MVVM ¿Verdad?) Establecemos nuestra ViewModel en la propiedad DataContext de nuestra View, de forma que todos nuestros controles lo usan como fuente de datos y nos permite enlazarnos a las propiedades de la VievModel, algo así:

image

Un caso muy simple, un ComboBox que mediante enlace a datos y apoyándose en el DataContext de la View accede a una propiedad expuesta por el ViewModel. No existe ninguna complejidad en este escenario.

Ahora, vamos a imaginar un caso más complejo: Tenemos el ComboBox incluido como parte de un DataTemplate de un ListBox:

image

Con esta configuración, el DataContext del ComboBox corresponde a cada Item del ListBox, es decir, una instancia de la clase Customer, por lo que no podemos acceder a las propiedades expuestas por la ViewModel. Esta situación es muy común, por ejemplo si queremos tener un botón como parte de un DataTemplate y que ese botón use un ICommand expuesto en nuestra ViewModel. Normalmente, podríamos acceder al DataContext de la página, usando la propiedad del Binding ElementName:

<ListBox Name="lstCustomers" ItemsSource="{Binding Customers}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding CustomerName}"></TextBlock>
                <Button Content="Show" Command="{Binding DataContext.ShowCustomerCommand, ElementName=lstCustomers}"></Button>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Esto es totalmente correcto y nos permitiría acceder a la propiedad DataContext del elemento lstCustomers, con lo que ya tendríamos acceso a la ViewModel, pero no es algo que me parezca demasiado elegante de usar. Como las expresiones de enlace a datos no se validan en tiempo de diseño, a no ser que enlacemos con un StaticResource donde se valida su nombre, si cambiamos el nombre de la lista, aunque sea en una mayúscula… no lo encontrará y pasaremos un buen rato buscando el porqué no funciona nuestro comando.

Es aquí donde entra en juego el DataContextProxy. Básicamente se trata de un objeto que hereda de FrameworkElement (la clase base que incorpora a los controles, entre otras, la funcionalidad DataContext) y que es capaz de exponer mediante una propiedad el DataContext de su objeto padre, aprovechándonos de la herencia de propiedades que tiene FrameworkElement:

image

 

Siempre y cuando no establezcamos directamente la propiedad DataContext de un elemento, se heredará el valor de su contenedor, es por esto que podemos establecer la propiedad DataContext solo en la View y no tenemos que ir estableciéndola en cada control de la página.

Nuestro DataContextProxy se aprovechará de esta característica para exponer a través de una propiedad el DataContext de nuestra página. Podremos incluirlo en la misma como un recurso y acceder a el mediante la expresión StaticResource, lo que nos dará validación del nombre fuente en tiempo de diseño.

Muy bien, ¿Como lo implementamos?

Lo mejor de todo es que crear y usar un DataContextProxy es realmente trivial y sencillo. Lo primero que necesitamos es crear una nueva clase en nuestro proyecto Windows Phone que herede de FrameworkElement:

public class DataContextProxyService : FrameworkElement
{
    public DataContextProxyService()
    {
        this.Loaded += new RoutedEventHandler(DataContextProxyService_Loaded);
    }

    void DataContextProxyService_Loaded(object sender, RoutedEventArgs e)
    {
    }
}

Lo primero que haremos en el constructor de nuestra clase es manejar el evento Loaded para poder ejecutar el código necesario cuando nuestro servicio haya sido inicializado por la página que lo contenga.

A continuación vamos a crear una DependencyProperty que será el contenedor a través del cual expondremos nuestro DataContext:

public static readonly DependencyProperty DataSourceProperty =
    DependencyProperty.Register("DataSource", typeof(Object), typeof(DataContextProxyService), null);

public Object DataSource
{
    get { return (Object)GetValue(DataSourceProperty); }
    set { SetValue(DataSourceProperty, value); }
}

Ahora solo nos queda un último paso: Cuando recibamos el evento Loaded, vamos a crear un Binding que exponga nuestro DataContext a través de la propiedad DataSource:

void DataContextProxyService_Loaded(object sender, RoutedEventArgs e)
{
    Binding binding = new Binding();
    binding.Source = this.DataContext;
    this.SetBinding(DataContextProxyService.DataSourceProperty, binding);
}

Y con esto ya tenemos terminada nuestra clase DataContextProxy, ahora vamos a probarla, para empezar vamos a crear una página que tenga un Listbox con un DataTemplate que muestre un TextBlock con el nombre de un Item y un Button:

<ListBox ItemsSource="{Binding Customers}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Name}"></TextBlock>
                <Button Content="Click Me!"
                        Command="{Binding SayhelloCommand}"></Button>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Vamos a enlazar el DataContext de nuestra página a una ViewModel que contenga una Lista de Customers y un comando que se ejecute al presionar el botón:

public class VMMainPage : INotifyPropertyChanged
{
    private List<Customer> customers;
    public List<Customer> Customers 
    {
        get
        {
            return customers;
        }
        set 
        {
            customers = value;
            RaisePropertyChanged("Customers");
        }
    }

    private ICommand sayHelloCommand = null;
    public ICommand SayHelloCommand
    { 
        get
        {
            if (sayHelloCommand == null)
                sayHelloCommand = new DelegateCommand(() => { MessageBox.Show("Hello!"); });
            return sayHelloCommand;
        }
    }

    public VMMainPage()
    {
        var newCustomers = new List<Customer>()
                                        {
                                            new Customer() { Name = "Yeray" },
                                            new Customer() { Name = "Vicenç"},
                                            new Customer() { Name = "Ibon"}
                                        };

        Customers = newCustomers;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    { 
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

Si ejecutamos la aplicación veremos el siguiente resultado, el nombre del customer se muestra correctamente pero el comando no funciona:

image

Si miramos la ventana de Output veremos los siguientes errores:

image

Efectivamente, el sistema de enlace de Silverlight está buscando el comando SayHelloCommand dentro de cada item de la lista, por supuesto no lo encuentra. Aquí es donde entra en acción nuestro DataContextProxy: Lo primero es añadir una referencia a nuestro ensamblado en la página para que podamos acceder a los objetos de nuestra aplicación:

xmlns:dataproxy="clr-namespace:WP75DataContextProxy"

A continuación, vamos a definir una instancia de nuestra clase DataContextProxyService como recurso de la página en la que nos encontramos:

<phone:PhoneApplicationPage.Resources>
    <dataproxy:DataContextProxyService x:Key="DataProxy"></dataproxy:DataContextProxyService>
</phone:PhoneApplicationPage.Resources>

Y por último vamos a modificar el Binding del comando en el botón para que haga uso de la propiedad DataSource de nuestro DataContextProxyService:

<Button Content="Click Me!"
        Command="{Binding DataSource.SayHelloCommand, Source={StaticResource DataProxy}}">
</Button>

Esta vez, si iniciamos la aplicación y presionamos alguno de los botones, el resultado será distinto, el sistema de enlace a datos encontrará el comando en nuestro DataContext principal, el asignado a la ventana y no lo buscará en cada Item:

image

 

Conclusión

Usando esta técnica tenemos una forma sencilla y clara de poder obtener nuestro DataContext principal dentro de listas, combos, plantillas y otros elementos. Todo esto sin tener que referenciar elementos por nombre, usando un recurso estático y sin depender de elementos que mañana pueden no ser necesarios y puedan ser eliminados de la aplicación. Como siempre aquí os dejo el código de ejemplo que he usado en el artículo.

Espero que os sea muy útil. Happy Coding!

[Windows Phone 7.5] SDK 7.1.1 RTW con licencia GO LIVE

wplogo

 

Hola a todos!

Un post rápido, ya está disponible para descarga la versión final del SDK 7.1.1 de Windows Phone. Entra las novedades de esta versión final tenemos:

  • Imagen de emulador de 512Mb usa la build del sistema 8773
  • Actualización del SDK de Advertising incluida con solución a varios bugs
  • Soporte en intellisenses para especificar el requerimiento de 512Mb en el manifiesto
  • Soporte completo en Windows 8

Además de las novedades en cuanto a los dispositivos de baja memoria, sorprende la rapidez que han tenido en hacer que el emulador funcione en Windows 8, lo cual seguro que contenta a más de uno (yo me incluyo).

Podéis descargaros el SDK 7.1.1 aquí.

Disfrutadlo y Happy Coding!

Publicado por Josué Yeray Julián Ferreiro con no comments
Archivado en: ,,

[EVENTO CODEMOTION] Windows Phone 7.5 Design Patterns & Application Quality

Hola a todos!

wplogoimage

Ayer 24 de Marzo tuve la oportunidad de asistir a la primera edición en España del CODEMOTION. Además de poder asistir a algunas interesantes charlas y poder desvirtualizar a Luis Fraile y a El bruno entre otros, también tuve la oportunidad de impartir una charla sobre desarrollo avanzado para Windows Phone 7.5. En esta ocasión pudimos hablar sobre el patrón MVVM, Inyección de dependencias, servicios y testeo unitario.

Algo antes de comenzar la charla tuve la sorpresa de saber que Oscar Gutierrez, developer relations manager de Nokia Spain, vendría a acompañarme un rato en la misma para hacer una interesante proposición a los asistentes y presentar los recursos de desarrollo que Nokia tiene disponibles para todos los desarrolladores de Windows Phone.

En esta ocasión quise destacar lo importante de desarrollar bien desde el principio, usando el patrón correcto, pensando en realizar código desacoplado, basado en servicios y usando IoC para resolver dependencias. También vimos como poder testear nuestro código de una forma eficiente e integrada con Visual Studio.

A continuación os dejo la presentación de la charla, en Slideshare, desde donde también podréis descargarla:

El proyecto que usé para ilustrar todos estos principios fue el que he desarrollado para nuestro podcast WPControla, podéis ver el código en http://wpcontrola.codeplex.com

Espero que os guste, yo desde luego disfruté como un niño en la charla.

Un abrazo y Happy Coding!

[Windows Phone 7.5] Podcast en español WPControla, episodio 3

wpcontrola_tile
Hola a todos!

Dicen que no hay dos sin tres así qué, aquí estamos con el tercer capítulo del podcast sobre desarrollo para Windows Phone que hago con Rafael Serna.

En este tercer capítulo entrevistamos a Jorge Cantón de Syderis, uno de los creadores del SDK multiplataforma CellSDK. También desgranamos las últimas noticias y hablamos sobre la publicidad en las aplicaciones y como mejorar un poco nuestras ganancias con ella.

Tienes un resumen completo y los enlaces del podcast aquí.

Espero que disfrutéis tanto escuchándolo como yo haciéndolo.

Un saludo y Happy Coding!

[Windows Phone 7.5] Creando nuestros propios Behaviors

Hola a todos!

En el último artículo sobre Expression Blend (puedes verlo aquí) hablamos sobre animaciones y como usar los behaviors incluidos en Silverlight para ejecutarlas. Pudimos ver como existen diferentes tipos de behaviors, pero no vimos como poder crear los nuestros propios para poder usarlos en nuestras aplicaciones.

Behavior<T>

Dentro del ensamblado System.Windows.Interactivity tenemos una clase llamada Behavior<T> de la cual podemos heredar para crear un behavior personalizado. La estructura mínima es la siguiente:

public class CustomBehavior : Behavior<Grid>
{
    protected override void OnAttached()
    {
        base.OnAttached();
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
    }
}

Con el código anterior indicamos que queremos crear un Behavior llamado CustomBehavior que podrá ser usado en elementos de tipo Grid. El método OnAttached se ejecutará cuando el behavior se añada al elemento Grid y el OnDetaching cuando se descargue del elemento. De esta forma podremos ejecutar el código que deseemos y tendremos una forma de limpiar las referencias, eventos, y todo lo necesario cuando el Behavior ya no sea necesario.

Un ejemplo práctico: Extendiendo el control WebBrowser

El control WebBrowser incluido en el SDK de Windows Phone es muy versátil para mostrar contenido HTML, incluso contiene un método llamado NavigateToString que nos permite mostrar en el control una cadena de texto con formato HTML. El problema que tiene es que no existe una propiedad que podamos usar desde XAML directamente para mostrar el contenido de una propiedad, siempre necesitamos usar Code Behind para atacar a este método, algo parecido a esto:

<Grid x:Name="LayoutRoot" Background="Transparent">       
    <phone:WebBrowser Name="webControl"></phone:WebBrowser>
</Grid>
public MainPage()
{
    InitializeComponent();

    webControl.NavigateToString("<BODY>Hola!</BODY>");
}

Esto es muy engorroso si estamos usando un patrón MVVM, además de romper la regla de no usar Code Behind, tenemos que detectar los cambios en nuestro ViewModel y de alguna forma invocar código en nuestro code behind o tener una referencia al control directamente en nuestra ViewModel, lo cual es aun peor.

¿Como lo resolvemos? Usando un Behavior!

Lo primero que vamos a hacer es crear una nueva clase llamada NavigateToStringBehavior que herede de Behavior, pasando como tipo el control WebBrowser. Dentro de nuestro behavior tenemos una propiedad llamada AssociatedObject, que nos devuelve el objeto al cual hemos asociado nuestro behavior, con todas las propiedades del tipo indicado:

public class NavigateToStringBehavior : Behavior<Microsoft.Phone.Controls.WebBrowser>
{
    /// <summary>
    /// Execute when attached to a parent object.
    /// </summary>
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Loaded += AssociatedObject_Loaded;
    }

    /// <summary>
    /// Execute our behavior actions!
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
    {
    }

    /// <summary>
    /// Execute when detached from a parent object
    /// </summary>
    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.Loaded -= AssociatedObject_Loaded;
    }
}

En este caso usamos el método OnAttached para manejar el evento Loaded de nuestro WebBrowser, mediante la propiedad AssociatedObject y el método OnDetaching para eliminar el manejador creado de forma que no queden dependencias y se pueda liberar correctamente toda la memoria al destruir el WebBrowser.

Ahora necesitamos algún mecanismo que nos permita indicarle a nuestro behavior cual es el contenido que deseamos mostrar, además queremos que este contenido pueda ser indicado mediante un Binding a una propiedad de nuestra ViewModel, la solución: Añadir una DependencyProperty a nuestro behavior:

private static readonly DependencyProperty HtmlContentProperty = DependencyProperty.Register("HtmlContent", typeof(string),
                                                                                                typeof(NavigateToStringBehavior), 
                                                                                                null);
public string HtmlContent 
{
    get { return (string)this.GetValue(HtmlContentProperty); }
    set { this.SetValue(HtmlContentProperty, value); }
}

Para ello creamos una propiedad pública en nuestra clase NavigateToStringBehavior de tipo string llamada HtmlContent y a continuación una propiedad de tipo DependencyProperty que será la encargada de almacenar nuestro valor.

Ahora solo nos queda añadir código al manejador de eventos AssociatedObject_Loaded para que obtenga el valor de la propiedad HtmlContentProperty y llame al método NavigateToString del WebBrowser asociado:

/// <summary>
/// Execute our behavior actions!
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
{
    AssociatedObject.NavigateToString(HtmlContent);
}

El código simplemente llama al método NavigateToString pasando como argumento la propiedad HtmlContent, que a su vez obtendrá el valor de la DependencyProperty HtmlContentProperty evaluando la expresión de enlace a datos (binding) si existe.

Usando el fruto de nuestro trabajo

Ahora vamos a crear una clase llamada HtmlViewModel en nuestra aplicación que imitará a una ViewModel real y expondrá dos propiedades de tipo string:

public class HtmlViewModel
{
    public string Html1 { get; set; }

    public string Html2 { get; set; }

    public HtmlViewModel()
    {
        Html1 = @"<BODY bgcolor='#AAAAFF' text='#003300'>
                    <strong>Hola!</strong>
                  </BODY>";

        Html2 = @"<BODY bgcolor='#FFAAAA' text='#003300'>
                    <strong>Adios!</strong>
                  </BODY>";
    }
}

En estas dos propiedades hemos introducido código HTML para imitar el posible HTML que podríamos tener guardado de un Rss o una página web.

Vamos a abrir Expression Blend (Haciendo click derecho en nuestra página MainPage.xaml y escogiendo la opción “Open in Expression Blend”).

He creado un layout con dos WebBrowsers en la página:

image

 

Lo primero que necesitamos hacer es indicarle a nuestra página que debe usar la clase HtmlViewModel como su DataContext. Para ello seleccionamos en la pestaña de objetos nuestra PhoneApplicationPage y en las propiedades buscamos el DataContext, donde encontraremos el botón New, al presionarlo abrirá una ventana para seleccionar nuestra fuente de datos:

image

Después de seleccionar la  clase HtmlViewModel presionamos OK. Veremos una lista de las propiedades que expone nuestra clase, Html1 y Html2, ahora seleccionamos el primer WebBrowser y vamos a la pestaña Assets y a los Behaviors, donde veremos que está incluido nuestro NavigateToStringBehavior:

image

Solo tenemos que seleccionarlo y arrastrarlo sobre nuestro primer WebBrowser. Si intentamos añadirlo a la grid o a la página, veremos que nos indica un mensaje de que no es un objetivo válido. una vez añadido al primer WebBrowser, en las propiedades del Behavior veremos nuestra DependencyProperty HtmlContent, donde podremos indicar nuestro Binding:

image

Podemos repetir la misma operación con el segundo WebBrowser, añadiendo un nuevo NavigateToStringBehavior y estableciendo el Binding a la propiedad Html2.

Tras hacer esto, si ejecutamos nuestra aplicación veremos el resultado:

image

Y Voila! tenemos nuestro código HTML mostrándose en un WebBrowser sin necesidad de usar Code Behind y con un Behavior reutilizable siempre que lo necesitemos y con soporte a enlace a datos.

Conclusión

Hemos podido ver como crear un Behavior es muy sencillo pero al mismo tiempo muy útil y potente, es una herramienta que nos permitirá crear comportamientos reutilizables, usables desde Expression Blend directamente y evitando usar Code Behind. Como siempre, aquí tenéis el proyecto de ejemplo, espero que os sea de utilidad.

Un saludo y Happy Coding!

[Windows Phone 7.5] Materiales de mi Webcast sobre Expression Blend 4

Ayer jueves 15 de Marzo MSDN Latam me volvió a ofrecer la oportunidad de realizar un Webcast sobre desarrollo con Expression Blend 4 para Windows Phone 7.5

Podéis ver el evento grabado en el siguiente enlace: https://www137.livemeeting.com/cc/MSEvents/view?cn=guest&id=1032507359&pw=E5720F15

He colgado la presentación en SlideShare para que sea más comodo verla:

Espero que hayáis disfrutado tanto con el webcast como yo haciéndolo. Un saludo y Happy Coding!

Publicado por Josué Yeray Julián Ferreiro con no comments
Archivado en: ,,

[Windows Phone Tango] Preparando nuestras aplicaciones (I)

Hola a todos!

Como ya vimos anteriormente, Microsoft ha liberado la CTP del SDK de Windows Phone Tango. Se estima que los dispositivos ejecutando esta versión de Windows Phone aumentarán el mercado disponible en un 60% por lo que es más que recomendable empezar a preparar nuestras aplicaciones para esta nueva versión del sistema operativo.

Una de las limitaciones más evidentes será el recorte en la memoria disponible para nuestra aplicación que pasará de 90Mb a 60Mb por lo que, si no lo habéis hecho ya, es buen momento para empezar a usar el profiler de Windows Phone y ver donde podemos optimizar nuestro consumo de memoria.

Introducción a la herramienta de análisis de rendimiento de Windows Phone

Una de las novedades que tuvimos con el SDK de Windows Phone 7.1 fue la inclusión de un profiler específico para nuestras aplicaciones móviles, el “Windows Phone Performance Analysis” que podemos encontrar en el menú Debug de Visual Studio 2010.

Al iniciarlo se nos presentarán dos opciones distintas:

image

En esta primera pantalla podremos decidir entre analizar el rendimiento visual y de código o analizar el consumo de memoria. También podemos ver como se nos indica en forma de Warning que estamos usando el emulador y no un dispositivo real, con lo que el rendimiento puede ser distinto al de un dispositivo real (y de echo lo es y mucho) y que para obtener unos resultados más precisos debemos usar la configuración de release. En este primer ejemplo vamos a seleccionar “Memory” y dejar los valores por defecto.

Por último tenemos un link para iniciar la aplicación, lo que dejará el profiler a la escucha de los resultados e iniciará la compilación y despliegue:

image

En este momento deberemos usar nuestra aplicación de forma normal. Podemos centrarnos en una página en concreto e ir midiendo el rendimiento que tiene bajo diferentes situaciones o hacer un barrido por toda la aplicación para ver una primera aproximación del consumo de memoria. En cualquier caso, cuando hayamos terminado, presionamos Stop Profiling y Visual Studio empezará a procesar los datos y nos los mostrará en una línea de tiempo:

image

En esta primera ejecución estamos usando una aplicación vacía, tal cual la crea el SDK, por lo que no vemos ninguna variación en el consumo de memoria y solo se produce un evento de recolección, al terminar la misma. Podemos seleccionar una porción de esta línea para ver un detalle de lo que ha ocurrido en ese momento exacto, simplemente pinchando en un punto inicial y arrastrando hasta un punto final:

image

Si presionamos “Start Analysis” se nos mostrará en un primer momento los avisos de rendimiento:

image

Si presionamos sobre la flecha a continuación de “Performance Warnings” podremos seleccionar “Heap Summary” donde podremos ver un sumario de uso de memoria, nuevas inclusiones… :

image

Si seleccionamos la línea “Retained Silverlight Visuals at End” podremos acceder a los tipos que contiene:

image

Por cada tipo además de ver su tamaño total, máximo durante el periodo seleccionado y el número de instancias, podremos ver una descripción de cada instancia:

image

Con esto, vemos el momento de creación, cuanto tiempo se mantuvo viva, quien lo creo y el tamaño en Bytes que ocupa.

Con esta información, podremos ver de forma rápida donde estamos aumentando el consumo de memoria, si esta se libera cuando debe o no, quien está creando objetos que no debería, etc… . Usarla de forma correcta nos ayudará a tener una aplicación más eficiente y poder llegar al nuevo 60% de los dispositivos que usarán Windows Phone Tango.

En el próximo artículo profundizaremos en la optimización del uso de memoria en nuestras aplicaciones, uso de imágenes, hilos y más cosas interesantes y curiosas.

Un saludo y Happy Coding!

[MSDN Latam] Webcast: Aplicaciones Windows Phone con Expression Blend

msdn_wp75

Hola!

Parece que la gente de MSDN Latam le ha cogido el gusta a Windows Phone y están que no paran… y yo me apunto a todo!

Esta vez vamos a montar un webcast el día 15 de Marzo a las 16:00 (GMT-5) sobre Windows Phone 7.5 y más concretamente sobre como aprovecharnos de Expression Blend para darle a nuestra aplicación un estilo único y de paso ganar en productividad al trabajar con XAML:

  • Introducción a la filosofía METRO
  • Expression Blend
  • Layout y controles
  • Plantillas de controles y estilos
  • Animaciones y Comportamientos

Todo los veremos desde un punto de vista práctico, con pocas diapositivas y mucho Expression Blend. Puedes registrarte aquí

Un saludo y Happy Coding!

[Windows Phone 7.5] Instalar las herramientas en Windows 8 Consumer Preview

Hola a todos!

wplogo windows-8-logo

Si no has estado en una cueva en lo alto de una montaña sabrás que el 29 de febrero Microsoft presentó al mundo la versión consumer preview de Windows 8. Todos queremos jugar con el nuevo vecino del barrio, pero para los que desarrollamos con Windows Phone existe un gran impedimento: No hay forma humana de que el instalador del SDK funcione en Windows Phone.

Bueno, en circunstancias normales, no pasa nada por que Windows 8 solo es una especie de beta y no debes tenerlo como sistema operativo principal… ahhh, que si, que va muy bien y te has formateado el Windows 7… Pues tendremos que solucionar lo de las herramientas!!

Desde el blog de MSicc nos ayudan y han publicado unas sencillas instrucciones sobre como instalar nuestro SDK de Windows Phone en Windows 8 que os resumo y traduzco aquí para los que tengan dificultades con la lengua de Shakespeare.

El error

Por lo que se cuenta, el error viene dado por el redistribuible de Games for Windows Live. Al parecer, XNA Game Studio instala Games for Windows entre bastidores y la versión que usa el SDK de Windows Phone intenta acceder a un archivo del sistema que ahora viene con Windows 8 y no es compatible con las versiones antiguas. Por esto es por lo que los fallos del instalador se centran en la parte de XNA.

También podemos tener algunos problemas por el UAC, aunque esto es menos general.

La solución

image

Es mucho más sencilla de lo que cabría esperar.

Para estar seguros de no tener problemas extras, lo mejor sería ir al control panel > more settings > users > settings for user access control y desactivar el UAC para la instalación, luego podemos volver a activarlo.

Una vez hecho esto, tenemos que bajarnos la última versión del redistribuible de Games for Windows: http://www.xbox.com/en-US/LIVE/PC/DownloadClient e instalarla. A continuación podremos instalar las herramientas de Windows Phone, detectarán la nueva versión de Games for Windows instalada y no intentarán instalar la que se incluye en el SDK, por lo que la instalación se completará con éxito:

image

image

No todo es perfecto

Aun así no todo va a las mil maravillas. El emulador de Windows Phone no funciona, por lo que tendremos que usar un dispositivo físico para probar y depurar nuestras aplicaciones. El SDK además solo funciona con Visual Studio 2010 y la versión 7.1.1 del SDK no funciona con estas instrucciones… pero algo es algo!

Un saludo y Happy Coding!

[Windows Phone 7.5] Dale calidad a tus aplicaciones con Expression Blend (III)

Hola a todos!

Hoy volvemos a nuestra serie de artículos sobre Expression Blend y como usarlo para hacer a nuestras aplicaciones únicas y mucho más atractivas al usuario. Si te has perdido las primeras dos entradas, puedes verlas a continuación:

En esta nueva entrega vamos a ver como podemos añadir animaciones a nuestra aplicación para que parezca más viva y sorprenda al usuario en cualquier detalle en el que se fije y como usar behaviors (comportamientos) para ejecutar estas animaciones u otros eventos.

Animaciones en Expression Blend

El sistema de animación de Expression Blend es realmente sencillo. En la parte inferior izquierda de la pantalla tenemos una región llamada Objects and Timeline (Objetos y Línea de tiempo):

image

En artículos anteriores hemos visto como usar esta región para movernos por los diferentes elementos de nuestra pantalla. Si nos fijamos en la parte superior de la misma veremos un desplegable con el texto “(No Storyboard open)” y un botón “+” que nos permite añadir una nueva animación a nuestra aplicación:

image

Al introducir un nombre y presionar OK la pantalla de blend mostrará un borde rojo alrededor del área de dibujo y se visualizará una línea de tiempo:

image

Podemos desplazar la línea amarilla al tiempo en el que queremos que se realice una acción y de esta forma se animará. Por ejemplo vamos a poner un rectángulo sobre la pantalla sin mover la línea de tiempo y luego movemos la línea amarilla hasta el segundo 1 y movemos el rectángulo:

image

Como podemos ver, en la línea de tiempo del rectángulo tenemos marcada la animación que hemos realizado. En el segundo 0 introducimos el rectángulo en una posición determinada y en el segundo 1 lo hemos movido a otra posición, lo que ha dado como resultado una animación. Podemos ver el efecto final de la misma presionando el botón de reproducción que tenemos sobre el tiempo. Al reproducir la animación veremos que el movimiento es lineal, no dispone de aceleración o deceleración. Podemos modificar el comportamiento de la animación para cada objeto por separado. Lo primero que necesitamos es desplegar el contenido del rectángulo en la región de Objects and Timeline y veremos que dentro del mismo tenemos una propiedad RenderTransform, que es la encargada de realizar el movimiento del objeto y otras transformaciones visuales:

image

Si seleccionamos el RenderTransform y vamos a sus propiedades veremos una sección llamada Easing (aceleración) que nos permitirá controlar como se acelera nuestra animación (debemos tener seleccionado el extremo final de la animación):

image

Disponemos de tres opciones: KeySpline, EasingFunction y Hold In.

KeySpline

Esta opción nos mostrará una línea de aceleración que podremos modificar manualmente para dotar a nuestra animación de una sensación de aceleración y deceleración, modificando los extremos inicial y final de la misma mediante las propiedades X e Y:

image

En este caso,  la línea recta en la imagen de la izquierda indica una progresión lineal, sin aceleración. En la derecha, modificando las propiedades X1, Y1 (Inicio) y X2, Y2 (final) hemos cambiado las propiedades de aceleración. El resultado de la curva de la derecha es una animación que se inicia acelerando muy despacio, después se acelera mucho en el sector intermedio y progresivamente vuelve a decelerar hasta detenerse.

EasingFunction

Las EasingFunctions o funciones de aceleración son, básicamente, líneas KeySpline pre calculadas e incluidas en Expression Blend, solo necesitamos escoger una de ellas y se aplicará automáticamente:

image

Para cada tipo podemos elegir entre tres opciones: In (al inicio) Out (al final) o InOut (inicio + final). En total disponemos de 33 EasingFuncions predefinidas que nos permitirán en un solo click hacer efectos diversos en nuestras animaciones como, por ejemplo el Bounce Out, que emulará el rebote de una pelota al lanzarla contra el suelo. Al seleccionar una de estas funciones de aceleración, dispondremos de diversos parámetros extra para configurar su comportamiento. En el caso del Bounce Out, podremos indicar el número de rebotes:

image

HoldIn

Este método de animación elimina los cuadros intermedios generados por Expression Blend, dando como resultado una animación en la que nuestro objeto está en el punto inicial en el segundo 0 y salta directamente al punto final indicado en el tiempo indicado. por lo que no tenemos la sensación de animación y tampoco disponemos de más opciones:

image

 

Con esto hemos visto como animar el movimiento de un objeto, pero no solo podemos crear animaciones de movimiento. Podremos animar casi cualquier propiedad de nuestro rectángulo, por ejemplo su color. Para ello simplemente nos posicionamos en el segundo 0 de nuestra línea de tiempo, seleccionamos el rectángulo y le establecemos un color de Background, por ejemplo un degradado:

image

A continuación, seleccionamos el segundo 1 y cambiamos este color a otro distinto:

image

Si reproducimos nuestra animación veremos que automáticamente Blend se encarga de realizar la animación para pasar de un degradado a otro de forma suave, aunque si lo deseamos también podemos modificar la animación del color seleccionando la propiedad Fill del rectángulo de la misma forma que hicimos con el RenderTransform, lo que nos permite múltiples efectos distintos y posibilidades en nuestras animaciones.

También podremos modificar ciertos aspectos de la animación en sí misma, si en la región de Objects and Timeline pinchamos sobre nuestra animación (se seleccionará en blanco):

image

Podremos acceder a una pantalla de propiedades:

image

Aquí podremos modificar dos aspectos: AutoReverse, cuando la animación acaba, se ejecuta en sentido inverso para volver al punto inicial, y RepeatBehavior que nos indicará cuantas veces debe ejecutarse la animación (1 por defecto) 2, 3 o para siempre. Vamos a marcar AutoReverse y Forever en RepeatBehavior.

Si ejecutamos nuestra aplicación ahora, veremos que el rectángulo no se anima y que aparece con el color inicial y en la posición original que tenía cuando lo añadimos a la página. Esto se debe a que hemos definido la animación pero no le hemos indicado que se inicie en ningún momento. Para indicarle cuando debe iniciar o parar, usaremos un Behavior.

Behaviors

Un behavior es un componente que podemos añadir a nuestra página como si de un objeto más se tratase, pero que no tiene representación visual. En su lugar nos ofrece lógica de interacción con nuestra aplicación.

Existen múltiples Behaviors predefinidos en Expression Blend, podemos acceder a ellos en la pestaña Assets (Activos) y en la opción Behaviors (comportamientos):

image

Como podemos ver tenemos una gran variedad: reproducir sonidos, llamar a métodos de nuestro código o a comandos, cambiar propiedades, navegar a una página… y uno en particular llamado ControlStoryboardAction, este es el que necesitamos así que lo seleccionamos y lo arrastramos hasta nuestra región de objetos y lo depositamos sobre la página directamente:

image

image

Al seleccionarlo en sus propiedades podremos controlar bajo que condiciones queremos iniciar o parar nuestra animación:

image

Simplemente indicamos que animación queremos controlar, que opción (Play, Stop, Pause…), el Objeto que nos iniciará (solo tenemos que presionar la diana de SourceObject o SourceName y luego seleccionar el objeto que deseemos usar como fuente de eventos) y el evento en el que se ejecutará la animación. En mi caso, he seleccionamos en SourceObject la grid en la que se encuentra el rectángulo y en EventName he indicado Loaded, con lo que la animación se ejecutará en cuanto se cargue la grid. Si ahora ejecutamos la aplicación de nuevo veremos que automáticamente se reproduce nuestra animación de forma indefinida, rebobinando al llegar al final y volviendo a empezar.

Si queremos añadir otro evento para detener la animación deberemos añadir otra vez un nuevo behavior ControlStoryboardAction y volver a repetir los mismos pasos que en este, seleccionando la opción de control que deseemos.

Conclusión

Como ya hemos visto en otros artículos sobre Expression Blend con un poco de trabajo de ratón y unos clicks aquí y allá podemos mejorar mucho la interactividad de nuestra aplicación y el usuario lo agradecerá, además de servirnos para ofrecer algo diferente al resto y hacer que nuestra app sea más única si cabe. Aquí podéis descargar el proyecto de ejemplo con las animaciones de movimiento y color y el behavior de reproducción para que os ayude a entender mejor como realizar Sotryboards.

Un saludo y Happy Coding!