Curso gratuito de desarrollo de aplicaciones nativas multiplataforma con Xamarin

XamarinIntroducción

No hay duda, los smartphones y tabletas han llegado, y ya forman parte de la vida de todos nosotros.

Esto también nos afecta como desarrolladores. El desarrollo móvil se ha convertido en una prioridad en una gran mayoria de ámbitos.

Actualmente contamos con varias plataformas dominantes:

  • iOS
  • Android
  • Windows

El mercado móvil actual

En lo que respecta a nivel de desarrollo nos supone barreras. Contamos con múltiples plataformas de desarrollo diferentes, lenguajes diferentes, etc. suponiendo un nivel de aprendizaje y esfuerzo cada vez mayor de cara a desarrolladores. Además, la experiencia nos ha demostrado que los usuarios no aceptan aplicaciones no nativas. Buscan aplicaciones rápidas, fluidas y con consumos moderados perfectamente adaptadas a la plataforma, ofreciendo una experiencia completa.

¿Qué podemos hacer para mejorar este panorama?

Xamarin

Aquí es donde entran en juego las tecnologías de desarrollo multiplataforma. En estos últimos años han aparecido diversas tecnologías que permiten aprovechar una base de código en multiples plataformas. Entre diversas opciones brilla con especial fuerza, por diferentes motivos (evolución, comunidad, apoyo de Microsoft) Xamarin.

Xamarin es una plataforma de desarrollo gratuita de Microsoft que permite crear nuestras aplicaciones móviles una sola vez y que funcionen en Android, iOS y Windows entre otros sistemas (Windows 10, Mac, wearables…). Todo ello sin tener que duplicar código o aprender nuevas herramientas. Las apps que creamos con Xamarin son aplicaciones nativas, es decir, no tienen diferencias con las que podríamos crear usando las herramientas propias de cada plataforma.

xamarinmonkeysCurso gratuito Xamarin en CampusMVP

Tras realizar un completo curso de Xamarin en CampusMVP donde se aborda tanto Xamarin Classic como Xamarin.Forms, desde conceptos básicos a la publicación pasando por buenas prácticas, MVVM o testing y haber recibido feeback positivo, ¿algo mejor que realizar un gran curso gratuito con la ayuda de Microsoft?. Así nace el curso gratuito  de desarrollo de aplicaciones  Xamarin en CampusMVP.

El curso se compone de cinco módulos diferentes:

  1. Introducción a Xamarin y Azure: en este primer módulo se conocen los conceptos básicos relacionados con Xamarin, se realiza la instalación, se revisa la integración de Xamarin con Visual Studio, un repaso a emuladores y se realiza la primera aplicación Xamarin.Forms.
  2. Interfaz de usuario: se conocen las páginas, layouts y controles de Xamarin.Forms. Tras realizar aplicación básica se introduce la necesidad de buenas prácticas. Conocemos y aplicamos el patrón MVVM para terminar con otros conceptos necesarios como la navegación o el sistema de mensajería.
  3. Creando el backend de la aplicación en Azure: se crea un backend en Azure. Todos los conceptos necesarios para crear el backend se repasan. Conceptos como la creación de una Azure Mobile App, Azure SQL, Easy Tables, etc. Se completa el módulo integrando el backend en una aplicación Xamarin.
  4. Autenticación de usuarios: continuamos progresando en nuevos conceptos, en esta ocasión centrados en añadir autenticación en aplicación Xamarin aprovechando las posibilidades de Azure y utilizando proveedores de autenticación sociales. También hay nuevos conceptos relacionados con Xamarin como el acceso a características específicas de una plataforma con el uso de la cámara y se completa la gestión con el backend previamente creado.
  5. Notificaciones Push: se concluye el curso personalizando la aplicación utilizando estilos e integrando notificaciones Push en una aplicación Xamarin.

El curso comienza en Enero y dura hasta finales de Junio de este mismo año. Durante estos 6 meses se aprenden todos los conceptos creando una aplicación paso a paso desde cero. Al final se consigue tener una aplicación con:

  • Autenticación
  • Listado de elementos obtenidos desde un backend
  • Vista de detalles
  • Posibilidad de añadir nuevos registros incluyendo el uso de la cámara del dispositivo
  • Notificaciones Push

Al final de cada módulo se tiene un divertido reto donde en algunas ocasiones consiste en crear una pequeña aplicación aplicando los conceptos aprendidos y en otras se continuará el desarrollo de una aplicación planteada a lo largo del curso. Además, todos los módulos se componen de un conjunto de documentación, videos y ejemplos prácticos.

¿Te animas?

Muchas gracias a Microsoft y a CampusMVP por hacer posible crear un curso gratuito que ayuda al crecimiento de la comunidad Xamarin.

Más información

[Material dotNetMálaga] Taller Xamarin

logo_dotnetmlg_full_color_2tintas_2El evento

El pasado 10 de Diciembre tenía lugar el dotNetMálaga 2016. Evento destinado a desarrolladores en España con 2 Tracks diferentes, 10 sesiones técnicas, talleres técnicos y todo un día repleto de grandes momentos, tiempo para encontrar a viejos conocidos y conocer a muchos otros nuevos.

El material

He tenido la oportunidad de participar con un taller Xamarin donde realizamos una aplicación Xamarin.Forms paso a paso utilizando MVVM.

En cuanto al código fuente del taller, se encuentra disponible en GitHub:

Ver GitHub

Agradecer a toda la organización del eventos, ponentes y asistentes por hacerlo posible. El año que viene…¿repetimos?

Más información

[dotNetMálaga 2016] Taller Xamarin

logo_dotnetmlg_full_color_2tintas_2dotNetMálaga 2016

El próximo sábado 10 de Diciembre tiene lugar la II edición de la conferencia dotNetMálaga que constará de un día completo con numerosas sesiones y talleres divididos en dos tracks, .NET y Web. También habrá regalos y sorteos para los asistentes.

Taller Xamarin

De 11:15h a 13:30h participaré con un divertido taller de desarrollo de aplicaciones móviles multiplataforma con Xamarin. El objetivo será realizar una aplicación paso a paso. También se realizarán pequeñas sesiones para trasmitir los conceptos básicos necesarios. Al final de taller, contaremos con alguna sorpresa y regalo.

Requisitos:

  • Visual Studio y Xamarin instalado. La versión Community gratuita es perfectamente válida.
  • SDK de desarrollo Windows 10.
  • Es recomendable contar con emuladores instalados.
Taller Xamarin
Taller Xamarin

Anímate a participar!

Más información

[Material] re-Connect(); Madrid 2016

re-connectEl evento

Tras un exitoso Microsoft Connect(); 2016, en New York, donde se presentaron importantes novedades relacionadas con la plataforma Cloud, novedades en .NET, Visual Studio para MacOS o novedades en Xamarin, ¿algo mejor que recopilar todas las novedades en un evento?

De esta forma, el pasado 30 de Noviembre, tenía lugar en Madrid el re-Connect(); 2016. Una jornada con varias sesiones técnicas con miembros de la comunidad y también con miembros de Microsoft como David Carmona.

El material

Pude participar en el evento con una de las sesiones.

Novedades Xamarin
Novedades Xamarin

Desde que Microsoft hizo pública la compra de Xamarin el pasado febrero, todos estábamos esperando ansiosamente el gran evento de Microsoft, para saber cual va a ser la dirección del desarrollo multiplataforma liderado por Miguel de Icaza. La verdad que este evento no nos ha dejado indiferentes y se han anunciado muchas novedades que nos afectaran directa o indirectamente en nuestros día a día. En esta charla hicimos un pequeño resumen de las noticias más destacadas enfocadas al mundo .NET y Xamarin y hablamos de las novedades en IDEs (Visual Studio para MacOS), las nuevas herramientas, DevOps con Visual Studio Mobile Center o la llegada de Tizen.NET.

Se puede ver toda la grabación del evento en Channel 9.

En cuanto a las demos técnicas realizadas, las tenéis disponible en GitHub:

Ver GitHub

Más información

[Material] Xamarin Dev Day Madrid

El evento

El pasado sábado 26 de Noviembre, tenía lugar en Madrid el Xamarin Dev Days. Una jornada con varias sesiones técnicas, taller, regalos y mucho networking.

El resultado fue un fantástico día de desarrollo Xamarin con muchas preguntas, ayuda y tiempo para charlar entre todos rodeados de un café o unas pizzas.

El material

Pude participar en el evento con una de las sesiones. Nos centramos en el desarrollo de aplicaciones móviles multiplataforma utilizando Xamarin.Forms:

Comenzamos por una introducción de conceptos básicos, primera demo aplicando MVVM y terminamos repasando todas las últimas novedades como DataPages, Native Views o el desarrollo para Tizen.

Tras las sesiones, realizamos un muy divertido taller donde paso a paso, desarrollamos una aplicación Xamarin.Forms aplicando MVVM y accediendo a información meteorológica.

En cuanto a las demos técnicas realizadas, las tenéis disponible en GitHub:

Ver GitHub

Quisiera terminar añadiendo algunos agradecimientos. Comienzo por los chicos de Liferay por las instalaciones y toda la ayuda; a Plain Concepts y Bravent por su patrocinio; a Xamarin también por patrocinar el evento; a mis compañeros Dachi Gogotchuri, Sergio Gasca, Ramón Esteban y Alejandro Campos por sus demos y ayudar con todo y por supuesto a los asistentes. Gracias a todos.

Más información

[Podcast Interfaz] Conociendo Xamarin

interfaz-podcastIntroducción

Recientemente, Rodrigo Díaz Concha, Windows Development MVP y Microsoft Regional Director en Mexico, ha lanzado un podcast (muy recomendado) llamado Interfaz. El objetivo del podcast es ser un medio de comunicación que toque diversos temas del espectro de tecnologías de software que tenemos a nuestro alcance hoy en día con una frecuencia semanal.

El podcast, conociendo Xamarin

En el episodio 9 del podcast, tengo el placer de poder participar hablado de Xamarin. Durante el episodio hablamos acerca de qué es Xamarin, las opciones para el desarrollo con Xamarin, las ventajas de usar Xamarin.Forms, el futuro de Xamarin y los errores comunes que las personas cometen al iniciar con esta tecnología.

¿Te resulta interesante?

Puedes escuchar el podcast a continuación.

Más información

[Xamarin.Forms] Behavior para hacer scroll infinito

stack-04-wfIntroducción

Actualmente el control de tipo listado incluido en Xamarin.Forms incluye soporte a características avanzadas interesantes como el uso de plantillas diferentes para cada elemento del listado o la posibilidad de realizar Pull To Refresh.

A pesar de que el refresco de listados realizando Pull To Refresh es una forma bastante habitual y extendida, no es la única. También en ocasiones es necesario refrescar listados a la medida que se va realizando scroll, lo que se conoce como scroll infinito.

¿Cómo realizamos scroll infinito en Xamarin.Forms?

El evento ItemAppearing

El control ListView lanza el evento ItemAppearing cada vez que un elemento pasa a ser visible. Nuestra tarea para detectar por lo tanto si hemos llegado al final es que el último elemento visible es el último elemento disponible.

NOTA: Habitualmente siempre que sea posible se recomienda el uso de idntificadores para realizar las comprobaciones necesarias.

Creando un Behavior

Los Behaviors (o comportamientos en Español) nos permiten añadir lógica directamente en XAML para realizar acciones sin necesidad de escribir código extra en el code behind.

Vamos a crear un Behavior que asociado a un listado permita lanzar un comando llegado al final del scroll para solicitar nuevos elementos.

Comenzamos creando una clase que herede de Behavior<T>:

public class IniniteListScrollingBehavior : Behavior<ListView>
{

}

Debemos implementar:

  • Propiedad AssociatedObject: Control al que se adjuntará el Behavior, es decir, el ListView.
  • Método OnAttachedTo: Lanzado inmediatamente tras adjuntar el Behavior al control. Se recibe una referencia al control adjuntado idóneo para acceder a propiedades o eventos del mismo.
  • Método OnDetachingFrom: Lanzado cuando el Behavior se elimina del control. Lugar perfecto para realizar tareas de limpieza (gestión de suscripciones de eventos, liberar recursos, etc.).
public ListView AssociatedObject { get; private set; }

protected override void OnAttachedTo(ListView bindable)
{
     base.OnAttachedTo(bindable);

     AssociatedObject = bindable;
     bindable.BindingContextChanged += OnBindingContextChanged;
     bindable.ItemAppearing += OnItemAppearing;
}

protected override void OnDetachingFrom(ListView bindable)
{
     base.OnDetachingFrom(bindable);

     bindable.BindingContextChanged -= OnBindingContextChanged;
     bindable.ItemAppearing -= OnItemAppearing;
     AssociatedObject = null;
}

private void OnBindingContextChanged(object sender, System.EventArgs e)
{
     base.OnBindingContextChanged();
     BindingContext = AssociatedObject.BindingContext;
}

private void OnItemAppearing(object sender, ItemVisibilityEventArgs e)
{
     var listview = ((ListView)sender);

     if (listview.IsRefreshing)
          return;
}

Vamos a utilizar el método ItemAppearing del ListView para lanzar un comando encargado de refrescar el listado. Necesitamos crear una BindableProperty de tipo ICommand en el Behavior:

public static readonly BindableProperty CommandProperty =
     BindableProperty.Create("Command", typeof(ICommand), typeof(IniniteListScrollingBehavior), null);

public ICommand Command
{
     get { return (ICommand)GetValue(CommandProperty); }
     set { SetValue(CommandProperty, value); }
}

En el método ItemAppearing del control:

private void OnItemAppearing(object sender, ItemVisibilityEventArgs e)
{
     var listview = ((ListView)sender);

     if (listview.IsRefreshing)
          return;

     if (Command == null)
     {
          return;
     }

     if (Command.CanExecute(e.Item))
     {
          Command.Execute(e.Item);
     }
}

Accedemos al comando (siempre y cuando el listado no siga refrescando) y lo ejecutamos pasándole el último elemento visible como parámetro. Este parámetro lo utilizaremos desde la ViewModel para determinar si ese elemento es el último de la lista o no.

Utilizando el Behavior

Tras crear el Behavior ha llegado el momento de utilizarlo. Pero antes de lanzarnos de pleno…¿de dónde obtenemos la información?.

En la ViewModel tendremos una propiedad pública con el listado a mostrar:

private ObservableCollection<Monkey> _monkeys;

public ObservableCollection<Monkey> Monkeys
{
     get { return _monkeys; }
     set
     {
          _monkeys = value;
          RaisePropertyChanged();
     }
}

Utilizaremos también un par de propiedades para determinar:

  • IsBusy: Esta propiedad nos indicará cuando se esta realizando la carga de más información. Utilizada en la UI para mostrar un indicador visual de carga en caso necesario.
  • CurrentPage: Un entero que almacena el número de página utilizado al cargar información. Gran cantidad de APIs soportan paginación. En la mayoría de ocasiones necesitamos indicar el número de página a cargar (justo esta propiedad) y el número de elementos por página.
public bool IsBusy { get; set; }

public int CurrentPage { get; set; }

En nuestro ejemplo, para simplificar todo en la medida de lo posible y centrarnos en el uso del Behavior, vamos a cargar datos locales:

private void LoadItems(int pageSize = 10)
{
     IsBusy = true;

     if(Monkeys == null)
     {
          Monkeys = new ObservableCollection<Monkey>();
     }

     for (int i = CurrentPage; i < CurrentPage + pageSize; i++)
     {
          Monkeys.Add(new Monkey()
          {
               MonkeyId = i + 1,
               Name = string.Format("Monkey {0}", i + 1)
          });
     }

     CurrentPage = Monkeys.Count;
     IsBusy = false;
}

El Behavior utilizará un comando para refrescar la información:

private ICommand _refreshCommand;

public ICommand RefreshCommand
{
     get { return _refreshCommand = _refreshCommand ?? new DelegateCommand<Monkey>(RefreshCommandExecute, RefreshCommandCanExecute); }
}

public bool RefreshCommandCanExecute(Monkey monkey)
{
     return !IsBusy && 
            Monkeys.Count != 0 && 
            Monkeys.Last().MonkeyId == monkey.MonkeyId;
}

public void RefreshCommandExecute(Monkey monkey)
{
     LoadItems();
}

Para utilizarlo en nuestra UI compartida XAML, debemos crear un namespace:

xmlns:behavior="clr-namespace:InfiniteScrollingBehavior.Behaviors;assembly=InfiniteScrollingBehavior"

Utilizando la propiedad Behaviors del listado, adjuntamos el Behavior creado enlazando con el comando previamente visto.

<ListView
     ItemsSource="{Binding Monkeys}"
     IsRefreshing="{Binding IsBusy}"
     HasUnevenRows="true">
     <ListView.ItemTemplate>
          <DataTemplate>
               <ViewCell>
                    <templates:MonkeyTemplate />
               </ViewCell>
           </DataTemplate>
       </ListView.ItemTemplate>
       <ListView.Behaviors>          
          <behavior:IniniteListScrollingBehavior  
                Command="{Binding RefreshCommand}">
          </behavior:IniniteListScrollingBehavior>
     </ListView.Behaviors>
</ListView>

El resultado:

inifinitescrollingbehavior

Sencillo y además facilmente reutilizable.

Tenéis el código fuente del ejemplo utilizado disponible en GitHub:

Ver GitHub

Recuerda, cualquier tipo de duda o sugerencia es bienvenida en los comentario del artículo.

Más información

[Podcast] Xamarin: Mitos y verdades

mic-02El podcast

Recientemente los compañeros Camilo Galiana y Rodrigo Díaz crearon un podcast llamado Just In Time. Un podcast sobre desarrollo movil, buenas practicas, lenguajes y desvarios varios.

En el primer captítulo, he tenido el placer de participar junto a Josué Yeray y Marcos Cobeña para hablar de Xamarin. El enfoque buscado era tratar aspectos importantes relacionados con el desarrollo y uso de Xamarin desde un punto de vista neutro y desde la experiencia. En el podcast tratamos aspectos como:

  • El rendimiento en comparación con aplicaciones nativas.
  • Cantidad de código compartido en aplicaciones “reales”.
  • Herramientas de Xamarin e integración de Visual Studio en comparación con las herramientas nativas.
  • Uso de plugins y de librerías nativas, ventajas y dificultades.
  • Frecuencia y estabilidad de cada nueva versión.
  • Etc.

Si te resulta interesante, puedes escuchar el podcast en el siguiente enlace.

Más información

[Xamarin.Forms] Propiedades específicas desde XAML para Windows Desktop y Mobile

Introducción

Xamarin.Forms añade una capa de abstracción sobre la capa de la interfaz de usuario permitiendo definir la misma una única vez siendo válida para todas las plataformas.

Xamarin.Forms
Xamarin.Forms

A pesar de definir la interfaz de usuario una única vez para todas las plataformas, tenemos la posibilidad de realizar personalizaciones y adaptaciones para ofrecer la mejor experiencia posible en cada una de las plataformas soportadas.

La clase Device

La clase Device sin duda alguna es una de las claves a la hora de personalizar la interfaz de usuario por plataforma. Esta clase contiene diversas propiedades y métodos para personalizar la UI y la funcionalidad en base a la plataforma.

La propiedad OS permite identificar la plataforma en la que se ejecuta la aplicación. Puede ser un valor de la enumeración TargetPlatform con uno de los siguientes valores:

  • iOS
  • Android
  • WinPhone (Windows 8 Silverlight)
  • Windows (Windows 8.1, Windows Phone 8.1 y UWP)

Permite de forma sencilla y efectiva personalizar la interfaz o la lógica de la aplicación en base a la plataforma:

if (Device.OS == TargetPlatform.iOS) 
{
    stackLayout.Padding = new Thickness (0, 20, 0, 0);
}

La interfaz de usuario de las aplicaciones Xamarin.Forms podemos definirla en C# o desde código XAML. Desde XAML también podemos realizar personalizaciones en base a la plataforma utilizando el método OnPlatform. Device.OnPlatform es un método que cuenta con uno de los siguientes parámetros opcionales:

  • iOS
  • Android
  • WinPhone
<BoxView 
     WidthRequest="100"
     HorizontalOptions="Center">
  <BoxView.Color>
    <OnPlatform x:TypeArguments="Color"
      iOS="Green"
      Android="#738182"
      WinPhone="Accent" />
  </BoxView.Color>
</BoxView>

Lo visto esta genial pero hay un pequeño detalle que nos puede causar problemas…

¿Qué ocurre si deseamos personalizar la UI desde XAML y dinstinguir entre Windows Phone y Windows?.

La clase OnPlatform no nos facilita la gestión completa. Siempre nos queda la posibilidad de hacer lo necesario desde código C# pero aspectos directamente relacionados con la UI sería fantástico poder llevarlo a cabo desde la propia UI o lo que es lo mismo desde código XAML.

CustomOnPlatform

Aquí es donde entra en juego un pequeños helper creado en código C#:

public sealed class CustomOnPlatform<T>
{
     public CustomOnPlatform()
     {
         Android = default(T);
         iOS = default(T);
         WinPhone = default(T);
         Windows = default(T);
     }

     public T Android { get; set; }

     public T iOS { get; set; }

     public T WinPhone { get; set; }

     public T Windows { get; set; }

     public T Other { get; set; }

     public static implicit operator T(CustomOnPlatform<T> onPlatform)
     {
         switch (Xamarin.Forms.Device.OS)
         {
             case Xamarin.Forms.TargetPlatform.Android:
                 return onPlatform.Android;
             case Xamarin.Forms.TargetPlatform.iOS:
                 return onPlatform.iOS;
             case Xamarin.Forms.TargetPlatform.WinPhone:
                 return onPlatform.WinPhone;
             case Xamarin.Forms.TargetPlatform.Windows:
                 if (Xamarin.Forms.Device.Idiom == Xamarin.Forms.TargetIdiom.Desktop)
                     return onPlatform.Windows;
                 else
                     return onPlatform.WinPhone;
         }
     }
}

Sencillo. Utilizamos la propiedad OS de la clase Device para determinar la plataforma en la que estamos. En el caso de Windows, dado que nos indica el mismo valor en UWP (tanto si estamos en el Desktop como Mobile) hacemos uso combinado con la propiedad Idiom.

La propiedad Idiom tiene como objetivo fundamental determinar si la aplicación se ejecuta en teléfono, tableta o escritorio. Puede contener unos de los siguientes valores de la enumeración TargetIdiom:

  • Desktop: Detecta aplicación UWP en Windows 10.
  • Phone: La aplicación corre en iPhone, iPod Touch, móvil Android o Windows Phone.
  • Tablet: iPad, tableta Android o Windows 8.1.

De esta forma, además de detectar cuando se ejecuta en iOS y Android, podremos detectar cuando se ejecuta en Windows Phone y en Windows (UWP) tanto en escritorio como móvil.

Para usar el helper desde XAML, definimos el namespace:

xmlns:helpers="clr-namespace:CustomOnPlatform.Helpers;assembly=CustomOnPlatform"

Y lo usamos tal y como usaríamos OnPlatform:

<BoxView 
     HorizontalOptions="Center"
     VerticalOptions="Center"
     HeightRequest="100"
      WidthRequest="100">
     <BoxView.BackgroundColor>
         <helpers:CustomOnPlatform  
             x:TypeArguments="Color"
             Android="Red"
             iOS="Blue"
             WinPhone="Yellow"            
             Windows="Green"/>
     </BoxView.BackgroundColor>
</BoxView>

El resultado de la ejecución anterior es, cuadrado rojo en Android, azul en iOS, amarillo en Windows Phone (Silverlight) y Windows Mobile (UWP) siendo por último, verde en Windows escritorio.

Tenéis el código fuente del ejemplo utilizado disponible en GitHub:

Ver GitHub

Recuerda, cualquier tipo de duda o sugerencia es bienvenida en los comentario del artículo.

Más información

[Material] Microsoft Tech Summit

El evento

El pasado 05 y 06 de Octubre, en el Palacio Municial de Congresos de Madrid tenía lugar el Microsoft tech Summit 2016, un evento donde se daban cita clientes, partners y desarrolladores de tecnologías Microsoft.

Microsoft Tech Summit
Microsoft Tech Summit

Con 10 Tracks organizados en diferentes categorías, varias deceneas de sesiones, un par de talleres y cientos de asistentes, un gran evento donde volver a ver a grandes amigos, conocer a otros nuevos, compartir y aprender mucho.

A continuación, una pequeña galería con algunos momentos del evento:

El material

Pude participar en el evento con una sesión en el track de Mobile Apps & Cross-Platform junto a un taller.

En la sesión me centré en dar a conocer todas las implicaciones y conceptos necesarios para desarrollar una aplicación UWP para Xbox One. Aspectos como la gestión del Gamepad, sonido o la adaptación a TV además de cómo adaptar la UI, sacar partido con efectos visuales y elementos 3D.

App UWP para Xbox One
App UWP para Xbox One

La presentación utilizada la tenéis disponible a continuación:

En cuanto a las demos técnicas realizadas, las tenéis disponible en GitHub:

Ver GitHub

Además de la sesión, por la tarde, disfrutamos de un divertido taller de 2,5h sobre Xamarin.

Realizamos paso a paso desde cero una aplicación meteorológica realizada con Xamarin.Forms y utilizando MVVM. Muy divertido!

Me gustaría terminar agradeciendo a Microsoft, sponsors, ponentes y asistentes por hacer el posible el evento. Ante la cantidad y calidad de sesiones, el networking, sorpresas, concursos y grandes momentos, no puedo terminar de otra forma que no sea…

¿Para cuándo el próximo?

Más información